サポート » 使い方全般 » ショートコードでカテゴリとタグを指定し、記事一覧を表示したい

  • 解決済 Rena0404

    (@rena0404)


    ホームページ作成初心者です。

    投稿ページにphpを書き込み、プラグインを使って動かしています。しかし、そのようなやり方だとセキュリティー面で危険との指摘を受けました。

    下記のようなphpをショートコードでで出力できるように置きかえたいのですが、どなたかご教示ください。

    <?php
    $newslist = get_posts( array(
        'category_name' => '北海道',
        'tag_slug__in' => array('スワンファーショール'),
        'posts_per_page' => -1,
        'order' => 'ASC',
        'orderby' => 'title' ));
    	foreach( $newslist as $post ):
    	setup_postdata( $post );?>
    	<?php echo '
    <li><a href="' . get_permalink() . '">' . get_the_content() . '</a></li>
    '; ?>
    <?php
      endforeach;
      wp_reset_postdata();?>
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター jim912

    (@jim912)

    ショートコードの作成方法は、CODEX の ショートコードAPIに詳しく書かれていますので、そちらを参照してください。

    古い記事ですが、WordPressのショートコードを自作してみる | webOpixelでは、分かりやすく記述されていますので、合わせて読んでいただくと良いかと思います。

    最大の違いは、ショートコード内では、echo で出力を行わず、表示する文字列を作成し、return しなければならない点です。
    それ以外は、概ね上記のコードを活かせるはずです。

    jim912様

    ご教示ありがとうございます。リンクを貼っていただいたページや他のページを参考にしつつショートコードを作成してみました。

    希望通りのリストを出力できたのですが、また問題が発生しました。リストがページの上部に表示されます。ショートコードの出力内容は文中に表示したいので、こちらを参照し、書き換えてみたのですが、解消されないままです。

    何が問題なのか教えていただけないでしょうか。

    function getCatItems($atts, $content = null) {
     extract(shortcode_atts(array(
     "num" => '',
     "cat" => '',
     "tag" => '',
     ), $atts));
     global $post;
     $oldpost = $post;
     $myposts = get_posts('numberposts='.$num.'&order=ASC&orderby=title&category='.$cat.'&tag_id='.$tag);
     $html = '';
     foreach($myposts as $post) :
     setup_postdata($post);
     $html.='<li><a href="'.get_permalink().'">'.the_content("","",false).'</a></li>';
     endforeach;
     return $html;
    }
    add_shortcode("list", "getCatItems");
    
    [list cat="" tag="" num="-1"]
    モデレーター jim912

    (@jim912)

    もう一息ですね。

    the_content関数は、実行された時点で出力してしまいますので、まずここを get_the_content 関数に置き換えます。

    ただし、CODEXに表示されているように、get_the_content 関数は the_content フィルターを通らないため、改行が付加されなかったり、ショートコードの展開が行われません。

    これを通すために

    apply_filters( 'the_content', get_the_content() );

    として、手動で the_content フィルターを通すようにしてください。

    jim912様

    ご回答ありがとうございます。

    手動で the_content フィルターを通す

    とはどのような意味なのでしょうか。

    apply_filtersについて調べてみたのですが、語記事が少なく

    apply_filters( ‘the_content’, get_the_content() );

    をどこに記載すればいいかわかりませんでした。

    モデレーター jim912

    (@jim912)

    フィルターフックについての理解は、

    WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック

    apply_filters については、


    WordPressのadd_filterとapply_filtersのまとめ

    あたりが分かりやすいと思います。

    上記の参考記事で、ちょうど the_content 関数のコードを例に説明されていますが、この関数は、

    1. get_the_content 関数を用いて、記事の本文を取得し、$content に格納する
    2. apply_filters 関数で、$content に対して、the_content フィルターの適用を行う
    3. ]]>の置換処理を行う
    4. echo で本文の出力を行う

    となっています。

    apply_filters( 'the_content', get_the_content() );

    は、the_content 関数内部の処理の1と2 を同時に行っている処理ですので、この記述は

    the_content("","",false)

    の部分をそっくり置き換えてください。

    無事動くようになりました。
    手鳥足取り、詳しく教えていただきありがとうございました。

    完成したコードはこちらです。

    function getCatItems($atts, $content = null) {
    extract(shortcode_atts(array(
    “num” => ”,
    “cat” => ”,
    “tag” => ”,
    ), $atts));
    global $post;
    $oldpost = $post;
    $myposts = get_posts(‘numberposts=’.$num.’&order=ASC&orderby=title&category=’.$cat.’&tag_id=’.$tag);
    $retHtml=’

    ‘;
    $post = $oldpost;
    return $retHtml;
    }
    add_shortcode(“list”, “getCatItems”);

    [list cat=”” tag=”” num=”-1″]

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「ショートコードでカテゴリとタグを指定し、記事一覧を表示したい」には新たに返信することはできません。