0

素人の言葉で、私がしなければならないことは次のとおりです。

各 wordpress ユーザーについて、「FOO_」で始まるすべてのメタ キーを見つけ、すべてのメタ値を「FOO_COMBINED」という名前の新しいキーに結合します。

私の質問は WordPress に関するものですが、一般的には PHP や SQL にも当てはまると思います。これが適切なフォーラムであることを願っています。

私が見つけた関連する回答から、私は次のようなことをする必要があることを一般的に理解しています:

function combine_keys() {

    $array = // the array of (all?) user meta

    foreach ($array as $key => $value) {
        if (substr($key, 0, 4) == "FOO_") {
            // grab the $value and append it to another key??
        }
    }

}

しかし、これを WordPress 関数に変換する方法がわかりません。私get_users()はすべてのユーザーを取得することを知っています。またget_user_meta($user_id)、特定のユーザー ID のすべてのユーザー メタを取得します。しかし、それらを上記の関数に実装する方法がわかりません。利用者が多いので、効率的に行う必要があります。

私の他の質問は、いつ関数を呼び出すかです。これの目的は、CSV をエクスポートすることです。ユーザー エクスポート プラグインを使用していますが、値が改行で区切られたすべての FOO_ キーを 1 つのキーにマージする必要があるため、100 万の FOO_ 列をエクスポートする必要はありません。

** アップデート **

以下の回答を実装しようとしている私の更新されたコードを次に示します。これを functions.php に入れました。

function combine_keys( $user_id ) {

    $array    = array();
    $all_meta = get_user_meta( $user_id );

    foreach( $all_meta as $key => $meta ) {
        if( preg_match('/^WORKSHOP_/', $key) )
            $array[$key] = $meta[0];
    }

    return $array;
}

add_action('personal_options_update', function( $user_id ){
    if ( current_user_can('edit_user', $user_id) )
        update_user_meta( $user_id, 'WORKSHOP_COMBINED', combine_keys( $user_id ) );

});

これは、新しいキー (WORKSHOP_COMBINED と呼ばれる) を作成するために機能し、次のように値を正常に配列に結合します。

a:2:{s:10:"WORKSHOP_5";s:43:"テスト、2015 年 5 月 15 日、スコア: 80、時間: 30 ";s:11:"WORKSHOP_30";s:68:"Middle School Civics & Economics、2015 年 6 月 4 日、スコア: 12、時間: 43";}

しかし、次の 2 つの問題があります。

  1. プロファイルを更新するたびに、値を置き換えるのではなく、別の結合された値を WORKSHOP_COMBINED キーに追加します。add_meta ではなく update_meta と表示されていますが。なぜこれが起こっているのか知っていますか?

  2. 配列を文字列に変換したいと思います。したがって、「return $array」の代わりに、次のように内破しようとしました。

    $comma_separated = implode(",", $array); $comma_separated を返します。

しかし、それは何も返さず、値は空です。私は何を間違えましたか?ありがとうございました!

4

1 に答える 1

0

ここにあります:

function combine_keys( $user_id ) {

    $array    = array();
    $all_meta = get_user_meta( $user_id );

    foreach( $all_meta as $key => $meta ) {
        if( preg_match('/^FOO_/', $key) )
            $array[$key] = $meta[0];
    }

    return $array;
}

次のように結合キーを作成できます。

foreach (get_users() as $user) {
    $combined_meta = combine_keys( $user->ID );
    update_user_meta( $user->ID, 'FOO_COMBINED', $combined_meta );
}

いつ呼び出すかについては、CSV をエクスポートする直前に (おそらくプラグインによって提供されるフックを使用して) 実行するか、必要なときにスケジュールすることができます。

または、単一のユーザーがプロファイルを更新するときに、個人の結合キーを保存できるようにすることもできます。

add_action('personal_options_update', function( $user_id ){
    if ( current_user_can('edit_user', $user_id) )
        update_user_meta( $user_id, 'FOO_COMBINED', combine_keys( $user_id ) );
});

アップデート

新しい質問への回答:

  1. これは、 evenFOO_COMBINEDが で始まるために発生するためFOO_、配列に追加されます (申し訳ありませんが、私のせいです:)。検索パターンを に置き換える/^FOO_(?!COMBINED)/と、そのキーが除外されます。
  2. 動作するはずですが、動作しない理由がわかりません。

新しい要件を満たすようにコードを更新し、テストしました。

function combine_keys( $user_id ) {

    $array    = array();
    $all_meta = get_user_meta( $user_id );

    foreach( $all_meta as $key => $meta ) {
        if( preg_match('/^FOO_(?!COMBINED)/', $key) )
            $array[$key] = $meta[0];
    }

    return implode(',', $array);
}

add_action('personal_options_update', function( $user_id ){
    if ( current_user_can('edit_user', $user_id) )
        update_user_meta( $user_id, 'FOO_COMBINED', combine_keys( $user_id ) );

});
于 2015-04-29T01:30:03.417 に答える