サポート » プラグイン » WordPress Popular Postsのpost_htmlにカスタムフィールドを出力する

  • 解決済 Replicocko

    (@replicocko)


    内容的にはPHPコードの書き方になりますが、プラグインを用いての事ですのでこちらにトピックを作成しました。

    掲題の通り、WordPress Popular Postsプラグインのwpp_get_mostpopularにて出力を行っています。
    この配列post_htmlでカスタムフィールドの値を表示させたいのですが、PHPコードの書き方が正しくないようで表示が行えません。

    現在の記述は下記の通りです。

    <?php if (function_exists('wpp_get_mostpopular')): ?>
    	<?php
    		$args = array(
    			'limit' => 5,
    			'range' => 'all',
    			'order_by' => 'views',
    			'post_type' => 'post',
    			'post_html' => '<div><span><?php $key="AAA"; echo get_post_meta($post->ID, "AAA", true); ?></span></div>'
    		);
    	wpp_get_mostpopular($args);
    	?>
    <?php endif; ?>

    ご教授をお願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • post_htmlのところの<?phpとかechoとかは必要ないと思います。

    <?php if (function_exists('wpp_get_mostpopular')): ?>
    	<?php
    		$args = array(
    			'limit' => 5,
    			'range' => 'all',
    			'order_by' => 'views',
    			'post_type' => 'post',
    			'post_html' => '<div><span>'.$key="AAA".get_post_meta($post->ID, "AAA", true).'</span></div>'
    		);
    	wpp_get_mostpopular($args);
    	?>
    <?php endif; ?>

    こんな感じでどうでしょうかねぇ・・・

    トピック投稿者 Replicocko

    (@replicocko)

    不要な文字列の出力がなくなりましたが、AAAというキーそのものが出力されてしまいます。

    その$keyを関数の中のAAA指定している部分に入れるか、
    消してみたら良いと思います$key=”AAA”

    'post_html' => '<div><span>'.get_post_meta($post->ID, "AAA", true).'</span></div>'

    その投稿IDにカスタムフィールドAAAが入力されてたら正常に動くはずです。
    ところでカスタムフィールドのキーは本当にAAAですか?

    トピック投稿者 Replicocko

    (@replicocko)

    AAAというのは例として挙げています。実際はtimeがキーに設定されており、値には数字が入力されています。

    ご教授頂いた方法ですとAAAという文字列の出力はなくなりましたが、値の出力がされず、空の状態で表示されてしまいます。

    掲題以外の部分では値が正しく出力されていますので、もしかしたらループの書き方の問題なのでしょうか。

    'post_html' => '<div><span>'.$key="AAA".get_post_meta($post->ID, "AAA", true).'</span></div>'

    この行で参照している $post が何を指しているか不明なので、どんなに書き換えても、get_post_meta() からは何も返ってきません。ID がなくてもエラーにはならないので、ちょっとわかりにくいかもしれませんが、試しに

    get_post_meta(null, "AAA", true);

    を実行してみると、理解できると思います。現在は、この状態です(たぶん)。

    Replicocko さんの意図が、wpp_get_mostpopular() が返す投稿の ID をここで使いたいということなら、残念ですが、どんなに工夫しても実現できません。関数が返す値を引数で参照することはできないからです。

    また、wpp_get_mostpopular() は、ショートコードを実行して echo するだけなので、実は、各投稿の ID をデータとして持っていません。だから、もっと前の段階に遡らなければならないのですが、バージョンによってカスタマイズの仕方がかわります。3.x をお使いになっている、と仮定しておきます。

    現在の WordPress Popular Posts には、データを扱う部分それぞれにフィルタ・フックを提供するという形で、ユーザがカスタマイズできるようになっています。その中で、今回の場合、候補になりそうなのは、3 つあります。() 内は関数で使える引数です。

    1. wpp_query_posts ($result, $instance) 【_query_posts 関数内で実行】
    2. wpp_custom_html ($mostpopular, $instance) 【__get_popular_posts関数内で実行】
    3. wpp_post ($content, $p, $instance) 【__render_popular_posts関数内で実行】

    上から順番に実行されます。wpp_query_posts フィルタの引数、$result には wpdb::get_results() の結果がそのまま入っています。デフォルトではオブジェクトの配列です。$instance は、ショートコードやテンプレートタグで指定された引数が連想配列の形で保存されています。

    wpp_custom_html フィルタの引数、$mostpopular には、_query_posts() からの戻り値が入っています。上の $result と同じものを参照しています。$instance は上と同じです。

    wpp_post フィルタの引数、$content は、表示用に整形された文字列、$p は、上の $mostpopular をループで回して得たオブジェクトを参照しています。$instance は上と同じです。

    さて、投稿の ID を得る手段ですが、$mostpopular を使う場合は、

    foreach ($mostpopular as $post) {
        $post->id
    }

    wpp_post フィルタの中では、

    $p->id

    となります。これらを、get_post_meta() の引数に指定すれば Replicocko さんの意図したデータを得ることができます。

    現実的には、wpp_post フィルタを使って、引数 $content の中身を書き換えるというのが最適ではないかと思います。Hector が GitHub で公開しているドキュメント

    3. Filters

    にサンプルがありますので、(少しだけ)役立ちます。ただ、新たな要素を追加するというのは、Hector の予想していない書き換えなので、ちょっと長いコードになるかもしれません。

    トピック投稿者 Replicocko

    (@replicocko)

    なるほど。おっしゃっている事の意味は理解できましたが、私の技術力ではどうしようもないレベルですね。
    ご教授いただいた部分を中心的に、勉強を重ねながら実装に向けてカスタマイズしていこうと思います。

    ご丁寧にありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「WordPress Popular Postsのpost_htmlにカスタムフィールドを出力する」には新たに返信することはできません。