3

ウィジェット付きのワードプレスプラグインを開発中です。現在、ウィジェットの更新機能は次のようになっています。

function update($new, $old){
    $instance = $old;
    //Update Values
    $instance['element-one'] = $new['element-one'];
    $instance['element-two'] = $new['element-two'];
    $instance['element-three'] = $new['element-three'];
    $instance['element-four'] = $new['element-four'];
    //Return New Instance
    return $instance;

これは想定どおりに機能します。しかし、私は要素の長いリストを持っており、コードをきれいにするために、次のような単純な関数でそれらを実現しようとしています。

function update($new, $old){
    $instance = $old;
    //Update Values
    foreach($instance as $k => $v){
        $instance[$k] = $new[$k];
    }
    //Return New Instance
    return $instance;

これはうまくいかないようですが。この関数を使用すると、ウィジェットの値が更新されません。だから、それが私が望むように動作するかどうかをテストするために...私は正常に動作するサンプルスクリプトを書きました。スクリプトは次のとおりです。

$a = array(
  'a' => '1',
  'b' => '2',
  'c' => '3'
);

$b = array(
  'a' => 'A',
  'b' => 'B',
  'c' => 'C'
);

function swap_values($old, $new){
  $result = $old;
  foreach($result as $k => $v){
    $result[$k] = $new[$k];
  }
  return $result;
}

$res = swap_values($a, $b);
var_dump($res);

このスクリプトは正常に機能しており、配列の値を交換しますが、何らかの理由でこれはワードプレスではうまく機能していないようです。

これに取り組んでいる間に私が気付いたもう一つの奇妙なことは

  • $instanceウィジェットの配列にいくつかの要素が宣言されていてform function、更新関数がそれらを正常に機能するよう$instance['old'] = $instance['new'];に更新しているとします。また、プラグインをインストールしてアクティブ化した後、それらを使用するように更新機能を変更した場合、foreach loopそれらは正常に機能します。
  • しかし、その後、更新関数を変更してforeachループを使用するように変更した後、$instance配列に要素を追加すると、それらは更新されませんが、以前に宣言された要素は更新されます。
  • また、別のワードプレスインストールで[foreachループを使用するように更新機能を更新した後]このプラグインをインストールしてアクティブ化すると、どの要素も更新されないようです。

私が見逃している非常にマイナーなものがあると確信しています。あなたからの助けや提案は大歓迎です。

4

1 に答える 1

5

簡単な解決策を見つけました。ウィジェットの拡張機能に更新関数を含めないでください。

コアは、デフォルトとして$ new_instance変数を返すだけです(wp-includes / widgets.php):

function update($new_instance, $old_instance) {
    return $new_instance;
}

私はこれを自分のウィジェットで成功裏にテストし、独自の更新関数を作成することがユーザー入力のフィルタリングに役立つと判断しましたが、それは必要ではないようです。

于 2013-02-06T03:16:56.147 に答える