在函数内使用WP_Query对象

时间:2015-10-22 作者:WinterChild

我正在开发一个响应性强的WordPress主题,而不是使用框架,我已经创建了一个自己的框架。

我尽量不重复我自己(也就是说,我不想一直写额外的标记),所以我生成的HTML是在.grid-unit div 带有fluid_grid 将函数作为第一个参数的PHP函数。

我正在使用WP_Query:

function slider_template() {
    // Query Arguments
    $args = array(
        \'post_type\'      => \'slides\',
        \'posts_per_page\' => 10
    );     
    // The Query
    $the_query = new WP_Query( $args );    
    // Check if the Query returns any posts
    if ( $the_query->have_posts() ) {    
        // I\'m passing an anonymous function here, that needs to be called later on
        fluid_grid( function() {
            ?>    
            // Here goes the markup that should be printed out later   
            <?php
        } ); // Close the anonymous function, and end the fluid_grid function.
    } // End of the if statement
} // End of slider_template function
访问该页面后,我发现以下错误:

Fatal error: Call to a member function have_posts() on null in ...

我试着$the_query 全球,但结果相同($the_query 仍为空)。

有没有可能$the_query 变量在匿名函数中工作?如果是,如何?

2 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

这是基本的PHP。在我继续之前,请注意,永远不要全球化变量。Wordpress在这方面已经做了相当糟糕的工作。全球化是邪恶的,因为任何人和任何事,无论是有意还是无意,都可以改变全球变量。这使得globals成为调试的噩梦。总之,NEVER EVER 全球化

每当需要将匿名函数以外的内容传递给该函数时,应使用use() 关键字。例如,您可以尝试

function () use( $the_query )
{
    var_dump( $the_query );
}
编辑:在代码中,可以执行以下操作

fluid_grid( function() use ( $the_query )
{
    ?>    
    // Here goes the markup that should be printed out later   
    <?php
} ); 

SO网友:Chris

我不熟悉fluid_grid, 但这似乎是一个范围问题。您正在调用中创建匿名函数:

fluid_grid(function() {

});
此函数无权访问$the_query. 您需要查看是否可以将查询变量传递给函数,或者尝试将其全球化。

fluid_grid(function() {
   global $the_query;
   //do stuff 
});

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post