รับ id หน้าโดยแม่แบบ


19

ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะได้รับ ID หน้าด้วยเทมเพลตเฉพาะ เป็นไปได้ไหมที่จะได้รับ ID ของหน้าที่กำหนดให้กับ "page-special.php"?

คำตอบ:


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

หากหนึ่งเพียงแค่ต้องการรหัสหน้าแล้วคุณจะทำให้การใช้งานget_postsแล้วก็ผ่านไปpageเป็นpost_typeและ 'IDS asค่า fields` สิ่งนี้จะช่วยให้มั่นใจได้ว่าจะมีการค้นหาที่เร็วขึ้นและมีประสิทธิภาพมากขึ้นเนื่องจากเราจะส่งคืนคอลัมน์โพสต์ 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>';

เฮ้ขอบคุณ ไม่หนักเกินไปหรือ? (เรียกใช้ผ่านทุกหน้า)
user3800799

ขึ้นอยู่กับจำนวนหน้าของคุณ อันที่จริงแล้วฉันก็ไม่รู้วิธีการที่จะดึงข้อมูลนี้ หากคุณมีหน้าจำนวนมากฉันขอแนะนำให้คุณใช้ทรานแซกชันเพื่อเก็บข้อมูลนั้นและล้าง / ลบชั่วคราวเมื่อมีการเผยแพร่หน้าใหม่เท่านั้น
Pieter Goosen

ความสุขของฉันดีใจที่ฉันสามารถช่วย สนุกกับ :-)
Pieter Goosen

@ user3800799 ฉันได้อัปเดตโพสต์แล้วหากคุณสนใจรับรหัสเท่านั้นไม่มีอะไรอื่น
Pieter Goosen

คุณสามารถใช้set_transient( codex.wordpress.org/Transients_API ) หากคุณไม่ต้องการสืบค้นฐานข้อมูลมากเกินไป
Chris Andersson

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

ต่อไปนี้เป็นสคริปต์ที่พูดชัดแจ้งเล็กน้อยซึ่งพิจารณาภาษาหากจำเป็น โปรดทราบว่าจะถือว่าการใช้ Polylang ไม่ใช่ WPML

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.