Obtenir l'identifiant de la page par modèle

19

Je veux savoir s'il est possible d'obtenir l'ID d'une page avec un modèle spécifique. Est-il possible d'obtenir l'ID d'une page affectée à "page-special.php"?

user3800799
la source

Réponses:

39

Lorsqu'une page est créée, le modèle attribué à cette page est enregistré en tant que méta de publication personnalisée de la même manière que les champs personnalisés. Le meta_keyest _wp_page_templateet le meta_valuesera le modèle de page

Vous pouvez simplement utiliser get_pagespour récupérer toutes les pages qui ont un meta_valuedu modèle spécifié

$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

Si l'on a juste besoin des identifiants de page, alors vous utilisez get_postset passez simplement la valeur pageas post_typeet 'ids asfields`. Cela garantira une requête beaucoup plus rapide et beaucoup plus optimisée car nous ne retournerons que la colonne post id dans la base de données et pas toutes pour les pages données

( Nécessite 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
la source
Hey, merci. N'est-ce pas un peu trop "lourd"? (parcourant toutes les pages)
user3800799
Cela dépend du nombre de pages dont vous disposez. Il n'y a en fait aucun moyen natif plus rapide que je connaisse pour récupérer ces données. Si vous avez beaucoup de pages, je vous suggère d'utiliser des transitoires pour stocker ces données et de vider / supprimer les transitoires uniquement lorsqu'une nouvelle page est publiée
Pieter Goosen
Mon plaisir, heureux d'avoir pu aider. Profitez-en :-)
Pieter Goosen
@ user3800799 J'ai mis à jour le message si vous êtes uniquement intéressé à obtenir les identifiants, rien d'autre
Pieter Goosen
Vous pouvez également utiliser set_transient( codex.wordpress.org/Transients_API ) si vous ne souhaitez pas trop interroger la base de données.
Chris Andersson
2

Si votre modèle de page réside dans le sous-dossier, dossier-thème / modèles-page / page-modèle.php, la requête ci-dessous fonctionnera:

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

Ces codes ci-dessus affichent également des sous-pages.

Merci

Sushil Adhikari
la source
0

Ce qui suit est un script légèrement plus articulé qui prend en compte une langue, si nécessaire. REMARQUE: il suppose l'utilisation de Polylang et non de 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
la source
0

Voici une fonction complète qui fonctionne avec WPML et Polylang. Crédit à 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
la source