web-dev-qa-db-fra.com

Variable globale $ post renvoyant un objet incorrect

Dans mon fichier header.php, j'ai essayé de récupérer le slug de la page en cours, pour vérifier que c'est la page Archive/Boutique de WooCommerce Products. J'ai suivi cette réponse à une question similaire, en vain; au lieu du retour du slug de la page en cours, le premier article vendu a été renvoyé. Mes questions sont les suivantes:

  • Pourquoi $post->post_name renvoie-t-il test-product-magazine au lieu du correct, shop?

<code>test-product-magazine</code>, instead of the correct, <code>shop</code>

<?php 
    global $post;
    echo "post_name: " . $post->post_name;
?>
1
ratskin

Pourquoi test-product-magazine, au lieu de la bonne, shop?

L’objet global $post n’est pas un moyen fiable de déterminer quoi que ce soit à propos des pages d’archive, car il s’agira généralement du premier message de la requête principale hors de la boucle. Puisque la requête principale concerne les articles de l'archive et non l'archive elle-même (qui n'est normalement même pas une page), l'objet $post ne représente aucune page en cours de création. utilisé pour les archives.

En effet, la page de la boutique et la page du blog ne sont pas réellement affichées. Ils n'ont donc pas besoin que l'objet global de publication soit défini pour les balises de modèle. Les bits des pages utilisées, comme le titre, ne sont pas extraits de l'objet post global avec the_title(), mais directement par l'ID de la page dans la base de données. Voir ces lignes de woocommerce_page_title() pour un exemple de la façon dont WooCommerce le fait:

$shop_page_id = wc_get_page_id( 'shop' );
$page_title   = get_the_title( $shop_page_id );

Et pour la page Posts, WordPress n'utilise jamais l'objet global $post pour cette page, il vérifie simplement si le nom de la page demandée est la page posts définie dans la base de données et modifie la requête en conséquence:

if  ( 'page' == get_option('show_on_front') && isset($this->queried_object_id) && $this->queried_object_id == get_option('page_for_posts') ) {
    $this->is_page = false;
    $this->is_home = true;
    $this->is_posts_page = true;
}

Par conséquent, le moyen correct d'obtenir la page Boutique et les pages Messages consiste à utiliser les fonctions conditionnelles appropriées, puis à rechercher l'ID approprié dans la base de données et à l'utiliser pour extraire les informations souhaitées. Pour la page Boutique, ce serait:

if  ( is_shop() ) {
    $shop_page_id = wc_get_page_id( 'shop' );
    $shop_page_object = get_post( $shop_page_id );

    // echo $shop_page_object->post_name;
}

Et pour la page Posts, ce serait:

if  ( is_home() && ! is_front_page() ) {
    $posts_page_id = get_option( 'page_for_posts' );
    $posts_page_object = get_post( $posts_page_id );

    // echo $posts_page_object->post_name;
}

Comment créer un modèle de page personnalisé pour une archive/une page de produits WooCommerce?

C'est hors sujet ici (la première question l'était probablement aussi, mais sa pertinence pour la page des messages justifiait également une réponse), mais si vous regardez la documentation de WooCommerce sur la question :

Les fichiers de modèle WooCommerce contiennent les balises et pour les courriers électroniques frontaux et HTML . de votre magasin.

...

Les fichiers de modèle peuvent être trouvés dans le répertoire /woocommerce/templates/:

...

Vous pouvez éditer ces fichiers de manière sans risque de mise à niveau en utilisant des substitutions . Copiez-le dans un répertoire de votre thème nommé /woocommerce en conservant la même structure de fichier mais en supprimant le sous-répertoire /templates/.

Le fichier dont vous parlez est woocommerce/templates/archive-product.php. Mais notez que ceci est également utilisé pour category/tag/etc. les archives. Si vous souhaitez que la page de magasin, et uniquement la page de magasin, soit différente, vous devez vérifier is_shop() dans le modèle et générer un balisage différent en conséquence.

1
Jacob Peattie