Je teste pour un certain poste fixe sur une page à propos, je devinais que le meilleur moyen était de tester le titre du post (?).
Voici mon code, qu'est-ce qui ne va pas?
<?php
if (is_page()) {
$cat=get_cat_ID($post->post_title);
$posts = get_posts ("cat=$cat&showposts=35");
if ($posts) {
foreach ($posts as $post):
setup_postdata($post); ?>
<div class="clear"></div>
<h3><?php the_title(); ?></h3>
<div class="clear"></div>
<?php if ($post->post_title('skillset')) {
echo '<div class="content">';
the_content('');
echo '</div>';
}
else{
the_content('');
}
endforeach;
}
}
?>
Tout d’abord, $post
est l’une des variables globales principales du noyau WordPress et ne doit donc pas être touché ni réinitialisé . après votre boucle foreach
.
Utiliser setup_postdata()
vous permet d’utiliser des balises de modèle telles que vous êtes faire dans l'extrait de code ci-dessus avec the_title()
. Elle, ou la boucle dans laquelle il est utilisé, devrait cependant toujours être suivie de son compagnon wp_reset_postdata()
.
De plus, $post
est un objet . Les objets sont des occurrences de classes contenant des propriétés et/ou des méthodes, les équivalents OOP de variables et de fonctions.
En essayant de tester le titre du post comme vous l'avez fait,
if($post->post_title('skillset'))
vous avez traité post_title
comme s’il s’agissait d’une méthode et que vous pouviez alimenter le titre en question sous forme d’argument et renvoyer un booléen. Cependant, il s'agit d'une propriété et en tant que tel contient une valeur à laquelle vous pouvez accéder - et c'est tout.
Cette valeur doit ensuite être testée par rapport à une autre valeur. Par conséquent
if( 'skillset' === $post->post_title ) {
// your conditional operation
}
serait un test de travail pour le titre.
Cette ligne est essentiellement la réponse à la question dans votre titre. Puisque vous avez cependant demandé ce qui pourrait ne pas être correct avec votre code, l'argument showposts
est également déconseillé depuis un certain temps. Utilisez numberposts
à la place.
Revenons également au point initial sur l'utilisation de $post
. Si, au lieu des balises de modèle, vous référencez directement les propriétés, il ne serait pas nécessaire de remplacer le $post
global.
$wpse67413_posts = get_posts();
foreach( $wpse67413_posts as $wpse67413_post ) {
echo '<h3>' . $wpse67413_post->post_title . '</h3>';
}
Cela fonctionnerait aussi bien sans toucher au global. C'est juste pour des raisons d'exhaustivité.
Et comme note de côté, pourquoi voudriez-vous utiliser autant de balises PHP d'ouverture et de fermeture dans un espace aussi restreint? Une question plutôt rhétorique: cela n’a aucun sens.
Enfin, êtes-vous sûr de vouloir faire ceci:
$cat=get_cat_ID($post->post_title);
? Cela n'a de sens que si vous souhaitez récupérer les messages d'une catégorie nommée exactement de la même manière que le titre de la page sur laquelle se trouve le visiteur. En supposant que la réponse soit positive, voici la correction complète de votre extrait de code:
global $post;
if( is_page() ) {
$wpse67413_posts = get_posts( array(
cat => get_cat_ID($post->post_title),
numberposts => 35
));
if( $wpse67413_posts ) {
foreach ( $wpse67413_posts as $post ) {
setup_postdata($post);
echo '<div class="clear"></div>' .
'<h3>' get_the_title() . '</h3>' .
'<div class="clear"></div>';
if( 'skillset' === $post->post_title ) {
echo '<div class="content">' . get_the_content() . '</div>';
} else {
the_content();
}
}
}
wp_reset_postdata();
}
Le meilleur moyen serait de rechercher une identité, pas un titre! Alors, votre si serait:
if ($post->ID === 123)
où 123 est l'ID du message que vous souhaitez "filtrer".