web-dev-qa-db-fra.com

Custom Post Type ordre par date de modification et problème de méta champ personnalisé

Je crée un plugin avec une sorte d'offres que les utilisateurs peuvent publier. L'utilisateur, dans son panneau d'administration personnalisé, peut gérer ses propres offres. Les offres sont gratuites et premium. Si l'offre est premium, elle se situe au-dessus des offres gratuites dans la liste complète. L'utilisateur peut actualiser quotidiennement les offres premium. L'offre actualisée a donc été placée en tête de liste.

Je l'ai compris comme ça: offer a custom fields "premium" et si offer est "premium", la valeur est "2", sinon (offre gratuite), la valeur est "1".

Lorsque l'utilisateur actualise son offre premium, le code 'post_modified' est modifié.

Quel type de requête dois-je effectuer pour que cela se produise: les offres les plus récentes (avec la date de modification la plus récente) (avec la méta personnalisée "prime" est égal à "2") en haut de la liste et les autres offres ci-dessous.

Ma requête actuelle ressemble à ceci:

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

mais la dernière offre est en fin de liste. même quand j'ai changé d'ordre en 'DESC'. Toute aide (ou nouvelle façon de le faire) sera grandement appréciée.

2
Kamil

Si je vous comprends bien, je pense que ce qui suit fera ce dont vous avez besoin:

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

Les noms de clé peuvent être incorrects et il est peut-être préférable de réécrire sous forme d'action pre_get_posts, quelque chose comme:

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

Encore une fois, je devine un peu. Pour la solution pre_get_posts, le code devrait aller quelque part qui permettra au hook de s’appliquer à la requête principale.

1
s_ha_dum