質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

Q&A

解決済

1回答

1339閲覧

WordPressのループ処理の中にショートコードの引数の値を使って記事を出力させたい

aguu0101

総合スコア16

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

0グッド

0クリップ

投稿2019/05/08 05:44

編集2019/05/08 06:59

前提・実現したいこと

ワードプレスのショートコードの引数をループの処理に使って特定のカテゴリや新着記事等を出力させたいです。

発生している問題・理解できていないこと

該当のソースコードをみていただければ早いかと思いますが、

print_number()の関数内で作成した変数を関数外で使用することができれば問題は解決すると思っているのですが、
global宣言しても解決できず。。

どこに問題があるのかわからずご質問しました。

該当のソースコード

categoryphp

1<?php 2 // 未定義の関数を初期化 3 $title = null; 4 $number = null; 5 $category = null; 6 7 // ショートコードの引数を設定して変数に代入→配列で出力 8 function print_number($atts){ 9 $atts = shortcode_atts(array( 10 "title" => タイトル, 11 "number" => 5, 12 "category" => カテゴリ名 13 ),$atts); 14 15 $atts['title'] = $title; 16 $atts['number'] = $nubmer; 17 $atts['category'] = $category; 18 19 return array($title,$number,$category); 20 } 21 add_shortcode('file_include','print_number'); 22 23 // ループ処理の設定(配列の変数を取得してループ処理に追加 24 $news_query = new WP_Query( 25 array( 26 'post_type' => 'post', 27 'category_name' => $category, 28 'posts_per_page' => $number, 29 ) 30 ); 31?> 32<div class="space_wrapper"> 33 <div class="space_ttl"> 34 <p> 35 36 </p> 37 </div> 38 <ul> 39 <?php if ( $news_query->have_posts() ) : ?> 40 <?php while ( $news_query->have_posts() ) : ?> 41 <?php $news_query->the_post(); ?> 42 <li> 43 <a href=""> 44 <div class="space_cat_inner"> 45 <div class="space_cat_thumb"> 46 <img src="#" alt="サンプル画像"> 47 </div> 48 <div class="space_cat_meta"> 49 <h2 class="post-list-title entry-title"> 50 ここにタイトルが入ります。ここにタイトルが入ります。ここにタイトルが入ります。ここにタイトルが入ります。 51 </h2> 52 </div> 53 </div> 54 </a> 55 </li> 56 <?php endwhile; ?> 57 <?php endif; ?> 58 <?php wp_reset_postdata(); ?> 59 </ul> 60</div>

試したこと

先述の通り、変数をglobal宣言してみましたが何も出力せず。。
エラー等も出ていないので、どこから着手すればいいかわからずじまいになっています。

補足情報

・WordPressのバージョン WordPress 5.1.1
・使用しているブラウザ GoogleChrome
・PHPバージョン 7.0
・使用サーバー mixhost

追記情報

ショートコードを書き忘れていたので追加します。。。

[file_include file='category' title='タイトル' number='2' category='test']

またショートコードは投稿でも固定ページにも両方使います。

追記情報その2

ディレクトリ構造とショートコードについて補足いたします。

plugins(プラグイン名) ┗functions.php ┗template ┗category.php

今回のショートコードは問題のショートコードとは別に
「プラグイン内のphpファイルを呼び出すための引数」も設定しています。

file='category'

ショートコードの上記の記述はそのための記述なので、問題とは関係がないかと。。
また、phpファイルを呼び出す引数の設定は、functions.phpに記載しています。

functionsphp

1function space_article($params = array()) { 2 extract(shortcode_atts(array('file' => 'default'), $params)); 3 ob_start(); 4 include(plugin_dir_path( __FILE__ ) . "templates/$file.php"); 5 return ob_get_clean(); 6} 7add_shortcode('file_include', 'space_article');

関係はないと思いますが一応載せておきます。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2019/05/08 05:50 編集

ショートコードは、どこに書かれているのでしょうか? 投稿の本文?  phpファイルに直接?  その他?
aguu0101

2019/05/08 05:52

ご連絡ありがとうございます! 追記の情報に追加させていただきましたのでご確認していただけると嬉しいです。
CHERRY

2019/05/08 05:55

ショートコードは、通常、 the_content() が実行されたタイミングで、ショートコードの実行がされますが、 質問に記載されたコードでは、 the_content() が使われていないようですが... どこか省略されていたりしますか?
aguu0101

2019/05/08 07:04

ご回答ありがとうございます。 追記の情報にもご連絡させていただきましたが、該当のファイル(category.php)をショートコードの引数で呼び出して使いますのでthe_content()は必要ないかと思うのですが間違ってますでしょうか??
guest

回答1

0

ベストアンサー

なにをしようとしているのか把握できていませんが、コードを眺めて、いくつか気になった点を指摘しておきます。


add_shortcode('file_include','print_number'); add_shortcode('file_include', 'space_article');

質問に記載されているコードでは、同じ名前のショートコードを add_shortcode() している部分が2つありますが、同じショートコード名で、別の処理を定義しているのでしょうか?

add_shortcode

各ショートコードには、ひとつだけフックを定義することができます。そのため、他のプラグインが同じショートコードを持っていると、他のプラグインによってフックが上書きされるか、または他のプラグインのフックを上書きしてしまいます。どちらになるかは、プラグインの読み込み順または実行の順番に左右されます。

と記載されている通り、1つの WordPress 上では、WordPress core やプラグインやテーマで、同じショートコードの名前に2つ(以上)の内容を定義することはできません。


