wake-up-neo.com

Fragen Sie Beiträge in einer vordefinierten Reihenfolge ab

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?

4
Imran

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);

3.5+

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

4
Stephen Harris

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!

1
kovshenin

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.

0
jmarceli

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.

  • für post mit id = 17983 setze ein benutzerdefiniertes Feld mit dem Namen my_custom_order = 1
  • für post mit id = 18030 setze ein benutzerdefiniertes Feld mit dem Namen my_custom_order = 2
  • für post mit id = 18016 setze ein benutzerdefiniertes Feld mit dem Namen my_custom_order = 3
  • du verstehst den Punkt

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.

0
Bainternet

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.

0
Xhynk