Ich benutze die query_posts-Funktion, um 10 spezifische Beiträge aufzulisten, die anhand der Beitrags-ID gesucht werden.
Ich habe ein Array, das so aussieht ..
Array
(
[0] => 17983
[1] => 17932
[2] => 18030
[3] => 18016
[4] => 17972
[5] => 18013
[6] => 18035
[7] => 17959
[8] => 18020
[9] => 18039
)
Ich möchte Posts abfragen, in denen sie in dieser bestimmten Reihenfolge angezeigt werden. Mit meinem Code werden sie jedoch in einer eigenen zufälligen Reihenfolge angezeigt.
Hier ist das Argument, das ich für Abfrage-Posts verwende:
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'numberposts' => 10,
);
$ post_ids ist das Array, das ich oben gepostet habe.
Wie kann ich meinen Code ändern, um die Posts abzufragen und in der Reihenfolge des Arrays anzuzeigen?
Wenn die Abfrage nur für eine kleine Anzahl von Posts ist, dann können Sie, wie von Alex verlinkt, in PHP sortieren. Dies ist jedoch nicht gut skalierbar.
Wie von Kovshenin vorgeschlagen - eine bessere Alternative ist die Verwendung des posts_orderby
-Filters:
$post_ids = array(83,24,106,2283,14);
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'numberposts' => 10,
);
//Callback to filter the ORDER BY part of the query
function wpse67823_orderby_post_in($orderby, $query){
global $wpdb;
//Remove it so it doesn't effect future queries
remove_filter(current_filter(), __FUNCTION__);
$post__in = implode(',',$query->get('post__in'));
return "FIELD( {$wpdb->posts}.ID, $post__in )";
}
//Add filter and perform query
add_filter('posts_orderby','wpse67823_orderby_post_in',10,2);
$wpse67823_query = new WP_Query($args);
In WordPress 3.5 wird ein zusätzlicher Wert angezeigt, der von WP_Query
für orderby
akzeptiert wird: 'post__in'. Siehe dieses Trac-Ticket: http://core.trac.wordpress.org/ticket/13729
Sie müssen die resultierende SQL-Abfrage während posts_orderby
hijacken und die Funktion ORDER BY FIELD()
von MySQL mit einer durch Kommas getrennten Liste aus Ihrem Array verwenden. Hier finden Sie weitere Informationen zur Funktion FIELD
: http://www.electrictoolbox.com/mysql-order-specific-field-values/
Ich habe dies vor einiger Zeit getan, als Sphinx eine Liste der nach Relevanz geordneten Beitrags-IDs zurücksendete, und ich musste sie mit WP_Query
in derselben Reihenfolge auswählen. FIELD()
während des posts_orderby
-Filters hat wie ein Zauber gewirkt.
Wenn Sie zum Ändern der Hauptabfrage query_posts
verwenden, ist dies nicht die beste Methode. @Alex hat WP_Query
erwähnt, was sich nicht wirklich von query_posts
unterscheidet und auch eine schlechte Möglichkeit ist, die Hauptabfrage zu ändern (so wie Sie es scheinen).
Der richtige Weg wäre, die Aktion pre_get_posts
zu verwenden und das als Referenz übergebene Objekt $query
zu ändern. Weitere Informationen zu pre_get_posts erhalten Sie hier: http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
Hoffe das ist hilfreich. Prost!
Basierend auf der Antwort von @Stephen Harris scheint es für Wordpress 3.5+ die einfachste Option zu sein, nach post__in
zu bestellen.
Hier ist das Beispiel:
$post_ids = Array(12, 15, 18, 8, 10, 5);
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'numberposts' => 10,
'orderby' => 'post__in'
);
$posts = WP_Query($args); // or any other method that uses WP_Query args e.g. get_posts()
// as a result you will get posts in order: 12, 15, 18, 8, 10, 5
Ich habe das selbst auf einer Wordpress 4.7-Site getestet und es funktioniert wie erwartet.
Hier ist eine einfachere Lösung, um dies zu erreichen: Erstellen Sie einfach ein benutzerdefiniertes Feld für jeden dieser Posts mit demselben Namen und legen Sie die gewünschte Reihenfolge fest, z.
dann bestellen Sie in Ihrer Anfrage einfach nach diesem benutzerdefinierten Feld:
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'posts_per_page' => 10,
'meta_key' => 'my_custom_order',
'orderby' => 'meta_value',
'order' => 'ASC'
);
Hinweis: Sobald Sie dies getan haben (stellen Sie das benutzerdefinierte Feld für diese Posts ein), können Sie den Parameter 'post__in' => $post_ids,
entfernen, da nur Posts mit dem benutzerdefinierten Feld my_custom_order
aus der Datenbank abgefragt werden.
Verwenden Sie zunächst nicht query_posts()
, sondern WP_Query()
.
Zweitens ändern Sie Ihr Array nur in die Post-IDs.
von:
[0] => 17983
[1] => 17932
zu
array( 17983, 17932 )
EDIT: Suchen Sie HIER nach einer Referenz.