私は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; ?>
どんな提案でも高く評価されています。
これを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);
?>
まず検索クエリがあるかどうかを確認します。コンディショナルタグを使用するには、これを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;
}