web-dev-qa-db-ja.com

特定のテンプレートを使用するページの一覧表示

次のヘッダを付けたproduct.phpという名前のテンプレートを作成しました。

<?php
/*
Template Name: Product Page
*/

「商品ページ」テンプレートを使用するすべてのページをサイドバーに一覧表示する方法を教えてください。

私はwp_list_pages()関数のドキュメントを読んでみましたが、使用されているテンプレートではなく、post_typeでフィルタリングを一覧表示することしかできないようでした。

4
João Paulin

WP_Querymeta_query でこれを行うことができます。ページテンプレートのファイル名は、キー_wp_page_templateの下のpost metaに保存されています。

$args = array(
    'post_type' => 'page',
    'posts_per_page' => -1,
    'meta_query' => array(
        array(
            'key' => '_wp_page_template',
            'value' => 'product.php'
        )
    )
);
$the_pages = new WP_Query( $args );

if( $the_pages->have_posts() ){
    while( $the_pages->have_posts() ){
        $the_pages->the_post();
        the_title();
    }
}
wp_reset_postdata();
2
Milo

ページテンプレートは、キー'_wp_page_template'を持つメタフィールドを介して設定されます。このメタフィールドの値はテンプレートファイルの phpフルファイル名 です。

'page-products.php'

そのため、get_pagesからmeta_keyおよびmeta_valueパラメータを使用して(またはWP_Query引数とともに'meta_query'を使用して)特定のテンプレートを含むページを簡単に取得するためのカスタム関数を作成できます。

get_pages_by_template( $template = '', $args = array() ) {
  if ( empty($template) ) return false;
  if ( strpos($template, '.php') !== (strlen($template) - 4) )  $template .= '.php';
  $args['meta_key'] = '_wp_page_template';
  $args['meta_value'] = $template;
  return get_pages($args);
}

この関数は最初の(必須の)引数としてテンプレートを受け入れ、2番目の(オプションの)引数として get_pages のすべての引数を受け入れます。

テンプレートは '.php'拡張子の有無にかかわらず渡すことができます。

$pages = get_pages_by_template('page-products');

または

$pages = get_pages_by_template('page-products.php');

その後、必要に応じて取得したページを使用できます。それらをループしてマークアップを出力したり、関数を使用するカスタムウィジェットを作成したりするなどです。

1
gmazzap