Задача с WP_Query

Недавно видел где-то тут было что-то похожее, но не нашел когда надо..

Суть проблемы..

Получаю записи через WP_Query, всё норм..

Но если задать фильтр в коде, то стандартно отфильтровать не выходит, из за чего в пагинации много пустых страниц получилось..

А фильтр.. это вывод определенных постов (стандартно) в которых найдена определенная фраза (тут проблема)..

while( $posts->have_posts() ){
$posts->the_post();
$id = get_the_ID();
$title = get_the_title();
$post = get_post();
$text = $post->post_content;
$text = preg_replace( '@<(' . $ignore . ')[^>]*?\>.*?</\\1>@si','',$text);
$text = preg_replace( '/\<\/?[^>]+>/U','',$text);
$n=0;
foreach($keys as $key) {
preg_match($key['search'],$text,$matches);
$text = preg_replace($key['search'],'',$text,1);
if(isset($matches[0])) {
$return .=
'<tr ' . $alternate . '>
<td class="column-name">' . $id . '</td>
<td class="column-name">' . $title . '</td>
<td class="column-name">' . $key['title'] . '</td>
<td class="column-name">' . $matches[0] . '</td>
</tr>';
$id = '';
$title = '';
$n++;
}
}
unset($text);
if($n === 0) {
$return .=
'<tr ' . $alternate . '>
<td class="column-name">' . $id . '</td>
<td class="column-name">' . $title . '</td>
<td class="column-name">X</td>
<td class="column-name">X</td>
</tr>';
} else {
$posts_count++;
$keys_count = $keys_count + $n;
}
$alternate = (empty($alternate)) ? 'class="alternate"' : '';
}

Данную проблему удалось частично решить добавив фильтр в запрос..

$args['s'] = $val;
$posts = new WP_Query($args);

..пустые страницы пагинации исчезли и проблемные (т.к. сложные параметры поиска) удалось удалить. Но при этом теперь на странице пагинации выводятся 6 (например) постов вместо 10, т.е. 10 (по умолчанию) - 4 проблемные, что терпимо, но не до конца устраивает, т.к. если будет 10 подряд проблемных постов, то мы получим пустую страницу.

Вопрос: Можно ли как то запихать свой обработчик в WP_Query или как то решить по другому, чтобы моя страница настроек плагина не конфликтовала с другими запросами на сайте.

Заметки к вопросу:
mi13 1.9 года назад

Попробывал решить задачу с помощью include, exclude, но почему то игнорит..

$posts = get_posts($args);
foreach( $posts as $post ) {
$id = $post->ID;
$title = $post->post_title;
$text = $post->post_content;
$text = preg_replace( '@<(' . $ignore . ')[^>]*?\>.*?</\\1>@si','',$text);
$text = preg_replace( '/\<\/?[^>]+>/U','',$text);
preg_match($keys[0]['search'],$text,$matches);
if( !isset($matches[0]) ) {
$exclude[] = $id;
}
unset($text);
}
unset( $posts );
}
$args['posts_per_page'] = $posts_per_page;
$args['paged'] = $paged;

if( count($exclude)>0 ) {
$args['exclude'] = $exclude;
}

$posts = new WP_Query($args);
mi13 1.9 года назад

Разобрался в итоге. Коварство wp в get_posts exclude, а в WP_Query post__not_in.

mi13 1.9 года назад

Так в итоге перебрал два раза и получил нужный результат.