2010-11-15 27 views
0

J'ai une base de données de film, je veux savoir quel acteur de films A et B a tous deux été en vedette dans.obtenir des postes correspondant à deux taxonomies

function getmoviefromactor(){ 
global $wp_query; 
global $wpdb; 
global $post; 
$loop = new WP_Query(array(
'post_type' => 'movies', 
'actors' => 'A', 'B', 
'posts_per_page' =>-1, 
)); 
print_r($loop); 
while ($loop->have_posts()) : $loop->the_post(); 

?> 

<h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf(esc_attr__('Permalink to %s', 'twentyten'), the_title_attribute('echo=0')); ?>" rel="bookmark"><?php the_title(); ?></a></h2> 
      <?php 
the_content(); 
endwhile; 
} 

Le problème avec ce code est que Wordpress par défaut est la recherche d'acteur A ou B et d'afficher tous les films qu'ils ont été présentés et pas seulement le film (s) ils ont tous deux été présentés dans.

Merci, Marten


EDIT: Je pense im presque là, im coincé dans une requête SQL, il fonctionne parfaitement si je cherche juste l'un des acteurs, le problème accors quand je cherche les deux, ce qui entraîne un tableau vide.

Lorsque je fais la recherche manuelle dans la requête SQL je vois le contenu en double avec différents term.slugs, est-ce qu'il y a une solution de contournement pour cela?

global $wpdb; 


$querystr = " 
       SELECT * 
       FROM $wpdb->posts 
       LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
       LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
       LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) 
       WHERE $wpdb->posts.post_type = 'movies' 
       AND $wpdb->posts.post_status = 'publish' 
       AND $wpdb->term_taxonomy.taxonomy = 'actors' 
       AND $wpdb->terms.slug = 'A' 
       AND $wpdb->terms.slug = 'B' 
       ORDER BY $wpdb->posts.post_date DESC"; 
     $pageposts = $wpdb->get_results($querystr, OBJECT); 
print_r($pageposts); 

Tous les meilleurs, Marten

Répondre

0

essayez ceci:

'actors' => array('A', 'B') 
+0

Merci, mais il ne s'agit toujours pas de n'importe quoi. Ceci est un extrait de print_r ($ loop); WP_Query Object ([query_vars] => Tableau ([post_type] => films [posts_per_page] => -1 => [actors] => tableau ([0] => A [1] => B) [erreur] => [m] => 0 [p] => 0 [post_parent] => – moffepoffe

0

Après avoir fait quelques recherches et d'expérimentation, a trouvé une façon de le faire correctement. Il implique des filtres posts_join et posts_where:

$actor1 = 'A'; 
$actor2 = 'B'; 

function join_it($join) { 
    $join = " INNER JOIN $wpdb->term_relationships tr1 ON($wpdb->posts.ID = tr1.object_id) 
       INNER JOIN $wpdb->term_taxonomy tt1 ON(tr1.term_taxonomy_id = tt1.term_taxonomy_id) 
       INNER JOIN $wpdb->terms t1 ON(tt1.term_id = t1.term_id) 
       INNER JOIN $wpdb->term_relationships tr2 ON($wpdb->posts.ID = tr2.object_id) 
       INNER JOIN $wpdb->term_taxonomy tt2 ON(tr2.term_taxonomy_id = tt2.term_taxonomy_id) 
       INNER JOIN $wpdb->terms t2 ON(tt2.term_id = t2.term_id)"; 
    return $join; 
} 

function where_it($where) { 
    global $actor1; 
    global $actor2; 
    $where = " WHERE $wpdb->posts.post_type = 'movies' 
       AND tt1.taxonomy = 'actors' 
       AND tt2.taxonomy = 'actors' 
       AND t1.slug = {$actor1} 
       AND t2.slug = {$actor2}"; 
} 

function getmoviefromactor(){ 
    global $wp_query; 
    global $wpdb; 
    global $post; 
    add_filter('posts_join','join_it',10); 
    add_filter('posts_where','where_it',10); 
    $loop = new WP_Query(); 
    remove_filter('posts_join','join_it',10); 
    remove_filter('posts_where','where_it',10); 
    print_r($loop); 
    while ($loop->have_posts()) : $loop->the_post(); 

    ?> 

    <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf(esc_attr__('Permalink to %s', 'twentyten'), the_title_attribute('echo=0')); ?>" rel="bookmark"><?php the_title(); ?></a></h2> 
      <?php 
    the_content(); 
    endwhile; 
} 

Les filtres posts_where et posts_join ajoute où et clauses de jointure respectivement à la boucle. J'ai testé un code similaire avec mon propre site, mais si cela ne fonctionne pas, faites le moi savoir.