检查WP_USER_QUERY‘INCLUDE’是否为空

时间:2017-12-27 作者:Michel

这是我的代码:

$args = array (
    \'order\'      => \'DESC\',
    \'include\'  => get_user_meta($author->ID, \'the_following_users\', true)
);

$wp_user_query = new WP_User_Query( $args );

$users = $wp_user_query->get_results();

if ( ! empty( $users ) ) {
    foreach ( $users as $user ) {
        // Get users
    }
} else {
    echo \'Error.\';
}
用户元“The\\u users”可能是空的,因此如果它是空的,则会向我提供所有注册用户,如果不为空,则会打印我需要的用户。

问题是if ( ! empty( $users ) ) { } 如果“include”为空或不为空,则不读取。我知道我可以创建一个变量,然后首先检查该变量是否为空,但我不需要这个。我想使用“$wp\\u user\\u query->get\\u results()”检查“include”是否为空。

EDIT:

正如Nicolai的回答,我们可以将get\\u user\\u元代码中的true替换为false,问题将得到解决,如果include为空,则WP-user\\u查询将返回false和print错误。

现在的问题是,如果include不为空,那么代码必须在没有任何问题的情况下工作,但这不会发生,它会忽略存储在“The\\u users”user meta中的用户,并仅打印当前用户。

下面是“the\\u users”用户元的值:

a:19:{i:0;s:2:"89";i:3;s:3:"105";i:4;s:2:"74";i:5;s:3:"111";i:6;s:3:"167";i:7;s:2:"83";i:8;s:2:"54";i:9;s:2:"87";i:10;s:2:"85";i:11;s:2:"77";i:13;s:2:"82";i:14;s:2:"60";i:15;s:3:"149";i:16;s:3:"160";i:17;s:2:"71";i:18;s:1:"3";i:19;s:1:"2";i:20;s:3:"121";i:21;s:2:"57";}
以下是我存储“the\\u users”用户元数据的方式:

$the_following_users = get_user_meta($the_follower, "the_following_users", true);

if(!in_array($user_follow_to, $the_following_users) && is_array($the_following_users)){
    $the_following_users[] = $user_follow_to;
} else {
    $the_following_users = array($user_follow_to);
}

update_user_meta($the_follower, "the_following_users", $the_following_users);

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

我认为这里的问题是,在违反这条规则的过程中,你制造了混乱和问题:

每个语句执行一件事,每行执行一条语句

再加上另一个问题:

将数组传递给存储为序列化PHP的API(安全问题)

还有一个:

始终检查您的假设

它忽略存储在“the\\u users”用户元中的用户,只打印当前用户。

最后一个是这里的杀手。从不检查上的错误值get_user_meta, 导致错误。用户不会从the_users meta,必须添加它。

在脑海中反复运行此代码,例如:

$the_following_users = \'\'; //get_user_meta($the_follower, "the_following_users", true);

if(!in_array($user_follow_to, $the_following_users) && is_array($the_following_users)){
    $the_following_users[] = $user_follow_to;
这里没有检查$the_following_users, 它可能根本不是数组,而是false 或空字符串。

因此,让我们修复保存:

$the_following_users = get_user_meta($the_follower, "the_following_users", true);
if ( empty( $the_following_users ) ) {
    $the_following_user = array();
}
然后让我们简化下一部分:

$the_following_users[] = $user_follow_to;
并修复保存,使其不存在安全风险:

$following = implode( \',\', $the_following_users );
update_user_meta($the_follower, "the_following_users", $following );
最后,让我们转到前端:

首先,我们假设get_user_meta 有效,但永远不要检查这是否正确:

$args = array (
    \'order\'      => \'DESC\',
    \'include\'  => get_user_meta($author->ID, \'the_following_users\', true)
);
如果用户以前从未跟踪过任何人怎么办?如果他们放过所有人怎么办?那会破坏一切!因此,让我们修复它并将其切换到逗号分隔的列表格式:

$include = get_user_meta($author->ID, \'the_following_users\', true);
if ( empty( $include ) ) {
    // the user follows nobody, or has not followed anybody yet!
} else {
    // turn the string into an array
    $include = explode( \',\', $include );
    $args = array (
        \'order\'      => \'DESC\',
        \'include\'  => $include
    );
    // etc...
}
最后一个注释是这样的:

foreach ( $users as $user ) {
    // Get users
}
但您从未在循环中共享代码,这可能是您遇到问题的原因。例如the_author 总是指当前帖子的作者。如果要显示有关$user, 您需要传递其ID,或使用公共属性,例如。

foreach ( $users as $user ) {
    // Get users
    echo esc_html( $user->first_name . \' \' . $user->last_name );
}

SO网友:Nicolai Grossherr

这个include 的参数WP_User_Query 需要一个数组作为参数。所以设置$single 的参数get_user_metafalse. 或者不要使用它,因为false 是默认值。

// USE
get_user_meta( $author->ID, \'the_users\', false )
// OR
get_user_meta( $author->ID, \'the_users\' )

结束

相关推荐