2

我正在用 Wordpress 设计一个网站。该站点是所有页面都打印在主页上并且菜单滚动到锚点的视差站点之一。

话虽如此,我正在使用 wp_query 来拉出主菜单中的所有页面。此外,我在内容中使用的简码也需要使用 wp_query。

我遇到的问题是短代码(嵌入的 wp_query)搞砸了 postdata。我知道在使用 wp_query 时,您通常希望使用 wp_reset_postdata 但在这种特殊情况下它不起作用,因为此函数调用将恢复主页的 postdata 而不是当前正在运行的 wp_query (对不起,如果我不清楚) .

有没有办法拍摄 postdata 的快照,然后在我的简码之后恢复?我正在寻找类似的东西:

function my_shortcode() {
    save_postdata(); //saves the current postdata
    $query = new WP_Query();
    while( $query->have_posts() )   {
        $query->the_post();
        echo get_the_title();
    }
    my_wp_reset_postdata(); //restores the postdata to where it was before the loop
}
4

3 回答 3

1

通过查看 for 的源代码wp_reset_query(),您会看到它所做的只是$wp_query从另一个全局变量中恢复全局变量($wp_the_query- 这是与 for 的初始设置一起设置的$wp_query,因此它保存了原始查询)。

你可以做的是你可以简单地分配$wp_query给一个不同的全局变量,然后再恢复它。这是一个例子:

function _save_query( $var = '_wp_query' ) {
    $GLOBALS[ $var ] = $GLOBALS['wp_query'];
}

function _wp_reset_query( $var = '_wp_query' ) {
    $GLOBALS['wp_query'] = $GLOBALS[ $var ];
    wp_reset_postdata();
}

因此,只需_save_query()在覆盖查询之前调用(您可以传递自定义变量名称 - 这样您就可以存储多个WP_Query对象:))。

一旦你想恢复查询数据,_wp_reset_query()再次调用 - 你可以传递一个字符串作为变量名来恢复这个确切的查询对象。

于 2012-12-12T18:22:37.653 回答
1

这就是我设法让它发挥作用的方法,归功于 Nikola 的问题,因为我完成了他的想法。

function _save_query( $var = '_wp_query' ) {
    global $post;
    $GLOBALS[ $var ] = $post;
}

function _wp_reset_query( $var = '_wp_query' ) {
    global $post;
    $post = $GLOBALS[ $var ];
    setup_postdata( $post );
}

我查看了此处找到的有关循环如何工作的文档。我决定使用与 Nikola 的答案相同的设置,因为它符合我的标准,但我使用 the_post 的实现来恢复 postdata。这可能不是很有效,因为它使用了 setup_postdata 函数(我认为这是矫枉过正),但它确实解决了我的问题。

因此,现在当我嵌入 wp_query 时,我可以执行以下操作:

_save_query();
$products = new WP_Query( $args );
if( $products->have_posts() ) {
    $ob .= '<ul class="group-posts">';
    while ( $products->have_posts() ) {
        $products->the_post();
        $ob .= '<li>'.get_the_title().'</li>';
    }
    _wp_reset_query();
    $ob .= '</ul>';
}

附带问题/说明:将答案标记为正确答案的礼仪是什么?当 Nikola 帮助我达到答案时,我会因为接受我的答案作为正确答案而感到难过?

于 2012-12-12T18:58:51.473 回答
0

my_wp_reset_postdata不存在。你必须使用wp_reset_postdata(). 但是在您必须链接多个 wp_queries 并返回旧查询的情况下,您可以将第一个查询存储在一个变量中,设置新的 WP_query,然后将其重置并返回旧查询。

$wp_query 存储当前循环。所以你可以这样做:

    $temp = $wp_query;
    $wp_query= null;
    $wp_query = new WP_Query($args);
    ...

    // then later 
    $wp_query = $temp;
    // And back on tracks !
于 2012-12-12T18:16:08.430 回答