web-dev-qa-db-fra.com

Commande WP_Query personnalisée par post_meta et (author) user_meta

J'ai un problème que je ne pouvais pas trouver sur google et ailleurs. Pour mettre le problème dans le contexte. Je suis en train de faire un site wordpress où l'utilisateur peut mettre leur liste de tuteur pour donner un tutoriel, et je suis en train de mettre en place le système d'évaluation des tuteurs eux-mêmes et leur écoute. J'ai donc tutor_listing type de publication et chaque tutor_listing possède une méta-valeur 'post_score', et chaque tuteur (utilisateur qui met ses tutoriels) a user_meta) valeur appelée 'user_points'.

J'ai donc besoin d'un WP_Query qui obtiendra de la base de données tous les tutor_listing publiés mais triés par (post_score} _ + points_utilisateur). Juste pour souligner 'post_score}' est un post_meta du type_posttutor_listing et 'user_points' est user_meta de l'auteur de ce message (tutor_listing). Aussi, j'ai besoin de cette valeur pour montrer dans la boucle.

Je peux obtenir tous les tutor_listing par

$args = array(
    'post_type' => 'job_listing',
    'post_status' => 'publish'
);
$query = new WP_Query( $args );

Je peux obtenir le résultat de la requête personnalisée wordpress sql comme ceci:

SELECT p1.ID, p1.post_author, p1.post_title, p1.post_date, (um1.meta_value + pm1.meta_value) AS total_score
FROM $wpdb->posts p1
    JOIN $wpdb->users u1 ON (p1.post_author = u1.ID)
    JOIN $wpdb->usermeta um1 ON (um1.user_id = u1.ID)
    JOIN $wpdb->postmeta pm1 ON (pm1.post_id = p1.ID)
WHERE p1.post_type = 'tutor_listing'
AND p1.post_status = 'publish'
AND um1.meta_key = 'user_points'
AND pm1.meta_key = 'post_score'";

WP_Query peut-il fournir une telle fonctionnalité? J'ai besoin de WP_Query pour utiliser toutes ses fonctionnalités supplémentaires telles que la pagination, etc. Ou y a-t-il une manière que je pourrais tout le résultat fait avec le mon sql personnalisé donner à WP_Query?

Je vous remercie

5

WordPress 4.0 vous a permis de spécifier plusieurs paramètres orderby et de définir l'ordre de chacun indépendamment.

Comment faire? Faites simplement plusieurs références, voici une façon de le faire.

$args = array(
    'orderby' = > array(
        'title' => 'ASC',
        'date' => 'DESC',
    )
);

En savoir plus ici...

Mais seulement depuis WordPress 4.2, il est possible de faire cela avec des méta-valeurs. Regardez ce post.

1
Fleuv

Vous pouvez utiliser wpdb et toujours obtenir la fonctionnalité de pagination. Voici une bonne réponse sur le sujet:

WordPress Paginate $ wpdb-> get_results

0
RiotAct