web-dev-qa-db-fra.com

Obtenir l'ID de la page dans la boucle

J'ai un modèle de page qui a une boucle pour afficher les messages de blog. À l'intérieur de la boucle, la fonction get_template_part('content', 'custom') permet d'inclure le modèle (content-custom.php) qui affiche le contenu d'un article de blog. Est-il possible d'obtenir l'ID de la page actuelle dans le fichier content-custom.php?

1
Sodbileg Gansukh

Vous pouvez utiliser toutes les balises template à l'intérieur de ce fichier. Pour obtenir l'ID, utilisez simplement get_the_ID() (ou the_ID() pour l'afficher).

get_the_ID() récupérera l'ID numérique de la publication en cours. Il n'a pas de paramètre et renvoie l'ID de la publication en cours.

the_ID() affichera l'ID numérique de la publication en cours. Il n'a également aucun paramètre.

Si vous souhaitez accéder à l'ID de la page contenant votre boucle personnalisée, vous pouvez le faire comme suit:

Solution 1 (moyen simple, mais pas très gentil avec variable globale)

Dans votre modèle de page:

<?php
    global $parent_page_id;
    $parent_page_id = get_the_ID();
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array( 'post_type' => 'post', 'paged' => $paged );
    $temp = $wp_query;
    $wp_query = null;
    $wp_query = new WP_Query( $args );
    $wp_query->query( $args );
?>

<?php if ( $wp_query->have_posts() ) : ?>
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

<?php else : ?>
    <?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>

Et dans votre modèle post-contenu:

...
global $parent_page_id; // now you can use parent_page_template variable
...

Solution 2 (plus agréable avec une requête personnalisée)

Dans votre modèle de page:

<?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array( 'post_type' => 'post', 'paged' => $paged );
    $my_custom_query = new WP_Query( $args );
?>

<?php if ( $my_custom_query->have_posts() ) : ?>
    <?php while ( $my_custom_query->have_posts() ) : $my_custom_query->the_post(); ?>
    <?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

<?php else : ?>
    <?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>

Et dans votre modèle post-contenu:

...
... $wp_query->queried_object_id; // it will contain object queried in original wp_query
...
2

Per cette réponse vous pouvez utiliser get_queried_object_id() qui ne figure pas encore dans le Codex, mais qui est lié à get_queried_object()

$page_id = get_queried_object_id();
8
helgatheviking

Pour obtenir l'identifiant de la page, vous pouvez utiliser la publication globale.

 
 global $ post; 
 echo "pageid:". $ post-> ID; 
 

Ci-dessus, vous retrouverez l'identifiant de la page actuelle et non l'identifiant.

1
shahpranaf

Solution 1: (Mauvaise solution)

$p = $GLOBALS['wp_the_query']->get_queried_object_id(); 
//$p will be your page id

Remarque: vous ne devez jamais utiliser l'objet global wp_the_query.

EDIT: si vous n'avez pas falsifié l'objet global wp_query, c'est-à-dire que vous n'avez pas utilisé query_posts () etc., les solutions de helgatheviking fonctionneront: code:

 get_queried_object_id(); 
or 
$GLOBAL['wp_query']->get_queried_object_id();

Solution 2: Comme le suggère le commentaire, vous pouvez stocker l'identifiant de la page en dehors de la boucle et y accéder à l'intérieur de la boucle. la question de la portée de l'accès à celui-ci dans le fichier de pièce modèle peut être résolue en la déclarant globale.

Code:

//1. in the template file befor the loop 

global $myglobal_page_id;
$mygloba_page_id = get_the_ID();
//you can start the loop here
get_template_part('content', 'custom');

// 2. in the template part file 

global $myglobal_page_id; //inside the loop or otherwise

//this will have your page_id

Explication # Solution 1:

Une fois dans la boucle, l'objet de publication global est défini sur votre publication actuelle. Par conséquent, lorsque vous appelez the_ID (), get_the_ID () (qui utilisait la fonction get_post ()), vous obtiendrez l'id de la publication en cours, et non la publication principale.

vous devez donc accéder à l'objet principal wp_the_query (qui est une copie de l'objet de requête principal utilisé pour réinitialiser la requête réf: wp_reset_query ()), car il contient votre requête d'origine.

0
MortalViews