pre_get_posts funktioniert im Post-Typ-Archiv, aber nicht im einzelnen Post

Ich habe einen benutzerdefinierten Beitragstyp “Gelehrte”, der ein Archiv hat. Ich möchte nach einem benutzerdefinierten Meta-Feld namens “Jahr” sortieren, ich mache das mit pre_get_posts :

 add_action('pre_get_posts', 'my_queries'); function my_queries($query) { if (!$query->is_main_query()) return; if ($query->query['post_type'] == 'scholars') { $query->set('posts_per_page', -1); $query->set('meta_key', 'year'); $query->set('orderby', 'meta_value'); } } 

Dies funktioniert auf der Archivseite (der next_post_link ), aber next_post_link und previous_post_link sind nicht synchron in der einzelnen Post. Sie sind immer noch nach Datum und nicht nach “Jahr” sortiert.

Ich habe eine benutzerdefinierte Abfrage auf der einzelnen Seite mit WP_Query , um verwandte Beiträge WP_Query , aber ich habe versucht, es zu entfernen und funktioniert immer noch nicht.

Dies ist die Archivseite:

 
<?php if (have_posts()) { while (have_posts()) { the_post(); // this just loads an
get_template_part('content', 'scholars'); } } else { echo '

Nothing found.

'; } ?>

Und das ist die einzige Seite:

  
<img src="https://wordpress.stackexchange.com/questions/109498/pre-get-posts-works-in-post-type-archive-but-not-in-single-post/" alt="" />

Scholar

Irgendwelche Ideen, warum es nicht funktioniert?

Edit: Nach dem Betrachten anderer verwandter Antworten scheint das mit der eingebauten function out of the box nicht möglich, fand dieses Plugin aber ich bin offen für jede Lösung.

Bearbeiten: Pfff, es funktioniert nicht einmal mit diesem Plugin, weiß nicht, was das Problem ist:

 next_post_link_plus('meta_key=year&order_by=numeric') 

Solutions Collecting From Web of "pre_get_posts funktioniert im Post-Typ-Archiv, aber nicht im einzelnen Post"

Die functionen next_post_link() und previous_post_link() verwenden nicht dieselbe Abfrage, auf die sich 'pre_get_posts' auswirkt. Sie verwenden ihre eigenen benutzerdefinierten Abfragen. Sie müssen andere Filter verwenden, um sie zu beeinflussen.

Genau genommen erledigt die function get_adjacent_post () den Hauptteil der Arbeit für die functionen next_post_link() und previous_post_link() .

Hier ist ein Teil dieser function:

 $adjacent = $previous ? 'previous' : 'next'; $op = $previous ? '< ' : '>'; $order = $previous ? 'DESC' : 'ASC'; $join = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_cat, $excluded_categories ); $where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_date, $post->post_type), $in_same_cat, $excluded_categories ); $sort = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" ); 

Um die Sortierreihenfolge für den next Post zu ändern 'get_next_post_sort' Filter 'get_next_post_sort' und verwenden Sie den Filter 'get_previous_post_sort' , um die Sortierung für den previous Link zu ändern.

Sie können anhand dieses Codeausschnitts erkennen, dass der Wert in der $order in der ursprünglichen Abfrage davon abhängt, für welchen Filter Sie Code schreiben.

Entschuldigung, ich kenne SQL nicht gut genug, um diesen Teil der Abfrage zu schreiben.