web-dev-qa-db-fra.com

PHP Remarquez une erreur (sur la page 404)

J'ai un modèle 404.php pour mon thème. J'ai également WP_DEBUG dans wp-config.php défini sur TRUE.

Considérez ce modèle 404:

get_header(); ?>

<div id="content" style="full-width">
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <div class="post-content">
        Whatever.
        </div>
    </div>
</div>

<?php get_footer(); ?>

Je reçois l'erreur suivante:

Remarquer: Essayer d'obtenir la propriété de non-objet dans .../chemin/post-template.php en ligne 30

Maintenant, je sais que l'erreur est provoquée par l'appel à the_ID() sur la ligne 4. Et la solution la plus simple serait que je la supprime simplement dans le modèle.

Cependant, il existe des zones dans d'autres parties du modèle, par exemple header.php, qui appellent la même fonction ou utilisent $post->ID.

Un exemple serait $project_meta = get_post_meta($post->ID, 'show_project_meta', true);. Ceci est partagé et fonctionne très bien dans n’importe quel autre modèle, c’est-à-dire où la page a un post/ID de page. Que puis-je faire pour la page 404?

Y'a t'il un moyen d'arranger cela? Merci.

1
mousesports

Le fichier modèle 404.php est utilisé pour les erreurs 404: i.e. aucun message trouvé .

Puisqu'il n'y a pas de messages, il n'y a pas d'objet $post. Sans objet $post, les fonctions telles que the_ID() ne sont pas disponibles et renverront l'erreur que vous observez.

Le correctif: remplacez toutes les instances de données dérivées de $post par des données statiques. par exemple. remplacez ceci:

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

...avec ça:

<div id="post-0" <?php post_class(); ?>>
4
Chip Bennett

the_ID est destiné à être utilisé dans la boucle. Même si votre boucle commence dans get_header, tout n’aura pas la bonne boucle. Cela ressemble un peu à ce qui se passe, mais d'un autre côté, have_posts, qui devrait commencer votre boucle, devrait signifier que la boucle ne commence pas sur cette page 404. C'est ce qui s'est passé quand j'ai essayé, de toute façon. Alors peut-être que cette page n'est tout simplement pas dans une boucle du tout.

$post est défini très tôt dans les chargements de page la plupart du temps. Si ce n'est pas dans une boucle - c'est-à-dire, la boucle ne commence pas dans get_header--, cet ID peut ne pas être ce que vous attendez ou ce que vous voulez. Sur un index de blog, index.php, cet identifiant est l'identifiant de la première publication de la boucle, pas vraiment l'identifiant de la page d'index, qui ne possède pas d'identifiant du tout, à moins que vous n'ayez défini l'index sur une page de la page. backend. Même dans ce cas, l'ID est le premier message de la boucle, et non l'ID de la page "statique". Vous aurez le même problème de post/boucle avec $post->ID.

Et bien sûr, la plupart de ceci est basé sur une estimation de la structure de votre thème/modèle.

Vous devriez vraiment le définir conditionnellement comme ...

if (is_single() {
    $pID = $post->ID;
} elseif (is_search()) {
    $pID = <something>;
} // and so on until you get all the conditions you need

<div id="content" style="full-width">
    <div id="post-<?php echo $pID ?>" <?php post_class(); ?>>

De plus, je suis à peu près sûr que ids n'est pas censé commencer par un chiffre. Il faudrait que je vérifie, mais si ma mémoire est bonne.

2
s_ha_dum