Патч для решения проблемы выдачи старых статей в результатах поиска
В статье "Удаление старых версий статей из базы данных WordPress" я писал об особенности WordPress 2.6, а именно: о хранении старых версий статей в базе данных.
К сожалению, данная особенность WordPress очень смущает весьма популярный плагин Search Everything: при включённом поиске в тэгах или категориях из-за особенности запроса будут выдаваться статьи, помеченные как ревизии (старые версии, если говорить проще).
Привожу пример (тем, кто не готов лезть в дебри, его можно смело пропускать):
FROM wp_posts
LEFT JOIN wp_term_relationships AS trel ON (wp_posts.ID = trel.object_id)
LEFT JOIN wp_term_taxonomy AS ttax ON (
(ttax.taxonomy = 'category' OR ttax.taxonomy = 'post_tag') AND
trel.term_taxonomy_id = ttax.term_taxonomy_id
)
LEFT JOIN wp_terms AS tter ON (ttax.term_id = tter.term_id)
LEFT JOIN wp_comments AS c ON (comment_post_ID = ID)
WHERE 1 =1 AND (
(
(wp_posts.post_title LIKE '%greasemonkey%') OR
(wp_posts.post_content LIKE '%greasemonkey%') OR
(wp_posts.post_excerpt LIKE '%greasemonkey%')
)
) AND (
wp_posts.post_status = 'publish' OR
wp_posts.post_author = 1 AND wp_posts.post_status = 'private'
)
OR
(tter.name LIKE '%greasemonkey%') OR
(tter.slug LIKE '%greasemonkey%') OR
(
c.comment_post_ID = wp_posts.ID AND
c.comment_approved = '1' AND
c.comment_content LIKE '%greasemonkey%'
)
ORDER BY wp_posts.post_date DESC
LIMIT 0, 15
Запрос был получен при помощи плагина SQL Monitor (в целях повышения удобочитаемости, я изменил форматирование запроса).
Часть OR (tter.name LIKE '%greasemonkey%')
отвечает за поиск в тэгах, а OR (tter.slug LIKE '%greasemonkey%')
— за поиск в категориях.
Вся проблема в том, что если и статья, и её версии относятся к искомой категории или тэгу, то все они будут выданы в результатах поиска. На мой взгляд, это не является желаемым результатом.
Ниже приведён патч в формате unified diff, решающий данную проблему:
+++ search_everything.php 2008-08-12 00:35:18.000000000 +0300
@@ -97,6 +97,7 @@
//Duplicate fix provided by Tiago.Pocinho
add_filter('posts_request', array(&$this, 'SE4_distinct'));
+ add_filter('posts_where', array(&$this, 'SE4_exclude_revisions'), 100);
}
// Logs search into a file
@@ -138,6 +139,12 @@
return $where;
}
+ function SE4_exclude_revisions($where)
+ {
+ $where = "AND (1 = 1 {$where}) AND `post_type` != 'revision'";
+ return $where;
+ }
+
//search pages (except password protected pages provided by loops)
function SE4_search_pages($where) {
global $wp_query;