web-dev-qa-db-fra.com

Obtenir l'identifiant d'une page contenant une boucle secondaire dans le contenu

J'essaie d'obtenir l'ID (en dehors de la boucle) d'une page qui contient une boucle d'un autre CPT dans son contenu à l'aide d'un shortcode.

Si je fais un print_r de get_queried_object(), tout ce que je récupère est utilisé pour enregistrer le CPT
Si je echo$post->ID j'obtiens l'ID du dernier élément de la boucle secondaire.
Si je echoget_queried_object_id(), je reçois 0 tout le temps.

Voici le code que j'utilise actuellement

function get_meta_values() {
    global $post;
    $queried_object = get_queried_object();
    echo '<pre>';
    print_r( $queried_object ); //Returns args used to register the CPT
    echo '<br> $queried_object->ID: ' . $queried_object->ID; //Returns Nothing
    echo '<br>get_queried_object_id(): '. get_queried_object_id(); // Returns 0 all the time
    echo.'<br>PageID: ' . $post->ID; // Returns the ID of last item in the secondary loop
    echo '</pre>';

}
add_action( 'wp_footer', 'get_meta_values' );  

Mon objectif est d'obtenir l'ID de la page (où se trouve le shortcode) afin de récupérer certaines valeurs de champs personnalisés.

EDIT: J'utilise WooCommerce, mais le code court qui produit les produits est personnalisé. Je sais que je pourrais contourner le problème par d'autres moyens, mais je voudrais juste savoir pourquoi cela ne fonctionne pas.

4
Abhik

Comme d'autres l'ont déjà compris: si vous avez des plugins tiers avec des requêtes personnalisées, vous passerez une mauvaise journée!

Une solution pourrait être la mise en cache de vos résultats.

Modèle (par exemple: page.php)

while (have_posts()): the_post();
    global $my_cached_data;
    $post_id = get_the_ID();
    /* 
     * If you have single meta keys, this array_map function 
     * makes them easy to access; otherwise just use:
     *
     * $my_cached_data[$post_id] = get_post_meta( $post_id) 
     */
    $my_cached_data[$post_id] = array_map( 
        function( $a )
        { 
            return $a[0]; 
        }, 
        get_post_meta( $post_id) 
    );
endwhile;

footer.php

global $my_cached_data;
echo "<pre>".print_r($my_cached_data, true)."</pre>";

Résultat possible (avec les ID de page 2 et 15 ayant les mêmes métadonnées de publication)

array(2) {
  [2]=>
  array(2) {
        ["meta_key"]=>
    string(10) "meta_value"
        ["another_key"]=>
    string(10) "meta_value"
  }
  [15]=>
  array(2) {
        ["meta_key"]=>
    string(10) "meta_value"
        ["another_key"]=>
    string(10) "meta_value"
  }
}
1
iantsch