web-dev-qa-db-ja.com

テンプレートでページIDを取得

特定のテンプレートを持つページのIDを取得することが可能かどうかを知りたいです。 "page-special.php"に割り当てられているページのIDを取得することは可能ですか?

16
user3800799

ページが作成されると、そのページに割り当てられたテンプレートは、カスタム項目と同じ方法でカスタム投稿メタとして保存されます。 meta_key_wp_page_templateで、meta_valueはページテンプレートになります

指定したテンプレートのget_pagesを持つすべてのページを取得するには、 meta_value を使用するだけです。

$pages = get_pages(array(
    'meta_key' => '_wp_page_template',
    'meta_value' => 'page-special.php'
));
foreach($pages as $page){
    echo $page->ID.'<br />';
}

編集23-07-2015

ページIDだけが必要な場合は、get_postsを使用してからpagepost_typeおよび 'idsasfields`の値として渡します。指定されたページのすべてではなく、db内のpost id列のみが返されるため、これにより、はるかに高速ではるかに最適化されたクエリが保証されます。

PHP 5.4+ が必要)

$args = [
    'post_type' => 'page',
    'fields' => 'ids',
    'nopaging' => true,
    'meta_key' => '_wp_page_template',
    'meta_value' => 'page-special.php'
];
$pages = get_posts( $args );
foreach ( $pages as $page ) 
    echo $page . '</br>';
33
Pieter Goosen

あなたのページテンプレートがサブフォルダ、theme-folder/page-templates/page-template.phpの中にあるなら、あなたは以下の質問をするでしょう:

$page_details = get_pages( array(
 'post_type' => 'page',
 'meta_key' => '_wp_page_template',
 'hierarchical' => 0,
 'meta_value' => 'page-templates/page-template.php'
));

上記のコードはサブページも表示します。

ありがとう

2
Sushil Adhikari

以下は、必要に応じて言語を考慮に入れた、もう少し明確なスクリプトです。 WPMLではなくPolylangの使用を想定していることに注意してください。

function get_post_id_by_template($template,$lang_slug = null){
  global $wpdb;
  $wh = ($lang_slug) ? " AND t.slug = %s" : "";

  $query = $wpdb->prepare(
    "SELECT DISTINCT p.ID
    FROM $wpdb->posts p
    INNER JOIN $wpdb->postmeta meta ON meta.post_id = p.ID
    INNER JOIN $wpdb->term_relationships tr ON meta.post_id = tr.object_id
    INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
    INNER JOIN $wpdb->terms t ON tt.term_id = t.term_id
    WHERE p.post_status = 'publish' AND meta.meta_key = %s AND meta.meta_value = %s" . $wh,
    '_wp_page_template',
    $template,
    $lang_slug
  );

  $ids = $wpdb->get_results($query);

  if($ids && isset($ids[0])){
    $p = $ids[0];
    return $p->ID;
  } else {
    return false;
  }
}// get_post_id_by_template
0
Luca Reghellin