Seiten-ID anhand einer Vorlage abrufen

19

Ich möchte wissen, ob es möglich ist, die ID einer Seite mit einer bestimmten Vorlage abzurufen. Ist es möglich, die ID einer Seite zu ermitteln, die "page-special.php" zugewiesen wurde?

user3800799
quelle

Antworten:

39

Beim Erstellen einer Seite wird die dieser Seite zugewiesene Vorlage wie benutzerdefinierte Felder als benutzerdefiniertes Post-Meta gespeichert. Das meta_keyist _wp_page_templateund das meta_valuewird die Seitenvorlage sein

Sie können einfach verwenden get_pages, um alle Seiten abzurufen, die eine meta_valueder angegebenen Vorlagen haben

$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

Wenn man nur die Seiten-IDs benötigt, verwendet man den Wert und übergibt ihn get_postseinfach pageals post_typeund "IDs- asFelder". Dies stellt eine viel schnellere und optimierte Abfrage sicher, da nur die Post-ID-Spalte in der Datenbank und nicht alle für die angegebenen Seiten zurückgegeben werden

( Benötigt 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
quelle
Hey danke. Ist das nicht ein bisschen zu "schwer"? (Laufen durch alle Seiten)
User3800799
Hängt davon ab, wie viele Seiten Sie haben. Es gibt eigentlich keinen schnelleren nativen Weg, um diese Daten abzurufen. Wenn Sie viele Seiten haben, würde ich vorschlagen, dass Sie Transienten verwenden, um diese Daten zu speichern und die Transienten nur dann zu löschen, wenn eine neue Seite veröffentlicht wird
Pieter Goosen,
Ich bin froh, dass ich helfen konnte. Viel Spaß :-)
Pieter Goosen
@ user3800799 Ich habe den Beitrag aktualisiert, wenn Sie nur daran interessiert sind, die IDs zu erhalten, sonst nichts
Pieter Goosen
Sie können auch set_transient( codex.wordpress.org/Transients_API ) verwenden, wenn Sie die Datenbank nicht zu häufig abfragen möchten.
Chris Andersson
2

Befindet sich Ihre Seitenvorlage im Unterordner theme-folder / page-templates / page-template.php, funktioniert die folgende Abfrage:

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

Diese obigen Codes zeigen auch Unterseiten an.

Vielen Dank

Sushil Adhikari
quelle
0

Das Folgende ist ein etwas artikulierteres Skript, das bei Bedarf eine Sprache berücksichtigt. HINWEIS: Es wird die Verwendung von Polylang und nicht von WPML vorausgesetzt.

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
quelle
0

Hier ist eine vollständige Funktion, die mit WPML und Polylang funktioniert. Gutschrift auf 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
quelle