覆盖没有挂钩的全局查询结果

时间:2016-01-22 作者:user1889580

我有一个定制的php页面,我需要重写全局posts变量,但我无法让它工作。当通过主循环时,我可以覆盖全局帖子,但我无法覆盖have\\u posts()用于获取计数的任何内容。Im从第三方API获取数据,因此我需要动态构建WP对象,然后覆盖从默认查询返回的默认对象。我有以下代码及其工作原理,但问题是我得到的结果包含post,然后是几个空对象。

require_once(\'../../../wp-blog-header.php\');

global $post, $posts, $found_posts, $post_count;

$post->ID = 99999999999;
$post->post_content = "TEST PAGE content";
$post->post_title = "Page Title";
$post->post_name = "test";

$posts = array($post);
$post_count = 1;
$found_posts = 1;

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post(); 
        var_dump($post);
    }
}
上述代码生成以下输出。我需要去掉空值。为此,我需要使have\\u posts()只返回true一次。

object(WP\\u Post)#2975(24){[“ID”]=>int(999999999)[“Post\\u author”]=>string(1)”1“[“Post\\u date”]=>string(19)”2016-01-21 19:50:24“[“Post\\u date\\u gmt”=>string(19)”2016-01-21 19:50:24“[“Post\\u content”=>string(17)”测试页面内容“[“Post\\u title”]=>string(10)”页面标题“[“Post\\u摘录”]=>。字符串(0)“[“Post\\u status”]=>字符串(7)“publish”[“comment\\u status”]=>字符串(6)“closed”[“ping\\u status”]=>string(6)“closed”[“post\\u password”]=>string(0)”“[“post\\u name”]=>string(4)”test“[“to\\u ping”]=>string(0)”“[“pinged”]=>string(0)”“[“post\\u modified”=>string(19)”2016-01-21 19:50:24“[“post\\u modified\\u gmt”=>string(19)”2016-01-21 19:50:24“[“post\\u content\\u filtered”]=>string(0)”“[“post\\u u父项“]=>int(0)[“guid”]=>string(36)”“[“menu\\u order”]=>int(0)[“post\\u type”]=>string(4)“page”[“post\\u mime\\u type”]=>string(0)”“[“comment\\u count”]=>string(1)“0”[“filter”]=>string(3)“raw”}NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

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

我在$wp\\U查询变量中找到了解决方案。通过获取全局变量并覆盖其中的值,我能够完全控制页面上显示的内容。这允许我生成一个来自wordpress之外的数据库的WP post对象,但不需要做任何困难的事情来显示它。

这里有一个完整的指南,解释如何做到这一点http://yomotherboard.com/how-to-add-a-custom-php-page-to-wordpress-using-a-plugin/

SO网友:Pieter Goosen

很难理解您需要在这里做什么,但您需要了解以下内容

不要将全局变量用作局部变量,这会破坏全局变量并导致循环出现问题。当您遇到问题时,也很难进行调试。唯一应该用作局部变量的全局变量是使用setup_postdata(). setup_postdata() 需要$post 全球的您只需记住重置$post 之后为全球。

使用内部可用的操作和筛选器WP_Query 更改特定查询对象的结果

一般来说$post_count 属性是根据内部的帖子数量计算的$posts. 在统计帖子之前the_posts 滤器这允许我们从$posts 大堆此处帖子数量的任何更改都将导致“$post\\u count”属性被更改

以下是WP_Query

if ( ! $q[\'suppress_filters\'] ) {
    /**
     * Filter the array of retrieved posts after they\'ve been fetched and
     * internally processed.
     *
     * @since 1.5.0
     *
     * @param array    $posts The array of retrieved posts.
     * @param WP_Query &$this The WP_Query instance (passed by reference).
     */
    $this->posts = apply_filters_ref_array( \'the_posts\', array( $this->posts, &$this ) );
}
// Ensure that any posts added/modified via one of the filters above are
// of the type WP_Post and are filtered.
if ( $this->posts ) {
    $this->post_count = count( $this->posts );
    $this->posts = array_map( \'get_post\', $this->posts );
    if ( $q[\'cache_results\'] )
        update_post_caches($this->posts, $post_type, $q[\'update_post_term_cache\'], $q[\'update_post_meta_cache\']);
    $this->post = reset( $this->posts );
} else {
    $this->post_count = 0;
    $this->posts = array();
}
如果要将帖子添加到返回的帖子数组中,可以在此处执行此操作

add_filter( \'the_posts\', function ( $posts, \\WP_Query $q )
{
    if ( !$q->is_main_query ) // Only target the main query, return if not. Add any additional conditions
        return $posts;

    $post_to_add = [
        // Valid post properties
    ]; 

    $post_to_add = array_map( \'get_post\', $post_to_add );

    // Add some checks to make sure our $post_to_inject is a valid.

    // Add $post_to_add in front of $posts array
    $posts = array_merge( $post_to_add, $posts );

    // If you need to replace $posts with your object
    //$posts = [$post_to_add];

    return $posts;
}, 10, 2 );
$post$posts 数组,所以也没有必要去摆弄它。

至于$found_posts 您可以使用found_posts 筛选以调整找到的帖子数量

add_filter( \'found_posts\', function ( $found_posts, \\WP_Query $q )
{
        if ( !$q->is_main_query ) // Only target the main query, return if not. Add any additional conditions
            return $found_posts;

    $found_posts = 1; // Taken info from your question

    return $found_posts;
}):    
正如我所说,我并不特别确定你需要做什么,但我希望我确实触及了你所追求的要点

相关推荐

致命错误:未捕获错误:无法将WP_ERROR类型的对象用作/../plugins/rm-payment.php中的数组

我使用2个WordPress站点、1个WordPress站点到2个WordPress站点的远程支付系统。第一个是主网站;第二个网站的工作方式类似于处理贝宝支付的商户网站。我们将第一个网站的用户订单详细信息提取到第二个网站,以处理贝宝付款。但在获取第二个网站的网页时出现错误,但请记住,如果重新加载它一次,问题就解决了致命错误:未捕获错误:无法将WP\\u error类型的对象用作/中的数组/插件/rm支付。php:第231行 $response = wp_remote_post( $remote_url,