サポート » テーマ » wp_list_pagesでカスタムフィールドの値を入れたい。

  • 解決済 yamaguchi1432

    (@yamaguchi1432)


    現在、グローバルメニューをwp_list_pagesで作成しているのですが、リンク先のページで設定したカスタムフィールドの画像を出したいです。

    ですが、wp_list_pagesにはカスタムフィールドで絞り込むことは可能ですが、出力することが出来ないようです。
    もし、やり方があるのであればご教授お願いいたします。

    また、wp_list_pagesではなく、get_pagesでも作成したのですが、今度は子ページの階層化ができなくなってしまします。

    wp_list_pagesまたはget_pagesで子ページの階層化ができていて、且つページで設定した画像を出す方法があればご教授お願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • ほかにもの同様に思った人がいると思うので、フォーラムを丹念調べれば出てくるんだと思います。
    フォーラムの検索はちょっと便利じゃないような気もしますが。
    advancedcutomfieldというプラグインで指定した画像をメニューに出すとか何とかがあったような。

    本来であれば、argsのwalkerで希望の出力をするプログラムをしたクラスのインスタンスを指定するのかなと思います。
    クラスリファレンス/Walker

    WordPressで、カスタムメニューの表示内容を変更する方法

    WordPress wp_list_pages() でカスタムフィールドの値を表示する

    だれか表示する華麗なwalkerつくっていただけないですかね。
    そうすれば new して walker => インスタンスでいけそうなんだけど。

    華麗ではないですが、カスタムウォーカーを作ってみました。
    あとはwp_list_pagesのパラメータでwalkerを指定したら画像を持ってこれるかと。
    ACFのフィールドを持ってくる想定ですが、普通のカスタムフィールドでも少しいじれば大丈夫だと思います。

    <ul>
    <?php wp_list_pages( array(
      'walker' => new My_Walker_Page,
      )); ?>
    </ul>

    カスタムウォーカー
    (functions.phpとかに追加してください。後半のコメントの辺りを変更したらいろいろ調整していただけるかと思います)

    class My_Walker_Page extends Walker_Page {
      public function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) {
        if ( $depth ) {
          $indent = str_repeat( "\t", $depth );
        } else {
          $indent = '';
        }
    
        $css_class = array( 'page_item', 'page-item-' . $page->ID );
    
        if ( isset( $args['pages_with_children'][ $page->ID ] ) ) {
          $css_class[] = 'page_item_has_children';
        }
    
        if ( ! empty( $current_page ) ) {
          $_current_page = get_post( $current_page );
          if ( $_current_page && in_array( $page->ID, $_current_page->ancestors ) ) {
            $css_class[] = 'current_page_ancestor';
          }
          if ( $page->ID == $current_page ) {
            $css_class[] = 'current_page_item';
          } elseif ( $_current_page && $page->ID == $_current_page->post_parent ) {
            $css_class[] = 'current_page_parent';
          }
        } elseif ( $page->ID == get_option('page_for_posts') ) {
          $css_class[] = 'current_page_parent';
        }
    
        $css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) );
    
        if ( '' === $page->post_title ) {
          /* translators: %d: ID of a post */
          $page->post_title = sprintf( __( '#%d (no title)' ), $page->ID );
        }
    
        $args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before'];
        $args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after'];
        
        /* ACFでフィールドpageimgを設定している想定 */
        $image = get_field( 'pageimg', $page->ID );
        $pageimg = empty( $image ) ? '' : sprintf(
          /* 出力用のマークアップ設定 */
          '<div><img src="%s" alt="%s" /></div>',
          $image['url'],
          $image['alt']
        );
        
        $output .= $indent . sprintf(
          '<li class="%s"><a href="%s">%s%s%s%s</a>',
          $css_classes,
          get_permalink( $page->ID ),
          $pageimg,
          $args['link_before'],
          /** This filter is documented in wp-includes/post-template.php */
          apply_filters( 'the_title', $page->post_title, $page->ID ),
          $args['link_after']
        );
    
        if ( ! empty( $args['show_date'] ) ) {
          if ( 'modified' == $args['show_date'] ) {
            $time = $page->post_modified;
          } else {
            $time = $page->post_date;
          }
    
          $date_format = empty( $args['date_format'] ) ? '' : $args['date_format'];
          $output .= " " . mysql2date( $date_format, $time );
        }
      }
    }
    

    サクッとコードが書ける才能が妬ましいw
    どうもありがとうございます。
    スレ主さんも一度試してレスポンスされるといいと思います。

    トピック投稿者 yamaguchi1432

    (@yamaguchi1432)

    oisitさんikaringさん

    ご回答と解説ありがとうございます!

    私は恥ずかしながら「カスタムウォーカー」という機能をはじめて知ったので、まずそこから勉強して実装してみます!
    一旦、お礼だけの回答とせせていただきました。

    実装できたら、また改めてご連絡したいと思います。
    ありがとうございました!

    九割九分コピペ(wp-includes/class-walker-page.php)なので恐縮ですが、カスタムウォーカーは使えるとわりと便利だと思います。
    カスタムメニューの出力を調整したり、galleryショートコードの出力を使用するスライドショープログラムに合わせて変更したりとか、たまに使います。

    トピック投稿者 yamaguchi1432

    (@yamaguchi1432)

    ikaringさんoisitさん

    お二人のお陰で、無事にやりたいことが出来ました!!
    本当にありがとうございます!

    カスタムウォーカー良いですね。
    かゆいところに手が届いた感じです。

    これからもっと勉強して使いこなしたいと思います。

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