Dapatkan Halaman id oleh Template

19

Aku ingin tahu apakah itu mungkin untuk mendapatkan ID dari halaman dengan template tertentu. Apakah ini mungkin untuk mendapatkan ID dari halaman yang ditugaskan untuk "halaman-special.php"?

user3800799
sumber

Jawaban:

39

Ketika halaman yang dibuat, template ditugaskan ke halaman yang disimpan sebagai pos kustom meta dengan cara yang sama seperti bidang adat. The meta_keyadalah _wp_page_templatedan meta_valueakan menjadi template halaman

Anda hanya dapat menggunakan get_pagesuntuk mengambil semua halaman yang memiliki meta_valuetemplate yang ditentukan

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

EDIT 23-07-2015

Jika salah satu hanya perlu halaman id, maka Anda memanfaatkan get_postsdan kemudian hanya lulus pagesebagai post_typedan 'ids asnilai fields`. Ini akan memastikan kueri yang jauh lebih cepat, lebih dioptimalkan karena kami hanya akan mengembalikan kolom id pos di db dan tidak semuanya untuk halaman yang diberikan

( Membutuhkan 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>';
Pieter Goosen
sumber
Hei, terima kasih. Bukankah agak terlalu "berat"? (menjalankan semua halaman)
user3800799
Tergantung pada berapa banyak halaman yang Anda miliki. Sebenarnya tidak ada cara asli yang lebih cepat yang saya tahu untuk mengambil data ini. Jika Anda memiliki banyak halaman, saya akan menyarankan agar Anda menggunakan transien untuk menyimpan data itu dan hanya menyiram / menghapus transien ketika halaman baru diterbitkan
Pieter Goosen
Dengan senang hati, senang saya bisa membantu. Selamat menikmati :-)
Pieter Goosen
@ user3800799 Saya telah memperbarui posting jika Anda hanya tertarik untuk mendapatkan id, tidak ada yang lain
Pieter Goosen
Anda juga dapat menggunakan set_transient( codex.wordpress.org/Transients_API ) jika Anda tidak ingin terlalu banyak query database.
Chris Andersson
2

Jika template halaman Anda berada di dalam sub-folder, theme-folder / page-templates / page-template.php maka pertanyaan Anda di bawah ini akan berfungsi:

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

Kode-kode di atas juga menampilkan sub-halaman.

Terima kasih

Sushil Adhikari
sumber
0

Berikut ini adalah skrip yang sedikit lebih diartikulasikan yang memperhitungkan bahasa, jika diperlukan. Perhatikan bahwa ini mengasumsikan penggunaan Polylang, bukan 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
Luca Reghellin
sumber
0

Ini adalah fungsi lengkap yang bekerja dengan WPML dan Polylang. Kredit untuk 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'];
    }
}
Alex Vand
sumber