通过AJAX调用时GET_POSTS为空

时间:2016-08-11 作者:Mike

什么会导致基本get_posts() 在Ajax函数执行期间返回空数组的查询?

我有一个加载表单的前端页面。当页面加载一些帖子标题时,会填充一个下拉列表。当另一个选择列表的值更改时,通过Ajax调用填充选择列表值的相同函数。

通过Ajax调用函数时,结果是一个空数组。加载页面时,选择列表将完全填充。

通过使用error_log( var_export( $args, true ), 0 ); 我已经确认传递给函数的参数在页面加载和Ajax调用上都是相同的error_log( var_export( $addons, true ), 0 ); 我确认了页面加载的结果和Ajax调用的空数组。这也确认了通过Ajax执行正确的函数。

/**
 * Retrieve all addons.
 *
 * @since   1.4
 * @param   arr         $args   Array of arguments. See @get_posts.
 * @return  arr|bool    Addons.
 */
function mh_get_addons( $args = array() )   {

    $defaults = array(
        \'posts_per_page\' => -1,
        \'orderby\'        => \'post_title\',
        \'order\'          => \'DESC\',
        \'post_type\'      => \'mh-addon\',
        \'post_status\'    => \'publish\'
    );

    $args = wp_parse_args( $args, $defaults );
    error_log( var_export( $args, true ), 0 );
    $addons = get_posts( $args );
    error_log( var_export( $addons, true ), 0 );
    return apply_filters( \'mh_get_addons\', $addons );

} // mh_get_addons
这里是Ajax函数。正如您所看到的,我在测试时没有通过任何参数,因此我希望看到与初始页面加载相同的结果。

function mh_update_form_addon_options() {

    $addons = mh_get_addons();

    if ( ! empty( $addons ) )   {
        $result[\'type\']   = \'success\';
        $result[\'addons\'] = $addons;
    } else  {
        $result[\'type\']   = \'success\';
        $result[\'addons\'] = \'No addons\';
    }

    echo json_encode( $result );

    die();
} // mh_update_form_addon_options
add_action( \'wp_ajax_mh_update_form_addon_options\', \'mh_update_form_addon_options\' );
add_action( \'wp_ajax_nopriv_mh_update_form_addon_options\', \'mh_update_form_addon_options\' );
`

UPDATE当用户登录时,该函数现在通过Ajax调用返回结果。但是,如果未登录,则不会有结果。奇怪的是mh_get_addons() 无论用户是否登录,在页面加载时启动的函数(无ajax)都会返回结果。。。

3 个回复
SO网友:Krzysztof Grabania

要从AJAX调用中获取数据,您必须echoprint 信息技术在WordPress中,您应该使用wp_send_json() 函数以发送数据作为对调用的响应。

function mh_get_addons( $args = array() )   {

    $defaults = array(
        \'posts_per_page\' => -1,
        \'orderby\'        => \'post_title\',
        \'order\'          => \'DESC\',
        \'post_type\'      => \'mh-addon\',
        \'post_status\'    => \'publish\'
    );

    $args = wp_parse_args( $args, $defaults );
    $addons = get_posts( $args );
    wp_send_json( apply_filters( \'mh_get_addons\', $addons ) );

} // mh_get_addons

SO网友:Tom J Nowell

您是否尝试过注册REST端点,而不是使用WP AJAX API?这假设至少WP 4.5:

add_action( \'rest_api_init\', function () {
    register_rest_route( \'mike/v1\', \'/addons/\', array(
        \'methods\' => \'GET\',
        \'callback\' => \'mh_update_form_addon_options\',
    ) );
} );


function mh_update_form_addon_options( WP_REST_Request $data ) {

    $defaults = array(
        \'posts_per_page\'   => 200,
        \'orderby\'          => \'post_title\',
        \'order\'            => \'DESC\',
        \'post_type\'        => \'mh-addon\',
        \'post_status\'      => \'publish\',
        \'suppress_filters\' => false
    );

    $addons = get_posts( $args );
    $result = array();    
    if ( empty( $addons ) )   {
        return new WP_Error("No addons");
    }

    return $addons;
}
我还简化了函数,并通过删除过滤器消除了一些不确定性。我还通过设置suppress_filters 设置为false,以便缓存结果。我还添加了一个最大值,如果你以某种方式获得了100万个加载项,那么这个请求将始终失败,所以始终设置一个上限,即使这是一个愚蠢的数字,你知道它永远不会达到

请记住,在REST端点中,我们返回要发送的内容,不回显它,而是使用WP_Error 对于问题。您可以调整register_rest_route 调用以提及参数,请参阅WP API文档了解如何使用。

这只需要WP-Core,不需要WP-API插件

SO网友:Christian

你试过打全球电话吗$post 对象位于mh_get_addons() 作用

function mh_get_addons( $args = array() )   {

  global $post;

  $defaults = array(
      \'posts_per_page\' => -1,
      \'orderby\'        => \'post_title\',
      \'order\'          => \'DESC\',
      \'post_type\'      => \'mh-addon\',
      \'post_status\'    => \'publish\'
  );

  $args = wp_parse_args( $args, $defaults );
  error_log( var_export( $args, true ), 0 );
  $addons = get_posts( $args );
  error_log( var_export( $addons, true ), 0 );
  return apply_filters( \'mh_get_addons\', $addons );

  }
我还不是wordpress专家,但在使用get_posts($args) 在一个通过wp-ajax调用的函数中,您调用自己的函数的方式,这为我解决了这个问题。否则get_posts() 无法检索任何帖子信息,因此您看到的是空数组。

相关推荐

尝试在WordPress中实现AJAX注释,遇到WP错误

我试图在WordPress中为我的评论实现Ajax,使用this tutorial. 但我在将教程中的代码集成到自己的预构建主题时遇到了问题。问题是,我要么得到一个WP错误“检测到重复注释;看来你已经说过了!”或标准500错误。以下是我得到的:下面是我对ajax的评论。js文件如下所示: * Let\'s begin with validation functions */ jQuery.extend(jQuery.fn, { /* * check i