Sortare postări după câmp personalizat

8 apr. 2015, 16:59:51
Vizualizări: 16.8K
Voturi: 2

Încerc să sortez postările după câmpul personalizat artwork_title. Când folosesc următorul cod, primesc doar postări dintr-o anumită categorie, indiferent de categoria în care mă aflu.

De asemenea, paginarea afișează numărul corect de pagini, dar navigând la pagina următoare sunt afișate aceleași postări. Vedeți ce fac greșit?

<?php $query = new WP_Query(
    array(
        'posts_per_page' => 20,
        'orderby' => 'meta_value',
        'meta_key' => 'artwork_title',
        'order' => 'ASC'
    ) ); ?>

            <?php while ( $query->have_posts() ) : $query->the_post(); ?>

                <?php get_template_part( 'content', get_post_format() );
                ?>

            <?php endwhile; ?>

@PieterGoosen a sugerat utilizarea pre_get_posts. Nu am experiență cu aceasta, dar am încercat următorul cod însă nu primesc niciun rezultat. Probabil am făcut ceva greșit.

<?php add_action( 'pre_get_posts', 'sort_artwork_title' );?>

function sort_artwork_title( $query )
{
    if (is_admin()){
        return;
    }

   if( $query->is_main_query() && is_post_type_archive() ) {

            $query->set('orderby', 'artwork_title');
            $query->set('posts_per_page', '20');
            $query->set('order', 'ASC' );
        }
    return $query;
}
1
Comentarii

Nu utilizați o interogare personalizată, folosiți pre_get_posts

Pieter Goosen Pieter Goosen
8 apr. 2015 17:04:45
Toate răspunsurile la întrebare 1
6

Pentru a dezvolta comentariul lui @pieter-goosen, într-adevăr doriți să utilizați pre_get_posts. În exemplul dvs., prin utilizarea WP_Query, suprascrieți întreaga interogare și doar resetați majoritatea părților la valorile implicite. De fapt, probabil că nu vedeți postări dintr-o anumită categorie deloc. Ar trebui să vedeți toate postările, deoarece aceasta este valoarea implicită a clasei WP_Query.

Deci, în schimb, utilizați pre_get_posts, care modifică o interogare existentă în loc să creeze una complet nouă. Iată un fragment [netestat] care ar trebui să funcționeze în fișierul dvs. functions.php:

add_action( 'pre_get_posts', 'wpse183601_filter_category_query' );
function wpse183601_filter_category_query( $query ) {
    // modifică doar paginile de arhivă pentru categorii în front-end
    if( is_category() && !is_admin() && $query->is_main_query() ) {
        $query->set( 'posts_per_page','20' );
        $query->set( 'orderby','meta_value' );
        $query->set( 'meta_key','artwork_title' );
        $query->set( 'order','ASC' );
    }
}
8 apr. 2015 18:14:43
Comentarii

Ai răspuns în timp ce modificam postarea pentru a întreba despre pre_get_posts. Mulțumesc mult. Se pare că funcționează. Întrebare, de unde provine acel nume de funcție? Există vreun motiv pentru care nu ar putea fi pur și simplu artwork_title_filter_category_query sau ceva similar?

Thomas Martin Thomas Martin
8 apr. 2015 18:28:11

@ThomasMartin poți denumi funcția oricum. Majoritatea dintre noi folosim prefixul wpse**** pentru a avea un nume unic pentru funcții. wpse înseamnă WordPress StackExchange, iar numerele reprezintă numărul postării :-). Doar o observație, nu uita să redenumești numele funcției de callback în consecință.

Pieter Goosen Pieter Goosen
8 apr. 2015 18:36:06

Trebuie să adaug ceva pe paginile mele archive.php, index.php sau search.php? Se pare că funcționează bine pe paginile de arhivă, dar pe index lista de postări este aleatorie (sau nu văd ordinea).

Thomas Martin Thomas Martin
8 apr. 2015 19:12:51

Anulează asta. Îmi dau seama că indexul probabil doar sortează postările cele mai recente (Toate au fost create simultan, motiv pentru care nu recunosc ordinea.) Mulțumesc din nou pentru ajutor.

Thomas Martin Thomas Martin
8 apr. 2015 19:35:11

Clauza if() din fragment stabilește pe ce pagini (tehnic pe ce interogări) se aplică sortarea. Ai menționat pagini de categorie, așa că am optat pentru asta. Poți folosi majoritatea altor condiționale acolo fără probleme. Lasă ultimele două lucruri neatinse pentru a evita perturbarea altor părți ale WordPress. Dacă chiar vrei să înțelegi asta, citește pagina Codex menționată și chiar urmărește discuția lui Nacin "You Don't Know Query" pe WordPress.tv.

mrwweb mrwweb
8 apr. 2015 19:37:43

O precauție este că dacă câmpul personalizat nu este atribuit, postarea nu apare. Aveți sugestii pentru cum să faceți ca postările fără câmpul personalizat să fie adăugate la final?

Wes Modes Wes Modes
12 nov. 2019 01:54:32
Arată celelalte 1 comentarii