Объединить поиск по ключевым словам и налоговый запрос в wp_query

Я пытался создать пользовательский поисковый запрос, и я добился некоторого прогресса в этом, но столкнулся с другим препятствием.

Я пытаюсь объединить meta_query, поиск по ключевым словам ('s') и tax_query в wp_query с отношением 'OR'.

Благодаря этому фантастическому сообщению я получил метаданные и 's' для совместной работы: https://wordpress.stackexchange.com/questions/99849/search-that-will-look-in-custom-field-post-title-and-post-content

тем не менее, tax_query все еще доставляет мне проблемы. Я попытался добавить его с помощью того же метода, но кажется, что WordPress делает еще одну магию с tax_query, прежде чем он выводит его в запрос SQL.

Вот что я получил до сих пор:

        function add_join_wpse_news($joins) 
        {  
            global $wpdb;
            return $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)" ;
        }
        function alter_search_wpse_news($search,$qry)
        {
            global $wpdb;
            $add = $wpdb->prepare("({$wpdb->postmeta}.meta_key = '_et_builder_settings' AND CAST({$wpdb->postmeta}.meta_value AS CHAR) LIKE '%%%s%%')",$qry->get('s'));
            $pat = '|\(\((.+)\)\)|';
            $search = preg_replace($pat,'(($1 OR '.$add.'))',$search);
            return $search;
        }
        function alter_groupby_wpse_news($groupby)
        {
            global $wpdb;

            $mygroupby = "{$wpdb->posts}.ID";
            if( preg_match( "/$mygroupby/", $groupby )) {
                // grouping we need is already there
                return $groupby;
            }

            if( !strlen(trim($groupby))) {
                // groupby was empty, use ours
                return $mygroupby;
            }

            // wasn't empty, append ours
            return $groupby . ", " . $mygroupby;
        }
        add_filter('posts_join','add_join_wpse_news');
        add_filter('posts_search','alter_search_wpse_news',1,2);
        add_filter('posts_groupby', 'alter_groupby_wpse_news' );

        $args_condensed = array
        (
            'post_type' => 'news',
            'paged' => $paged,
            's' => $getname,
        );
        $the_query = new WP_Query($args_condensed);
        $max_pages = $the_query->max_num_pages;
        echo $GLOBALS['the_query']->request;

И это работает. Тем не менее, он не включает в себя поиск по тегам или категориям. Я попытался добавить его вручную через фильтр posts_join и posts_search, но потом понял, что wordpress сравнивает значения в tax_query ПЕРЕД выводимым SQL-запросом, что вызывает проблемы при попытке добавить его.

Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ: для пояснения, я пытаюсь добавить в:

'tax_query' => array
            (
                'relation' => 'OR',
                array //Search Tag
                (
                    'taxonomy' => 'post_tag',
                    'field' => 'slug',
                    'terms' => array($getname)
                ),
                array //Search Category
                (
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => array($getname),
                ),
                array //Search Category (Single Words)
                (
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => explode(" ",$getname),
                ),
                array //Search Tag (Single Words)
                (
                    'taxonomy' => 'post_tag',
                    'field' => 'slug',
                    'terms' => explode(" ",$getname),
                )
            ),

но с отношением типа OR в отличие от отношения AND, добавляемого по умолчанию.

1 ответ

Решение

Вы не можете использовать tax_query для этой цели. Вы должны отменить фильтр, предоставленный WordPress для выполнения этой миссии. Вот мой код Надеюсь, это поможет:

    function add_join_wpse_news($joins)
    {
        global $wpdb;
        $joins = $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)" ;
        $joins .= " inner join  {$wpdb->term_relationships}  as wrel on {$wpdb->posts}.ID = wrel.object_id";
        $joins .= " inner join {$wpdb->term_taxonomy} as wtax on wtax.term_taxonomy_id = wrel.term_taxonomy_id";
        $joins .= " inner join {$wpdb->terms} as wter on wter.term_id = wtax.term_id";

        return $joins;

    }
    function add_where_wpse_news($where) {
        $getname = 'what you want';
        return $where. ' AND '. "wter.slug like '%$getname%' ";
    }
    add_filter('posts_join','add_join_wpse_news');
    add_filter('posts_where','add_where_wpse_news');

Я просто добавляю posts_where и изменяю фильтр posts_join.

Другие вопросы по тегам