wake-up-neo.com

Benutzerdefinierte Post Type-Bestellung nach Änderungsdatum und benutzerdefiniertem Metafeld-Problem

Ich erstelle ein Plugin mit einigen 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, erfolgt es über den Gratisangeboten in der gesamten Liste. Der Benutzer kann Premium-Angebote täglich aktualisieren, sodass das aktualisierte Angebot ganz oben auf der Liste steht.

Ich habe es so herausgefunden: offers has custom fields "premium" und wenn offer "premium" ist, ist der Wert "2", andernfalls (kostenloses Angebot) ist der Wert "1".

Wenn der Benutzer sein Premium-Angebot aktualisiert, wird der 'post_modified' geändert.

Welche Art von Abfrage muss ich durchführen, um dies zu ermöglichen: Neueste (mit dem letzten Änderungsdatum) Premium-Angebote (mit benutzerdefiniertem Meta "Premium" gleich "2") oben auf der Liste und andere Angebote darunter.

Meine eigentliche 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 steht am ende der liste. Auch wenn ich die Reihenfolge auf 'DESC' geändert habe. Jede Hilfe (oder neue Möglichkeit, dies zu tun) wird sehr geschätzt.

2
Kamil

Wenn ich Sie verstehe, wird meiner Meinung nach Folgendes tun, 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 sind möglicherweise falsch und möglicherweise (wahrscheinlich) besser als pre_get_posts-Aktion umgeschrieben.

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

Auch hier rate ich ein bisschen. Für die pre_get_posts -Lösung müsste der Code an eine beliebige Stelle verschoben werden, damit der Hook auf die Hauptabfrage angewendet werden kann.

1
s_ha_dum