Получайте сообщения, соответствующие обеим таксономиям

У меня есть база данных фильмов, и я хочу знать, в каких фильмах снимались актеры A и B.

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

Проблема с этим кодом заключается в том, что Wordpress по умолчанию ищет актера A или B и отображает каждый фильм, в котором они были показаны, а не только фильмы, в которых они оба были показаны.

Спасибо, Мартен


РЕДАКТИРОВАТЬ: я думаю, что я почти закончил, я застрял в SQL-запросе, он отлично работает, если я просто ищу одного из актеров, проблема возникает, когда я ищу обоих, что приводит к пустой множество.

Когда я выполняю ручной поиск в SQL-запросе, я вижу дублированный контент с разными терминами. Есть ли обходной путь для этого?

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

Всего наилучшего, Мартен


person moffepoffe    schedule 15.11.2010    source источник


Ответы (2)


попробуй это:

'actors' => array('A', 'B')
person Stewie    schedule 15.11.2010
comment
Спасибо, но это все еще ничего не запрашивает. Это фрагмент из print_r($loop); Объект WP_Query ( [query_vars] =› Массив ( [post_type] =› фильмы [posts_per_page] =› -1 =› [actors] =› Array ( [0] =› A [1] =› B ) [error] =› [m] =› 0 [p] =› 0 [post_parent] =› - person moffepoffe; 15.11.2010

Покопавшись и поэкспериментировав, нашел способ сделать это правильно. Он включает фильтры posts_join и 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;
}

Фильтры posts_where и posts_join добавляют в цикл предложения where и join соответственно. Я протестировал аналогичный код на своем собственном сайте, но если он не работает, сообщите мне об этом.

person Manny Fleurmond    schedule 02.01.2011