什么会导致基本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)都会返回结果。。。
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()
无法检索任何帖子信息,因此您看到的是空数组。