• 解決済 heppoko

    (@heppoko)


    カスタムメニューに登録した投稿記事のサムネイルとタイトル、
    そして記事の抜粋文を表示させることは出来ないのかと思い、
    何とか行き着いたものが、下記ソースをfunctions.phpに記載することで、
    画像とタイトルは表示させることが出来ました。

    しかしどうしても解決出来ないことがあり、投稿させていただきました。

    よくある画像の横にタイトルと抜粋文という構成にしたいと思っているのですが、
    抜粋文がどうしても表示できないのです。

    「$item_output .= get_the_post_thumbnail~」のように追記するのか、
    「$item_output .= $args->link_before . apply_filters( ‘the_title’~」のようにするのか。

    あれこれ試してみたのですがいずれも表示できず。
    ちなみに、カスタムメニューに追加した際に表示される「説明」の表示は実現できました。
    しかし希望は記事の抜粋文なのです。

    class Walker_Nav_Menu_Test extends Walker_Nav_Menu {
      function start_el(&$output, $item, $depth, $args) {
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
    
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;
    
        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
        $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
    
        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
    
        $output .= $indent . '<li' . $id . $class_names . '>';
    
        $atts = array();
        $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
        $atts['target'] = ! empty( $item->target )     ? $item->target     : '';
        $atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
        $atts['href']   = ! empty( $item->url )        ? $item->url        : '';
    
        $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );
    
        $attributes = '';
        foreach ( $atts as $attr => $value ) {
          if ( ! empty( $value ) ) {
              $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
              $attributes .= ' ' . $attr . '="' . $value . '"';
          }
        }
    
        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= get_the_post_thumbnail($item->object_id, '', array('alt' => $item->title));
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= $args->after;
    
        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
        }
    }

    これで出力されるのが下記になります。

    <a href="XXXX">
    <img src="http://~/wp-content/uploads/2015/08/IMG_6694a.jpg" class="attachment-120x80 wp-post-image" alt="XXXXX />
    ●●●●●●(記事タイトル)
    </a>

    どうかご教授いただければ幸いです。
    よろしくお願いいたします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • $item_outputの部分だけ抜粋しますが、以下のようにしたら引っ張ってこれないでしょうか。

    $item_output = $args->before;
    $item_output .= '<a'. $attributes .'>';
    $item_output .= get_the_post_thumbnail($item->object_id, '', array('alt' => $item->title));
    $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
    $item_output .= '<p>' . get_post_field( 'post_excerpt', $item->object_id, 'display' ) . '</p>';
    $item_output .= $args->after;

    ただ、get_post_field()はpostの全部の情報を取得するからパフォーマンス上のメリットはないとCodexには書かれています。
    https://wpdocs.osdn.jp/関数リファレンス/get_post_field

    トピック投稿者 heppoko

    (@heppoko)

    ikaring様
    ご回答ありがとうございました。
    早速試したところ、だめでした(涙
    「post_excerpt」を「post_title」にして試したところ、記事タイトルは表示されました。
    「post_excerpt」が何か違うのかと思って調べてみたのですが情報がどこにもなく。

    コーデックスにも、

    「有効な値は次のとおりです:
    post_content
    post_author
    post_title
    post_name (=slug)
    他に *_posts テーブルのフィールドを指定できます。 」

    としか書かれておらず。

    もう少し模索して、だめそうなら説明をしようと思います。
    重ね重ねありがとうございました。

    だめですか。
    抜粋文はカスタムフィールドとかではなく、投稿ページにあるデフォルトの抜粋欄に入力されていますよね?

    トピック投稿者 heppoko

    (@heppoko)

    あ…なるほど、それが原因ですね。
    しかも自分の質問の仕方が悪かったことも判明しました。

    抜粋欄にあるものを出力するのではなく、投稿記事の先頭のテキストを自動で引っ張ってくる抜粋のことを言っておりました。
    その形式であれば、カスタムメニュー内の「説明」を出力するのと同様になりますので。

    全くもって申し訳ありません。

    なるほど。
    ちょっともっといい書き方があるかもですが、一応次のようにして表示できました。

    $text = get_post_field( 'post_content', $item->object_id, 'display' );
    		/*** ショートコード除去 ***/
    		$text = strip_shortcodes( $text );
    		$text = apply_filters('the_content', $text);
    		$text = str_replace(']]>', ']]>', $text);
    
    		/*** 文字数指定 ***/
    		$excerpt_length = 30;
    
    		/*** 末尾文字列指定 ***/
    		$excerpt_more = '...';
    
    		$excerpt = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    
        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= get_the_post_thumbnail($item->object_id, '', array('alt' => $item->title));
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '<p>' . $excerpt . '</p>';
        $item_output .= $args->after;

    ちなみにTwentySixteenでは、start_elのところの引数を下記のようにしないとエラーが出ました。
    function start_el(&$output, $item, $depth = 0, $args = Array(), $id = 0) {

    トピック投稿者 heppoko

    (@heppoko)

    度重なるご回答に感謝いたします。

    問題なく記事内先頭のテキストが表示されました。
    しかも文字数設定のことまでご考慮いただけてとても助かりました。

    今回のことで、管理画面内の抜粋欄のものを出力できることも分かってとても勉強になりました。
    重ね重ねありがとうございました。

    トピック投稿者 heppoko

    (@heppoko)

    閉じるのを忘れておりました。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「カスタムメニューを使って抜粋文を表示させたい」には新たに返信することはできません。