템플릿으로 페이지 ID 가져 오기


19

특정 템플릿이있는 페이지의 ID를 얻을 수 있는지 알고 싶습니다. "page-special.php"에 할당 된 페이지의 ID를 얻을 수 있습니까?

답변:


39

페이지가 작성되면 해당 페이지에 지정된 템플리트가 사용자 정의 필드와 같은 방식으로 사용자 정의 게시물 메타로 저장됩니다. 는 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가 필요하면 as 및 'ids fields ' 값 을 사용 하고 get_posts전달하십시오 . 이렇게하면 주어진 페이지에 대해 모든 게시물이 아닌 db의 게시물 ID 열만 반환하므로 훨씬 빠르고 최적화 된 쿼리를 보장합니다.pagepost_typeas

( 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>';

고마워 너무 "무겁지"않습니까? (모든 페이지를 통해 실행)
user3800799 8

보유한 페이지 수에 따라 다릅니다. 실제로이 데이터를 검색하는 데 더 빠른 기본 방법은 없습니다. 만약 당신이 많은 페이지를 가지고 있다면, 나는 당신이 그 데이터를 저장하고 새로운 페이지가 출판 될 때 일시적인 것을 플러시 / 삭제하기 위해 일시적인을 사용하는 것이 좋습니다
Pieter Goosen

기뻐요, 기꺼이 도와 드리겠습니다. 즐기십시오 :-)
피터 구센 :

만, 아무것도 ID를 얻기에 관심이 있다면 @ user3800799 나는 게시물을 업데이트 한
피터 구센

데이터베이스를 너무 많이 쿼리하지 않으려면 set_transient( codex.wordpress.org/Transients_API )를 사용할 수도 있습니다 .
크리스 앤더슨

2

페이지 템플릿이 하위 폴더, 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'
));

위의 코드는 하위 페이지도 표시합니다.

감사


0

다음은 필요한 경우 언어를 고려한 약간 더 명료 한 스크립트입니다. 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

다음은 WPML 및 Polylang과 함께 작동하는 완전한 기능입니다. https://github.com/cyrale/의 크레딧

/**
* Search for a page with a particular template.
*
* @param string $template Template filename.
* @param array  $args     (Optional) See also get_posts() for example parameter usage.
* @param bool   $single   (Optional) Whether to return a single value.
*
* @return Will be an array of WP_Post if $single is false. Will be a WP_Post object if the page is find, FALSE otherwise
*/
if (!function_exists('get_page_by_template')) {
    function get_page_by_template($template, $args = array(), $single = true) {
        $pages_by_template = wp_cache_get('pages_by_template', 'cyrale');
        if (empty($pages_by_template) || !is_array($pages_by_template)) {
            $pages_by_template = array();
        }
        if (!isset($pages_by_template[$template])) {
            $args = wp_parse_args(array(
                'posts_per_page' => -1,
                'post_type'      => 'page',
                'suppress_filters'  => 0,
                'meta_query'     => array(
                    array(
                        'key'   => '_wp_page_template',
                        'value' => $template,
                    ),
                ),
            ), $args);
            $pages = get_posts($args);
            $pages_by_template[$template]= array(
                'single' => !empty($pages) && is_array($pages) ? reset($pages) : false,
                'pages'  => $pages,
            );
        }
        wp_cache_set('pages_by_template', $pages_by_template, 'cyrale');
        return $pages_by_template[$template][$single ? 'single' : 'pages'];
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.