web-dev-qa-db-ja.com

WP Query - 検索結果にタグを含めると重複した投稿

私はIIS & SQL serverでWordPressを実行しています。いくつかのプラグインはDB ABSTRACTIONでは正しく動作しませんので、私はfunctions.phpフィルタをたくさん使っています。

検索結果にタグを含めるにはfunctions.phpに次のコードを追加しました - http://Pastebin.com/BZG20McY =

私の検索結果にタグが含まれるようになりましたが、たくさんの重複した投稿が表示されます。

WP QUERYに入る前にWHILE LOOPをフィルタリングして重複した投稿をすべて削除する方法はありますか?

これが私の基本的なループです:

<?php

$query_args = explode("&", $query_string);
$search_query = array('');

foreach($query_args as $key => $string) {
     $query_split = explode("=", $string);
     $search_query[$query_split[0]] = urldecode($query_split[1]);
} 
$search = new WP_Query($search_query);

?>


<?php if ($search->have_posts()) : ?>
     <?php while ($search->have_posts()) : $search->the_post(); ?>
          // SOME POSTS
     <?php endwhile; ?>
<?php else : ?>
// NO POSTS
<?php endif; ?>

どんな提案でも高く評価されています。

1
Iladarsda

これをWHILE LOOP内に追加すると問題が解決します。この投稿IDが配列に存在する場合は、ループ内の投稿をスキップします(つまり、同じ投稿が以前にループを通過したことを意味します)。

<?php 

    // MAKE SURE YOU DECLARE $postsIDsArray= array(); outside of the loop, on top of it
    $postID = $search->post->ID;

    // if this ID is present in the array, skip this post
    if (in_array($postID, $postsIDsArray)) continue;

    // if the ID is not present, add this ID to the array
    array_Push($postsIDsArray, $postID);

?>
1
Iladarsda

まず検索クエリがあるかどうかを確認します。コンディショナルタグを使用するには、これをpre_get_postsフィルター内で行います。検索したら、フィルタを付けます。

function wpse83602_search_query( $query )
{
    if (
        ! $query->is_search()
        OR $query->is_admin
    )
        return $query;

    add_filter( 'posts_distinct', 'wpse83602_posts_distinct' );
    return $query;
}

それならposts_distinctまたはposts_clausesフィルタを使うだけです。フィルタimを取り外します。他のクエリと競合しないようにします。

function wpse83602_posts_distinct( $clause )
{
    remove_filter( current_filter(), __FUNCTION__ );
    $clause[0] = "DISTINCT";
    return $clause;
}
1
kaiser