web-dev-qa-db-fra.com

Pourquoi get_post_meta ne fonctionne-t-il pas avec la page posts?

Vous recherchez une raison pour laquelle get_post_meta() ne fonctionne pas avec home.php. D'après mes lectures, je comprends que c'est un modèle et non un message ou une page, mais " Les champs personnalisés ne s'afficheront pas sur la page de mon blog ". La page la plus proche que j'ai pu trouver dans la recherche était " Les champs de get_post_meta n'apparaissent pas sur la page de messages " mais, hélas, la réponse ne donne pas pourquoi. J'ai codé une boîte de méta personnalisée, cela fonctionne, pour le front_page.php et tous les types de publication personnalisés, mais pas dans home.php. J'utilise un is_home() conditionnel et cela fonctionne, mais il semble que get_the_ID() ne fonctionne pas, le code:

if ( is_home() ) {
    // variables 
    $check_meta     = get_post_meta( get_the_ID(), 'checkbox', true );
    $header_meta    = get_post_meta( get_the_ID(), 'header', true );        
    $textarea_meta  = get_post_meta( get_the_ID(), 'textarea', true );

    // condition
    if ( ( $check_meta == 'yes' ) && !empty( $textarea_meta ) && !empty( $header_meta ) ) {
        // code
    }
}

Pourquoi get_the_ID() ne semble pas fonctionner avec get_post_meta() dans home.php situé dans header.php?


Modifier:

D'après les commentaires, je pensais pouvoir éditer cette question pour aider quelqu'un d'autre à l'avenir. Je configure la page d'accueil et la page des articles dans Settings -> Reading. Le ci-dessous a fonctionné dans mon conditionnel pour is_home():

$check_meta     = get_post_meta( get_queried_object_id(), 'checkbox', true );
$header_meta    = get_post_meta( get_queried_object_id(), 'header', true );        
$textarea_meta  = get_post_meta( get_queried_object_id(), 'textarea', true );

Si votre page de messages est une page statique sélectionnée dans Paramètres> Lecture> La page de garde s'affiche , get_queried_object_id() renverra l'ID de cette page que vous pouvez utiliser pour récupérer des métadonnées.

$check_meta     = get_post_meta( get_queried_object_id(), 'checkbox', true );
$header_meta    = get_post_meta( get_queried_object_id(), 'header', true );        
$textarea_meta  = get_post_meta( get_queried_object_id(), 'textarea', true );
4
Milo

La page d’accueil ( cela s’applique également à la page de blog de toute page d’archive ) n’a pas d’identifiant de publication, car ce n’est ni une publication, ni une page. Ce sont des pages virtuelles et n’existent pas réellement car elles n’ont pas été créées en back-end.

get_the_ID() utilise get_post() qui utilise le $post global pour renvoyer l'ID d'une publication ou d'une page. À l'intérieur de la boucle, le $post global sera toujours défini sur la publication en cours de bouclage via the_post().

En dehors de la boucle, dans la requête principale, avant la boucle, le $post global sera automatiquement défini et tiendra l'objet publication de la première publication de la requête. Vous pouvez vérifier cela avec var_dump( $post );. Le $post global sera défini sur la dernière publication de la requête s'il est coché après l'exécution de la boucle ( car the_post() a modifié la valeur ).

Sur les pages à publication unique et les pages vraies, la première publication ( qui sera toujours la seule publication ) sera la publication demandée. L'ID de publication sera donc toujours ( si vous n'utilisez pas query_posts , query_posts rompra ce bourrage vous gros temps ) correspond avec l'ID correct de la publication ou de la page. Sur toute page d'archive, l'ID de message renvoyé par get_the_ID() sera toujours le premier ou le dernier message de la requête, en fonction de son utilisation en dehors de la boucle.

Les pages d'archives ne peuvent pas non plus avoir de méta de publication, car ce ne sont ni des publications ni des pages et elles ne possèdent pas d'identifiant.

Donc, en bref, get_the_ID() retournera toujours false ( si $post doit être vide ), ou l'ID de la première ou de la dernière publication de la requête en dehors de la boucle sur n'importe quel type de page d'archive

2
Pieter Goosen

Pour utiliser get_post_meta(), vous devez avoir un identifiant de publication. Ce sont vos options:

  1. Définir un identifiant de publication manuellement
  2. Exécutez votre code dans la boucle et get_the_ID() habituellement loop.php
  3. Exécutez votre code sur une seule page ou postez habituellement page.php ou single.php

Réponse élargie avec le thème TwentyFifteen:

  1. Ouvrir index.php
  2. Localisez le code de boucle commençant par while ( have_posts() ) : the_post();
  3. Insérez votre code après le code à l'étape 2, $meta = get_post_meta( get_the_ID() );
0
Scriptonomy