web-dev-qa-db-ja.com

WP_User_Query 'include'が空かどうかを確認してください。

これは私のコードです:

$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_users'は空かもしれませんので、空の場合は登録されているすべてのユーザーに表示されます。空でない場合は必要なユーザーが表示されます。

'include'が空かどうかに関わらずif ( ! empty( $users ) ) { }が読んでいない問題、変数を作って最初にその変数が空かどうか調べることができることはわかっています'$ wp_user_query-> get_results()'を使って。

編集:

Nicolaiの答えとして、get_user_metaコードからtrueからfalseに置き換えることができ、問題は解決され、インクルードが空の場合、WP-User_Queryはfalseを返し、印刷エラーを返します。

空白が含まれていない場合、コードは問題なく動作するはずですが、 'the_users'ユーザーメタに保存されているユーザーを無視し、現在のユーザーのみを印刷するという問題は発生しません。

これが 'the_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_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);
3
Michel

ここでの問題は、この規則に違反する過程で混乱と問題が生じたことです。

文ごとに1つのこと、行ごとに1つの文を実行する

別の問題と相まって:

シリアル化されたPHPとして格納されるAPIに配列を渡す(セキュリティ上の問題)

そしてもう一つ:

常にあなたの仮定をチェックしてください

'the_users'ユーザーメタに保存されているユーザーを無視し、現在のユーザーのみを印刷します。

その最後の1つはここで殺人者です。 get_user_metaのエラー値を確認することは絶対にありません。ユーザーはthe_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;

ここでは$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を渡すか、publicプロパティをユーザーに渡す必要があります。

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

WP_User_Queryincludeパラメータは、引数として配列を期待します。そのため、$singleget_user_metaパラメータをfalseに設定します。 falseがデフォルトなので、使わないでください。

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