function print_number($atts){
(略)
return array($title,$number,$category);
}
add_shortcode('file_include','print_number');

(変数が未定義なので、Notice: Undefined variable ... がでるという問題は置いておいて... )

ショートコードの結果を配列で返していますが、WordPress が期待する do_shortcode を実行した返り値は、コンテンツのショートコードを実行した結果に置き換えた結果の「文字列」です。

質問のコードだと下記のような配列を変数に代入する

function arr(){ return array(1, 2, 3); } $a = ''; $a = arr(); echo $a; // 'Array'が表示される

の様な処理になるので、配列で返された場合は、文字列 Array が返されて、Notice: Array to string conversion in ... のメッセージが出力されるような気がします。(未確認)


add_shortcode() は、ショートコードの内容を定義するだけですので、 do_shortcode() が実行されない限りショートコードは、実行された結果を返しませんが、どこで実行されていますか?

通常のテーマで、 do_shortcode() を記載していない状態でも本文に記載したショートコードが実行されるのは、本文を表示する処理である the_content() の中で、the_content フックを利用して、do_shortcode() が、呼び出されて実行されているので、本文表示時にショートコードは、実行結果に置き換えて表示されます。( do_shortcode 参照 )

投稿2019/05/08 08:04

編集2019/05/08 08:06
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aguu0101

2019/05/09 05:24

ご指摘ありがとうございます! 伝わるかどうかはわかりませんが、やりたいこととしては 「プラグイン内にあるファイルをショートコードで呼び出して、且つ同じショートコードで記事のカテゴリや 表示記事数を設定し、その設定したカテゴリや表示記事数に応じて記事を表示させたいです。」 add_shortcode() に複数の定義を設定してはいけないということは上記のやりたいことを実現することは不可能なのでしょうか? また、do_shortcode()の件で同じ質問なのですが、投稿や固定ページにショートコード(例えば、[file_include file='category' title='タイトル' number='2' category='test'])を記述するだけでは意味がないのでしょうか? このファイルは全てプラグインとして作成しているのですが、基本的にどのテーマテンプレートにもthe_content()の記述がある認識で作成しています。。 この認識はそもそも間違っているということなのでしょうか? 重ね重ね質問等が多く大変恐縮ではございますがご教示いただけますと幸いでございます。
CHERRY

2019/05/09 09:40 編集

質問の中にある functions.php や category.php というファイルは、テーマの中にあるファイルと思って回答していたのですが、自作プラグインの中にあるのファイルでしょうか? ---- まだ、イマイチ理解できていませんが... > 「プラグイン内にあるファイルをショートコードで呼び出して、且つ同じショートコードで記事のカテゴリや 表示記事数を設定し、その設定したカテゴリや表示記事数に応じて記事を表示させたいです。」 「プラグイン内にあるファイル」というのがよくわかりませんが、表示用のテンプレートという意味であれば、ショートコードから複数の値を return する必要はないように思えますが... たとえば、 [shortcodename templatefile="template1" category="cagegory1" posts_per_page=”20″] のようなショートコードで呼び出だされた場合、ショートコードの function の中で、 1. ショートコードで与えられたパラメータから検索条件を抽出。 2. template file を読み込む 3. 検索条件を設定して、 get_posts() や WP_Query で投稿を取得 4. テンプレートに取得した投稿のデータを埋め込む 5. 完成した HTML を return する という処理でよいと思うのですが... ここまで書いてから気が付きましたが、Display Posts Shortcode プラグイン( https://ja.wordpress.org/plugins/display-posts-shortcode/https://github.com/billerickson/display-posts-shortcode ) のテンプレートが変更できるバージョンを作成したいという感じでしょうか?
aguu0101

2019/06/03 10:07

ご連絡遅くなり申し訳ございません!! 取り急ぎご報告ですが実装したい機能を実装することができました! ご協力いただきありがとうございます。 色々勘違いしてしまい、CHERRYさんのヒントを元に もう一度一からやり直して以下をfunctions.phpに記載し ショートコードで呼び出すことでできました。 //ショートコードで記事一覧を表示させる function print_post($atts){ $retHTML=''; $args = array( 'posts_per_page' => $atts['count'], 'orderby' => 'date', 'order' => 'DESC', 'post_type' => 'post', 'category' => $atts['category'], 'include' => $atts['id'], ); global $post; $myposts = get_posts($args); foreach($myposts as $post): setup_postdata($post); $retHTML.='<li><a href="'.get_permalink().'">'.'<div class="space_thumb">'.get_the_post_thumbnail('',array(640,360)).'</div>'; $retHTML.='<div class="space_title"><span class="space_icon">'.get_the_date('Y.n.j').'</span><p>'.the_title("","",false).'</p></div>'.'</a></li>'; endforeach; wp_reset_postdata(); return '<div id="spaceArticle"><p>'.$atts['name'].'</p><ul id="spaceList">'.$retHTML.'</ul></div>'; } add_shortcode('space','print_post'); ===================================== ここまで書いてから気が付きましたが、Display Posts Shortcode プラグイン( https://ja.wordpress.org/plugins/display-posts-shortcode/https://github.com/billerickson/display-posts-shortcode ) のテンプレートが変更できるバージョンを作成したいという感じでしょうか? ===================================== また上記ですが、全くその通りです。。 ここまで項目は多くなくて カテゴリ、タグ、記事ID、表示記事数 くらいを設定することができれば大丈夫ですが。。 重ね重ねではございますが、今回がご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問