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"?

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

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


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

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'];
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.