为什么用变量按特定日期查询返回的结果与用Harcode整数查询的结果不同?

时间:2015-01-26 作者:nuriarai

从周一到周五,我每天都有一篇博文,周末如果用户单击“今天的单词”,我需要检索上周五的博文;如果用户单击“昨天的单词”,我需要检索las周四的博文。

我已使用以下代码注册了查询变量:

 function register_query_vars ($vars) {
        $vars[] = \'dia\';
        return $vars;
    }
    add_filter(\'query_vars\',\'register_query_vars\'); 
我有一个“today word”的链接,该链接有以下url:

http://wordsexample.com/?dia=today;
然后,在pre\\u get\\u posts过滤器中,我使用一个函数的结果进行查询,该函数返回一个数组,其中包含我确切需要的年、月和日(取决于星期几和查询的var:今天或昨天)。

问题是如果我hardcode 在set\\u query\\u var中,年、月和日的整数值或字符串值查询返回所需的de post,但如果我放入变量,则查询将返回从传递日期开始的所有帖子,我只需要所需日期的帖子。

此代码运行:

function limit_posts_per_archive_page($query) {
    if (!is_admin() && $query->is_main_query()){
        if(get_query_var(\'dia\') != \'\'):  
            set_query_var(\'posts_per_page\', 1);
            set_query_var(\'posts_per_archive_page\', 1); 
            set_query_var(\'post_type\',\'post\');
            set_query_var(\'post_status\',\'publish\');
            set_query_var( \'year\', 2015 );
            set_query_var( \'month\', 1 );
            set_query_var( \'day\', 23 );
        elseif (is_home()) :
            $query->set(\'posts_per_page\', 10);
        endif;
    }
}
add_filter(\'pre_get_posts\', \'limit_posts_per_archive_page\');
此代码不运行:

function limit_posts_per_archive_page($query) {
    if (!is_admin() && $query->is_main_query()){
        if(get_query_var(\'dia\') != \'\'): 
            $dies = dies_consulta(); //returns array with the needed date
            $anyet = $dies[\'year\'];
            $meset = $dies[\'month\'];
            $diet = $dies[\'day\'];
            set_query_var(\'posts_per_page\', 1);
            set_query_var(\'posts_per_archive_page\', 1); 
            set_query_var(\'post_type\',\'post\');
            set_query_var(\'post_status\',\'publish\');
            set_query_var( \'year\', $anyet );
            set_query_var( \'month\', $meset );
            set_query_var( \'day\', $diet );
        elseif (is_home()) :
            $query->set(\'posts_per_page\', 10);
        endif;
    }
}
add_filter(\'pre_get_posts\', \'limit_posts_per_archive_page\');
我也用query->set form进行了测试,但如果我对数据进行硬编码没有问题,如果我将变量放入其中,它就不会运行,这也没关系。

$query->set(\'date_query\', array(                                        
    array(
            \'year\'  => $anyet,
            \'monthnum\' => $meset,
            \'day\'   => $diet,
        ),
    ));
或:

$query->set(\'date_query\', array(    
    array(
            \'year\'  => $dies[\'year\'],
            \'month\' => $dies[\'mon\'],
            \'day\'   => $dies[\'mday\'],
        ),
    ));
我确信我遗漏了一些东西,但我无法理解为什么变量的行为会有所不同,而且不正确。

任何想法或建议都会很高兴。

1 个回复
最合适的回答,由SO网友:OnethingSimple 整理而成

我相信你的问题是你没有把变量转换成整数。您应该尝试一下:

$query->set(\'date_query\', array(    
    array(
        \'year\'  => (int)$dies[\'year\'],
        \'month\' => (int)$dies[\'mon\'],
        \'day\'   => (int)$dies[\'mday\'],
    ),
));
或者,如果您愿意,甚至在设置查询的参数之前,您可以执行以下操作:

$anyet = intval( $dies[\'year\'] );
查询值应该是日、年、月键的整数。因此,很可能是因为您从url获得了查询变量,即字符串,如果这是从静态构建的工作查询更改为动态构建的查询的唯一内容,那么我相信如果您使用(int)或intval()将这些字符串转换为整数,您应该会做得很好。这是BillErickson提供的关于查询字符串参数的优秀资源,我经常使用它,这为我节省了很多时间。

http://www.billerickson.net/code/wp_query-arguments/

结束

相关推荐