Benutzerdefinierte Post-Typ-Reihenfolge nach geändertem Datum und benutzerdefiniertem Meta-Feld-Problem

Ich erstelle ein Plugin mit einer Art von Angeboten, die Benutzer veröffentlichen können. Der Benutzer kann in seinem benutzerdefinierten Administrationsbereich seine eigenen Angebote verwalten. Angebote sind kostenlos und Premium. Wenn das Angebot Premium ist, findet es oberhalb der kostenlosen Angebote in der ganzen Liste statt. Der Nutzer kann Premium-Angebote täglich aktualisieren, sodass das Angebot, das aktualisiert wurde, ganz oben auf der Liste steht.

Ich habe es folgendermaßen herausgefunden: Angebote haben custom fields "premium" und wenn das Angebot “Premium” ist, ist der Wert “2”, ansonsten (kostenloses Angebot) ist der Wert “1”.

Wenn der Nutzer sein Premium-Angebot 'post_modified' wird 'post_modified' geändert.

Welche Art von Abfrage muss ich durchführen, um dies zu erreichen: neueste (mit spätestem Änderungsdatum) Premium-Angebote (mit benutzerdefiniertem Meta “Premium” gleich “2”) oben auf der Liste und anderen Angeboten darunter.

Meine aktuelle Abfrage sieht folgendermaßen aus:

 $args = array( 'post_type' => 'mycustomposttype', 'post_status' => 'publish', 'paged' => $paged, 'meta_key' => 'premium', 'orderby' => 'modified meta_value_num', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'paid', 'value' => array('paid','free'), 'compare' => 'IN' ) ), ); 

aber das neueste Angebot ist am Ende der Liste. sogar wenn ich den Auftrag in ‘DESC’ änderte. Jede Hilfe (oder neuer Weg, dies zu tun) wird sehr geschätzt werden.

Solutions Collecting From Web of "Benutzerdefinierte Post-Typ-Reihenfolge nach geändertem Datum und benutzerdefiniertem Meta-Feld-Problem"

Wenn ich Sie verstehe, glaube ich, dass das Folgende tun wird, was Sie brauchen:

 function orderby_mod_wpse_140999($orderby) { remove_action('posts_orderby','orderby_mod_wpse_140999'); global $wpdb; return $orderby.", {$wpdb->posts}.post_modified DESC"; } add_filter('posts_orderby','orderby_mod_wpse_140999'); $args = array( 'meta_key' => 'premium', 'orderby' => 'meta_value', 'order' => 'ASC' ); $q = new WP_Query($args); var_dump($q->request); 

Die Schlüsselnamen können falsch sein und möglicherweise (wahrscheinlich) besser als pre_get_posts Aktion umgeschrieben werden.

 function orderby_mod_wpse_140999($orderby) { remove_action('posts_orderby','orderby_mod_wpse_140999'); global $wpdb; return $orderby.", {$wpdb->posts}.post_modified DESC"; } add_filter('posts_orderby','orderby_mod_wpse_140999'); function pgp_orderby_mod_wpse_140999($qry) { if ($qry->is_main_query() && is_archive()) { $qry->set('meta_key','premium'); $qry->set('orderby','meta_value'); $qry->set('order','ASC'); } } add_action('pre_get_posts','pgp_orderby_mod_wpse_140999'); 

Noch einmal, ich vermute ein bisschen. Für die pre_get_posts Lösung müsste der Code irgendwo pre_get_posts , damit der Hook auf die Hauptabfrage angewendet werden kann.