web-dev-qa-db-fra.com

Rusé WP Question

J'essaie d'utiliser wp_query (ou une autre classe de requête native Wordpress) pour effectuer les opérations suivantes:

obtenir tous les messages WHERE (post_type = 'post' ET catégorie = 7) OR (post_type = 'études de cas' ET meta_key = 'homeslide' ET meta_value = 1)

Je ne suis pas sûr qu'aucun d'entre eux puisse encore gérer cela.

Essayer avec WP Requête:

$args = array (
    'relation' => 'OR',
    array(
        'meta_key' => '_homeslide', 
        'meta_value' => '1'
    ),
    array(
        'category' => '7'
    )
);

Mais je pense que "relation" ne doit être utilisé qu'avec tax_query.

Je pourrais probablement utiliser $ wpdb pour créer une requête avancée, mais je voulais voir si cela pouvait être fait avec les autres et voir s'il me manquait quelque chose d'évident.

1
digout

Ok, j'ai mis au point une solution en utilisant get_posts & query_posts pour renvoyer les tableaux pour chacun: posts et études de cas. Puis array_merged (merci pour le heads up EAMann), puis utilisez uasort () avec une fonction de comparaison personnalisée pour les trier par post_date.

Ce n'est pas la solution la plus attrayante, mais comme cela fonctionne et que je ne renvoie qu'un maximum de 5 messages au total pour chaque requête, nous le ferons.

// Collect posts
$news = get_posts(); 
$cs = query_posts( array(
    'post_type' => 'case-studies',
    'meta_key' => '_homeslide',
    'meta_value' => 'true'
));

// Merge the two arrays
$vslides = array_merge($news, $cs);

// Function to compare array elements using post_date
function compare($x, $y) {
    if ( strtotime($x->post_date) == strtotime($y->post_date) )
        return 0;
    else if ( strtotime($x->post_date) > strtotime($y->post_date) )
        return -1;
    else  
        return 1;
}

// Sort by post_date
uasort($vslides, 'compare');
0
digout

Pour ce type de requête complexe, je vous recommande d'exécuter deux requêtes, puis de fusionner les résultats.

D'abord, obtenez un tableau pour:

obtenir tous les messages WHERE (post_type = 'post' AND category = 7)

Ensuite, obtenez un tableau pour:

(post_type = 'études de cas' AND meta_key = 'homeslide' ET meta_value = 1)

Utilisez ensuite array_merge() pour combiner les tableaux et vous obtiendrez une collection répondant à vos besoins. Oui, vous faites des requêtes ... mais cela semble être une solution à court terme assez rapide/facile.

2
EAMann