patnz
  • 0
Новичок

Добавление переменных в запрос публикации

  • 0

Как добавить пользовательские переменные в запрос WordPress без необходимости дважды обращаться к базе данных. В приведенном ниже примере я хочу добавить несколько метафильтров. Весь этот код работает нормально, но я запускаю query_posts() для его выполнения. Я хочу иметь возможность добавлять в запрос до того, как он будет запущен по умолчанию, поэтому мне не нужно дважды запрашивать базу данных.

В этом я надеялся, что если я изменю $wp_query->query до его выполнения, мои изменения будут добавлены в запрос. Запрос меняется нормально, но не на выходе. Есть идеи? Спасибо.

add_action('pre_get_posts', 'my_custom_query'); 
function my_custom_query(){

if(isset($_SESSION['size']) && $_SESSION['size'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_size', 'value' => $_SESSION['size'] );
}

if(isset($_SESSION['gender']) && $_SESSION['gender'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_gender', 'value' => $_SESSION['gender'] );
}


$extraArgs = array(
    'orderby' => 'post-title',
    'paged' => get_query_var('paged')
);


if(!empty($cfilter)){ $extraArgs['meta_query'] = $cfilter; }

global $wp_query;
$wp_query->query = array_merge( $wp_query->query, $extraArgs );

}

Share
  1. Как сказал toscho, вы можете изменить запрос в pre_get_posts хуке. Этот хук получает объект запроса, передаваемый в качестве аргумента, поэтому вам не нужно читать глобальную переменную.

    add_action( 'pre_get_posts', 'wpse12692_pre_get_posts' ); 
    function wpse12692_pre_get_posts( &$wp_query )
    {
        if( isset( $_SESSION['size'] ) && $_SESSION['size'] != 'all' )
        {
            $wp_query->query_vars['meta_query'] = array(
                'key' => 'cc_size',
                'value' => $_SESSION['size'],
            );
        }
    
        if( isset( $_SESSION['gender'] ) && $_SESSION['gender'] != 'all' )
        {
            $wp_query->query_vars['meta_query'] = array(
                'key' => 'cc_gender',
                'value' => $_SESSION['gender'],
            );
        }
    
        $wp_query->query_vars['orderby'] = 'post-title';
        // The next line is redundant, get_query_vars reads it from the global $wp_query object
        $wp_query->query_vars['paged'] = get_query_var('paged');
    }
    

    Я вижу, что ваш запрос зависит от переменных сеанса. Это может затруднить пересылку ссылки на страницу кому-то другому. Вы думали о том, чтобы поместить это в URL-адрес и прочитать его оттуда? Вы можете сделать это, создав дополнительные правила перезаписи.

    • 0
  2. Присоединяйтесь к действию 'pre_get_posts' .
    Пример:

    add_action( 'pre_get_posts', 'no_sticky_on_front' );
    
    function no_sticky_on_front()
    {
        is_front_page() and $GLOBALS['wp_query']->query_vars['ignore_sticky_posts'] = TRUE;
    }
    
    • 0

Оставить ответ

You must login to add an answer.