Задача с 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 или как то решить по другому, чтобы моя страница настроек плагина не конфликтовала с другими запросами на сайте.
Разобрался в итоге. Коварство wp в get_posts exclude, а в WP_Query post__not_in.
Так в итоге перебрал два раза и получил нужный результат.
Попробывал решить задачу с помощью 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);