_title()和_permarink()在AJAX调用上不起作用

时间:2012-11-16 作者:powerbuoy

我遇到了一个奇怪的问题。

我有一个定制的循环get_posts 正常加载页面时效果良好:

<?php
    $rows = get_posts(array(
        \'post_type\'     => \'drinks\', 
        \'numberposts\'   => -1
    ));
?>

<?php foreach ($rows as $post) : setup_postdata($post) ?>
    <?php the_post_thumbnail() ?>
    <h3><?php the_title() ?></h3>
    <?php the_content() ?>
    <?php the_permalink() ?>
<?php endforeach; wp_reset_postdata() ?>
该代码位于其自己的名为“drinks.php”的模板中。

现在,我已经设置了一个AJAX函数/URL,以使用jQuery获取此模板:

add_action(\'wp_ajax_h5b_get_user_drinks\', \'h5b_ajax_get_user_drinks\');
add_action(\'wp_ajax_nopriv_h5b_get_user_drinks\', \'h5b_ajax_get_user_drinks\');

function h5b_ajax_get_user_drinks () {
    include \'drinks.php\';
    die;
}
然而,当我用AJAX获取它时,似乎两者都不是the_title(), the_post_thumbnail()the_permalink() 工作the_content() 但似乎效果不错。

如果我var_dump($post) 在我的循环中,它拥有它应该拥有的所有数据(如标题、guid等)。

怎么会这样?

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

Try this:

function h5b_ajax_get_user_drinks() {
    return get_template_part( \'drinks\' );

    exit;
}
SO网友:Stephen Harris

你需要好好照顾$post 作为全局,请尝试:

 global $post;
<?php foreach ($rows as $post) : setup_postdata($post) ?>
    <?php the_post_thumbnail() ?>
    <h3><?php the_title() ?></h3>
    <?php the_content() ?>
    <?php the_permalink() ?>
<?php endforeach; wp_reset_postdata() ?>
这些函数中的大多数只能在循环内工作(并且在没有参数的情况下使用所有函数)。这意味着$post 指向相应的帖子。

Note: setup_postdata($post) 不能这样做!因此,您需要手动声明global $post.

公认的答案可能提供了一个更为美观的答案get_template_part(), 依次调用load_template() via公司(locate_template()). 查看源代码-这声明$post 变量作为全局变量,来自注释:

为模板文件设置globals,以确保WordPress环境在函数中可用。

因此它可以工作:)。

结束

相关推荐

如何在前端使用wp_update_post和AJAX

我一直在努力尝试在登录后在每篇帖子上实现一个前端帖子编辑器“侧栏”。您可以通过一个测试帖子看到这里发生了什么:http://www.bennettfeely.com/test-post/. 在我让它工作后,它将受到限制,因此,当然,只有具有权限的用户才能访问前端编辑器。以下是我目前使用的jQuery/Ajax的重要部分:var post_data = $(\"#editor-post-form\").serialize(); .ajax({ type: \'POST\', &