Ars Longa, Vita Brevis

Патч для решения проблемы выдачи старых статей в результатах поиска

В статье "Удаление старых версий статей из базы данных WordPress" я писал об особенности WordPress 2.6, а именно: о хранении старых версий статей в базе данных.

К сожалению, данная особенность WordPress очень смущает весьма популярный плагин Search Everything: при включённом поиске в тэгах или категориях из-за особенности запроса будут выдаваться статьи, помеченные как ревизии (старые версии, если говорить проще).

Привожу пример (тем, кто не готов лезть в дебри, его можно смело пропускать):

[-]
View Code MySQL
SELECT DISTINCT SQL_CALC_FOUND_ROWS wp_posts.*
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.orig.php  2008-07-29 05:07:04.000000000 +0300
+++ 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;
Добавить в закладки
  • del.ici.ous
  • Digg
  • Furl
  • Google
  • Simpy
  • Spurl
  • Y! MyWeb
  • БобрДобр
  • Мистер Вонг
  • Яндекс.Закладки
  • Текст 2.0
  • News2
  • AddScoop
  • RuSpace
  • RUmarkz
  • Memori
  • Закладки Google
  • Писали
  • СМИ 2
  • Моё Место
  • Сто Закладок
  • Ваау!
  • Technorati
  • RuCity
  • LinkStore
  • NewsLand
  • Lopas
  • Закладки - I.UA
  • Connotea
  • Bibsonomy
  • Trucking Bookmarks
  • Communizm
  • UCA

Связанные записи

Комментарии к статье "Search Everything 4.7.1 и WordPress 2.6: отключаем поиск по старым версиям статей" »

К статье "Search Everything 4.7.1 и WordPress 2.6: отключаем поиск по старым версиям статей" комментариев нет. Может быть, Вы хотите прокомментировать статью?

RSS-фид комментариев к данной статье.
TrackBack URL: http://blog.sjinks.org.ua/wordpress/patches/308-search-everything-and-wordpress-turning-off-revision-search/trackback/

Оставить комментарий к записи "Search Everything 4.7.1 и WordPress 2.6: отключаем поиск по старым версиям статей"

XHTML: можно использовать следующие тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя