IS_Main_Query()从未在WP 4.4上调用

时间:2016-03-23 作者:Paul Cullen

我对WP开发相当陌生,但据我所知,我在我的自定义归档页面(下面)中遵循了正确的过程。如果我删除is_main_query() 它会清除菜单,并且可能会由于应用过滤器而丢失许多其他数据。

添加调试代码表明is_main_query() 是否从未返回为true?我做错了什么?

我的版本是WP 4.4,带有“Avada”主题,我还利用ACF高级自定义字段将自定义元数据添加到我的帖子中。

非常感谢您的帮助,谢谢!

<?php
    $has_searchform = true; 
    get_header();
?>
<div id="content" <?php Avada()->layout->add_class( \'content_class\' ); ?> <?php Avada()->layout->add_style( \'content_style\' ); ?>>
<?php 

function my_pre_get_posts( $query ) {
    //* if within admin, return
    if ( is_admin() ) {
        echo "Admin returning";
        return;
    }
    //* if not main query, return
    else if ( ! $query->is_main_query() ) {
        echo "Not main query";
        return;
    }
    else if ( $query->is_main_query() ) {

        echo "Main query called";

        if( (isset($_GET[\'fs_date_from\']) && $_GET[\'fs_date_from\'] != \'\')       || 
            (isset($_GET[\'fs_date_to\']) && $_GET[\'fs_date_to\'] != \'\')           || 
            (isset($_GET[\'fs_music_genre\']) && $_GET[\'fs_music_genre\'] != \'\')   ||
            (isset($_GET[\'fs_keyword\']) && $_GET[\'fs_keyword\'] != \'\')           ||
            (isset($_GET[\'fs_country\']) && $_GET[\'fs_country\'] != \'\')           ||
            (isset($_GET[\'fs_festival_category\']) && $_GET[\'fs_festival_category\'] != \'\')) {

            if(isset($_GET[\'fs_date_from\']) && $_GET[\'fs_date_from\'] != \'\') {
                $date_from      = date(\'Ymd\',strtotime(sanitize_text_field($_GET[\'fs_date_from\'])));
                $search_array[\'fs_date_from\'] = array(  \'key\'       => \'start_date\',
                                                        \'value\'     => $date_from,
                                                        \'compare\'   => \'>=\'
                                                        );
            }
            if(isset($_GET[\'fs_date_to\']) && $_GET[\'fs_date_to\'] != \'\') {
                $date_to        = date(\'Ymd\',strtotime(sanitize_text_field($_GET[\'fs_date_to\'])));
                $search_array[\'fs_date_to\'] = array(\'key\'       => \'end_date\',
                                                    \'value\'     => $date_to,
                                                    \'compare\'   => \'<=\');
            }
            $keyword        = sanitize_text_field($_GET[\'fs_keyword\']);
            if($keyword != \'\') {
                $query->set(\'s\',$keyword);
            }
            if(isset($_GET[\'fs_country\']) && $_GET[\'fs_country\'] != \'\') {
                $country = sanitize_text_field($_GET[\'fs_country\']);
                $search_array[\'fs_country\'] = array(\'key\'       => \'fs_country\',
                                                    \'value\'     => $country,
                                                    \'compare\'   => \'=\');
            }
            $music_genre    = sanitize_text_field($_GET[\'fs_music_genre\']);
            if($music_genre != \'\') {
                $tax_query[\'music_genre\'] = array(  \'taxonomy\'  => \'music_genre\',
                                                    \'field\'     => \'id\',
                                                    \'terms\'     => array($music_genre),
                                                    \'operator\'  => \'IN\');
            }
            $festival_category  = sanitize_text_field($_GET[\'fs_festival_category\']);
            if($festival_category != \'\') {
                $tax_query[\'fs_festival_category\'] = array( \'taxonomy\'  => \'festival_category\',
                                                            \'field\'     => \'id\',
                                                            \'terms\'     => array($festival_category),
                                                            \'operator\'  => \'IN\');
            }
            print_r($search_array);
            $search_array[\'relation\']   = (($date_from != \'\' && $date_to != \'\')? "AND" : "");
            $query->set(\'posts_per_page\', 10);
            $query->set(\'post_type\'     , \'festival\');
            $query->set(\'meta_query\'    , $search_array);
            $query->set(\'tax_query\'     , $tax_query);
        }   
        else {
            echo "Woop";
            $query->set(\'posts_per_page\', 10);
            $query->set(\'post_type\'     , \'festival\');
        } 
    }
}
add_action(\'pre_get_posts\', \'my_pre_get_posts\');

if( have_posts() ) {
    echo 
"<div class=\'row fusion-row\'>
    <div class=\'col-sm-12\'>
";
    fusion_pagination($pages = \'\', $range = 2);
echo 
"   </div>
</div>";
    while(have_posts()) {
        the_post();
        //setup_postdata( $post );
        $image      = get_field(\'header_image\');
        $image_url  = $image[\'sizes\'][\'medium_large\'];
        $date_format = \'dS \\o\\f F Y\';
        /*if(get_field(\'start_date\') != \'\') {
            $start_date = DateTime::createFromFormat(\'Ymd\', get_field(\'start_date\'));
        }
        else {
            $start_date = \'\';
        }
        if(get_field(\'end_date\') != \'\') {
            $end_date = DateTime::createFromFormat(\'Ymd\', get_field(\'end_date\'));   
        }
        else {
            $end_date = \'\';
        }*/
        $start_date = get_field(\'start_date\');
        $end_date   = get_field(\'end_date\');
        $vibe       = substr(get_field(\'vibe\'), 0,250)."...";
        $location   = get_field(\'location\');
        $country    = get_field(\'country\');
        //print_r($post);
        $price      = get_min_price(get_the_ID());
        echo 
"<div class=\'row fusion-row result_row\' onclick=\\"javascript:window.location.href=\'". get_permalink() ."\'; return false;\\">
    <div class=\'col-sm-5 result_thumbnail\' style=\'background: url(\\"". $image_url ."\\") center center no-repeat;\'>

    </div>
    <div class=\'col-sm-7\'>
        <h3 class=\'result_title\'><a href=\'". get_permalink() ."\'>".get_the_title()."</a></h3>
        <h4 class=\'result_location\'>$location" . (($location != \'\' && $country != \'\')? "," : "") . " $country</h4>
        <div class=\'result_vibe\'>
        ". $vibe ."
        </div>
    </div>
    <div class=\'result_bottom_row col-sm-7\'>
        <div class=\'result_dates\'>
";
        if($start_date != \'\') {
            echo $start_date;
        }
        echo  ((get_field(\'start_date\') != \'\' && get_field(\'end_date\') != \'\')? " - " : "");
        if($end_date != \'\') {
            echo $end_date;
        }
        echo 
"       </div>
        <div class=\'result_price\'>
            $price
        </div>
    </div>
</div>
";
    }       
    fusion_pagination($pages = \'\', $range = 2);
} 

else {
    echo 
"<p>Sorry, no Festivals match your search.</p>";
}


?>
</div>
<?php do_action( \'fusion_after_content\' ); ?>
<?php get_footer();

// Omit closing PHP tag to avoid "Headers already sent" issues.

3 个回复
最合适的回答,由SO网友:Paul Cullen 整理而成

谢谢你的帮助。

我需要在函数中发布代码的关键问题。php文件,需要将if语句修改为:

$query->is_main_query() && is_post_type_archive( \'festival\' )
这样只会影响我的自定义帖子类型。

谢谢

SO网友:darrinb

行动挂钩pre_get_posts 在呈现页面模板之前调用。移动add_action(\'pre_get_posts\', \'my_pre_get_posts\'); 还有你的my_pre_get_posts() 主题的功能functions.php 文件

SO网友:Pieter Goosen

下面是代码的一些注释:

切勿在模板中添加业务逻辑。模板不应用于计算任何类型的逻辑,模板应仅显示该逻辑的结果。简而言之,模板应该知道函数名,就是这样。函数本身应该在插件或主题的函数文件中定义

设置模板时(通过template_include),主查询已经执行,只是一个遥远的内存。到目前为止,无法更改主查询。这就是为什么您的操作对主查询没有影响。如前所述,函数(包括过滤器和操作)应位于插件或函数文件中

而不是做isset($_GET[\'fs_date_from\']) && $_GET[\'fs_date_from\'] != \'\') 每次您需要它时,只需使用filter_input, 它将负责检查var是否已设置,如果已设置,则返回值。您可以另外设置一个过滤器,为您提供卫生服务

$fs_date_from = filter_input( 
    INPUT_GET,             // $_GET Global , for $_POST it will be INPUT_POST
    \'fs_date_from\',        // Name of the variable
    FILTER_SANITIZE_STRING // Type of filter to use to validate/sanitize
);
你现在可以检查一下$fs_date_from 有一个值

if ( $fs_date_from ) {
    // Do something
}
您还可以查看filter_input_array 处理多个$_GET 变量值

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the