Trier les publications (sur l'ensemble du site) par date de métadonnées

8

Ma page d'accueil personnalisée est configurée pour trier mes messages personnalisés via le champ de date personnalisé avec ce code (mis à jour pour être personnalisé) dans functions.php:

// sort order for home page
add_action('wp', 'wwgo_check_page');
function wwgo_check_page () {
if (is_page()) {
    add_filter('get_previous_post_sort', 'sort_it');
    add_filter('get_next_post_sort', 'sort_it');
    add_filter('posts_orderby', 'sort_it' );
    add_filter('posts_join', 'join_it' );
    add_filter('posts_where', 'where_it' );

    function sort_it () {
        global $wpdb;

        return " $wpdb->postmeta.meta_value ASC ";
    }

    function join_it( $join ) {
        global $wpdb;

        $join .= " LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) ";

      return $join;
    }

    function where_it( $where ) {
        global $wpdb;
        $where .= "AND $wpdb->postmeta.meta_key = 'deadline' ";

      return $where;
    }
}



}

Ce qui est dandy et simple. Maintenant. Je veux que cela fonctionne sur l'ensemble du site. Je veux que les messages sur les pages d'archives, les catégories, etc. soient d'abord triés par le champ de date personnalisé.

Des idées?

J'ai essayé de changer le ' if' en is_archive()mais cela n'a eu aucun effet. J'ai essayé <! is_single()>aussi.

Je suis sûr que ce devrait être quelque chose de simple. Mais je suis nouveau sur php et donc désemparé.

Voici le site , où vous pouvez voir que la page d'accueil est bien triée, mais si vous cliquez sur «poésie» (la seule avec quelques messages), le tri ne fonctionne pas.

Toutes les suggestions seront satisfaites avec beaucoup de joie.

Merci de bien vouloir.

Josh
la source
Vous devez préfixer toutes vos fonctions avec par exemple. josh_pour éviter de nommer les colisions.
kaiser
Voulez-vous dire cela comme bonne pratique ou pour résoudre ce problème? J'ai essayé de recopier le code pour 'is_archive' et cela m'a permis d'appeler à nouveau la fonction, mais le tri n'a pas fonctionné ...
josh
1
Oui, c'est une bonne pratique. De plus: vous ne devez pas envelopper les fonctions dans les fonctions.
kaiser
cool, cool (je viens de copier le code d'un site Web, tbh. Je suis nouveau sur php et wordpress). Avez-vous des avancées sur la façon de faire fonctionner cela sur le site? Je l'ai avec plus de pages personnalisées et la même fonction définie sur (is_page ()) mais cela ne fait rien pour mes pages d'archives. Je ne sais pas comment les réparer ...
josh
1
Au lieu de mettre des fonctions dans des fonctions, essayez plutôt d'utiliser une classe.
Manny Fleurmond

Réponses:

2

Utilisez le filtre de demandequery_vars ou pour ajouter si n'est pas présenté dans la chaîne de requêteorderbyorderby

Maxim Krizhanovsky
la source
+1 pour requestsuggestion de filtre
Michal Mau
@josh consultez également cette réponse wordpress.stackexchange.com/a/21378/2110 pour voir comment tester is_archive()et se ressembler si tôt dans le processus.
Michal Mau
filtre de requête était en effet, un bon cri.
josh
0

Pourquoi n'utilisez-vous pas query_posts ()?

<?php
query_posts('meta_key=key_name&orderby=key_name&sort=ASC');
if ( have_posts() ) : while ( have_posts() ) : the_post();

endwhile; else:

endif;

wp_reset_query();

Vous pouvez également modifier la requête à l'aide du crochet pre_get_posts et y effectuer votre tri conditionnel avec is_archive (), is_page () etc ...

Brian Fegter
la source
0

Je regarde aussi votre autre question .

Si vous souhaitez trier par la méta-valeur de date, ils doivent naturellement être au même format - je suppose que c'est le format de date ('m-y') de PHP comme vous l'avez spécifié dans votre code là-bas?

Si tel est le cas, vous constaterez peut-être que si vous changez votre meta_valuedans ce code pour meta_value_numobtenir un meilleur résultat?

Je ne sais pas si cela fonctionnera, mais cela pourrait valoir la peine d'essayer.

djb
la source