web-dev-qa-db-fra.com

Remarque: propriété non définie: wpdb :: $ current_post Qu'est-ce qui ne va pas?

Je travaille sur un site WordPress et j'utilise le code suivant pour afficher les articles dans deux colonnes sur les pages d'archives et de catégories:

<div id="post-<?php the_ID(); ?>" <?php post_class( 0 === ++$GLOBALS['wpdb']->current_post % 2 ? 'grid col-340 fit' : 'grid col-340' ); ?>>

Avec debug réglé sur "true", j'ai eu l'avis suivant:

Remarque: propriété non définie: wpdb :: $ current_post dans D:\beta\www.beta.dev\wp-includes\wp-db.php à la ligne 684

Qu'est-ce qui ne va pas avec ce code? J'ai remarqué que cet avis est apparu avec WordPress version 4+

Toute aide est la bienvenue. Merci.

2
Knott

Il y a des problèmes avec cette partie:

 ++$GLOBALS['wpdb']->current_post

Il n'y a pas de propriété current_post de la classe wpdb; dans ce cas, vous êtes en train de confondre la classe wpdb avec la classe WP_Query.

De plus, nous ne voudrions pas en général modifier la propriété current_post du global WP_Query, elle pourrait sûrement nous "mordre" si nous gâchions les globals ;-)

Notez que la propriété current_post de WP_Query fait déjà le décompte pour nous avec $this->current_post++; dans next_post(), cela s'appelle dans the_post(). Voir ici . Il n’est donc pas nécessaire de l’augmenter manuellement (++) dans la boucle.

Voici un exemple d'utilisation du filtre post_class, à l'aide d'une variable static :

add_filter( 'post_class', function( $classes ) 
{
    static $instance = 0;

    if( in_the_loop() )
        $classes[] = ( 0 === $instance++ % 2 ) ? 'even' : 'odd';        

    return $classes;
} );

où nous ciblons les classes de publication dans la boucle de requête principale. N'oubliez pas de modifier les classes paires/impaires et d'autres restrictions en fonction de vos besoins.

L'utilisation du filtre post_class pourrait permettre une meilleure réutilisation des éléments de modèle.

Mettre à jour

Il semble que vous utilisiez la première version de one-liner answer ) de @ toscho, créant une propriété current_post personnalisée (pour le comptage) de l'objet global wpdb. Il suggère ensuite d'utiliser la propriété personnalisée préfixée, telle que wpse_post_counter. Mais il semble qu'il ait besoin d'une initialisation pour éviter la remarque PHP.

@kaiser a envoyé une excellente réponse ici qui utilise la propriété current_post du $wp_query global (probablement pas le $wpdb global).

Depuis que j'ai donné un promesse ici , concernant anonymous fonctions et global variables, je devrais le réécrire pour: Voir mon éditer ici - où nous utilisons la variable use mot clé à transmettre à l'objet global $wp_query.

6
birgire