WordPress – Paginierungsbeitrag, Sortierung nach: meta_key nur aus der aktuellen Kategorie

Lesezeit: 4 Minuten

Ich versuche, eine Paginierungslinks von meiner Website zu erstellen.


Schema:


Serie | (category)
    |_ Temporada 1 (taxonomy: temporada)
            |_ Episodio 1 (posts 1 - meta_key: numeroepisodio)
            |_ Episodio 2 (posts 2 - meta_key: numeroepisodio)
            |_ Episodio 3 (posts 3 - meta_key: numeroepisodio)
            |_ Episodio 4 (posts 4 - meta_key: numeroepisodio)
            |_ ...
    |_ Temporada 2  (taxonomy: temporada)
            |_ Episodio 1 (posts 1 - meta_key: numeroepisodio)
            |_ Episodio 2 (posts 2 - meta_key: numeroepisodio)
            |_ Episodio 3 (posts 3 - meta_key: numeroepisodio)
            |_ Episodio 4 (posts 4 - meta_key: numeroepisodio)
            |_ ...

Another Serie 1
    |_ ...
Another Serie 2
    |_ ...

Problem:


Wenn ich meine Posts erstelle, werden die Paginierungen nach DATE geordnet. Kann mir helfen, diese Bestellung nach meta_key in derselben Taxonomie nur für die aktuelle Kategorie vorzunehmen?


Code:


<?php
    $prev_post = get_adjacent_post( true, '', true );
    $next_post = get_adjacent_post( true, '', false );

    if ( !is_a( $next_post , 'WP_Post' ) ) {
        $query_args = array (
        'post_type'         => 'post',
        'posts_per_page'    => -1,
        'meta_key'          => 'numeroepisodio',
        'orderby'           => 'meta_value meta_value_num',
        'order'             => 'DESC',
        'paged'             => $paged,
        'tax_query'         => array( 
                                array( 'taxonomy' => 'categry'),
                                array( 'taxonomy' => 'temporada') 
                        )
    );
        $oldest = get_posts($query_args);
        $next_post = $oldest[0];
    }
    if ( !is_a( $prev_post , 'WP_Post' ) ) {
        $latest = get_posts($query_args);
        $prev_post = $latest[0];
    }
?>
<?php if ( is_a( $prev_post , 'WP_Post' ) ) : ?>
<a href="https://stackoverflow.com/questions/31536074/<?php echo get_permalink( $prev_post->ID ); ?>"><div id="temporadas-dropdown"><i class="fa fa-caret-left"></i> ANTERIOR</div></a>
<?php endif; ?> 

<?php if ( is_a( $next_post , 'WP_Post' ) ) : ?>
<a href="<?php echo get_permalink( $next_post->ID ); ?>"><div id="temporadas-dropdown">SIGUIENTE <i class="fa fa-caret-right"></i></div></a>
<?php endif; ?> 

Hier ist ein Live-Beispiel: http://series.enlatino.net/ver-online/silicon-valley/

Vielen Dank an die Beratung!

  • es sagt categry in Ihrem Code für tax_query

    – amurell

    22. Juli 2015 um 1:10 Uhr

  • Behoben, aber das ändert nichts. Trotzdem danke.

    – Ferrmolina

    22. Juli 2015 um 11:37 Uhr

Benutzer-Avatar
Amurrel

Ich habe das gefunden:

<?php
/** Plugin Name: (#73190) Alter adjacent post link sort order */
function wpse73190_adjacent_post_sort( $orderby )
{
    return "ORDER BY p.menu_order DESC LIMIT 1";
}
add_filter( 'get_previous_post_sort', 'wpse73190_adjacent_post_sort' );
add_filter( 'get_next_post_sort', 'wpse73190_adjacent_post_sort' );

aus wordpress.stackexchange.com – was es besser erklärt, also schauen Sie es sich an … die akzeptierte Antwort, aber im Wesentlichen können Sie die Abfrage mit diesem Filter ändern, und es gibt verschiedene Filter – wo, verbinden, sortieren Sie nach vorherigem und nächstem.


Ganz andere Antwort:

Ich bin nicht wirklich ein Fan davon, es manuell zu machen, aber das könnte funktionieren – ich habe es jedoch nicht getestet und mein vollständiges Verständnis der Taxonomien und der WordPress-DB ist etwas mangelhaft.

function get_adjacent_episode($post, $prev_or_next) {
    global $wpdb;
    
    $prev_or_next = ($prev_or_next === 'previous') ? 'DESC' : 'ASC';
    $operator = ($prev_or_next === 'previous') ? '<' : '>';
    
    $cur_episode = get_post_meta($post->ID, 'numeroepisodio', true);
    
    $query = sprintf("select p.ID from $wpdb->posts p 
        inner join $wpdb->postmeta m 
        on p.ID = m.post_id
        inner join $wpdb->terms_relationships r
        on p.ID = r.object_id
        where r.term_taxonomy_id = (select term_taxonomy_id from $wpdb->term_taxonomy where taxonomy = '%s' limit 1) 
        and p.post_type="post" and m.meta_key = '%s' and m.meta_value %s %s
        order by m.meta_key %s limit 1", 'temporada', 'numeroepisodio', $operator, $cur_episode, $prev_or_next);
        
    $adjacent_post = $wpdb->get_results($query);
    return $adjacent_post;
}

Nennen:

$next_post = get_adjacent_episode($post, 'next');

$prev_post = get_adjacent_episode($post, 'previous');

Beachten Sie, dass die Abfrage nur hat select p.IDsodass Sie nur darauf zugreifen können $next_post->ID Sie können diese Auswahl jedoch erweitern, um bei Bedarf mehr vom Ergebnis zu erfassen.

  • Hallo @amurrell, und danke für deine Antwort. Meine Frage zu Ihren Antworten ist … das ist eine gute Praxis? Ist es sicher, die Datenbank direkt abzufragen?

    – Ferrmolina

    22. Juli 2015 um 11:35 Uhr

  • Ich ermutige Sie, darüber zu lesen wpdb-Objekt und speziell die Idee der Verwendung vorbereiten um die SQL-Injektion zu vermeiden, was ich bereits mit sprintf() getan habe. Persönlich denke ich, dass eine andere Lösung, die die Sortierfilter manipuliert, eine Art Hack-Job und viel weniger effizient wäre … gängige Praxis? Idk, es ist ein eher manueller Ansatz und vielleicht macht es das fortgeschrittener – nicht sicher.

    – amurell

    23. Juli 2015 um 20:40 Uhr


1205050cookie-checkWordPress – Paginierungsbeitrag, Sortierung nach: meta_key nur aus der aktuellen Kategorie

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy