非アクティブなウィジェットの数を制限する


10

「wp_inactive_widgets」サイドバーから最大10までウィジェットの数を制限しようとしています。ウィジェットの管理ページが非常に遅いためです。

add_filter('pre_update_option_sidebars_widgets', 'cleanup_inactive_widgets', 10, 2);

function cleanup_inactive_widgets($new, $old){
  if(!empty($new['wp_inactive_widgets']) && count($new['wp_inactive_widgets']) > 10)
    $new['wp_inactive_widgets'] = array_slice($new['wp_inactive_widgets'], -10, 10);

  return $new;
}

これは明らかに機能しますが、問題は、ウィジェットインスタンスがサイドバー内に存在するかどうかに関係なく、ウィジェットインスタンスオプションがデータベースに残っていることです...

誰かがウィジェットオプションを削除する方法も知っていますか?


私は解決策を見つけました:

編集:特定の状況では他のサイドバーからもウィジェットを削除しているようですが、何が原因なのかわかりません...

if(!empty($new['wp_inactive_widgets']) && count($new['wp_inactive_widgets']) > 10){

  // find out which widget instances to remove
  $removed_widgets = array_slice($new['wp_inactive_widgets'], 0, -10);

  // remove instance options
  foreach($removed_widgets as $widget_id)
    if(isset($GLOBALS['wp_registered_widgets'][$widget_id])){

      $instance = $GLOBALS['wp_registered_widgets'][$widget_id]['callback'][0]->number;
      $option_name = $GLOBALS['wp_registered_widgets'][$widget_id]['callback'][0]->option_name;

      $options = get_option($option_name);   // get options of all instances
      unset($options[$instance]);            // remove this instance's options
      update_option($option_name, $options);
    }

  // keep only the last 10 records from the inactive widgets area
  $new['wp_inactive_widgets'] = array_slice($new['wp_inactive_widgets'], -10, 10);

}
return $new;

1
これをAと書いて、承認済みとしてマークしてください。ありがとう!
カイザー2011

いいえ、正しく機能していないことがわかりました。他のサイドバーから設定を削除しているようです
onetrickpony

次に、Q。Hmから「解決策を見つけました」を削除する必要がありますか?
カイザー2011

1
更新Q.私は、私は時間があるときそれを別の試みを与えるつもりだ
onetrickpony

あなたはそれをif ( is_admin() && /* page does here */ )声明で包み込もうとしましたか?ポイントは、各リクエストのすべての場所でこれらのウィジェットをグローバルに削除していることです。OK:編集。少し考えた後、あなたの問題は、update_optionグローバルにアクセスできるものを使用することかもしれません(ウィジェットの正確な内部がわからない)。たぶん、カスタムの制限付きウィジェットオプションを更新し、非アクティブなウィジェット領域をカスタムオプションで「フィード」して干渉を回避することができます。
カイザー、

回答:


3

v3.2.1でテスト済み:

$sidebars = wp_get_sidebars_widgets();
if(count($sidebars['wp_inactive_widgets']) > 10){
    $new_inactive = array_slice($sidebars['wp_inactive_widgets'],-10,10);

    // remove the dead widget options
    $dead_inactive = array_slice($sidebars['wp_inactive_widgets'],0,count($sidebars['wp_inactive_widgets'])-10);
    foreach($dead_inactive as $dead){
        $pos = strpos($dead,'-');
        $widget_name = substr($dead,0,$pos);
        $widget_number = substr($dead,$pos+1);
        $option = get_option('widget_'.$widget_name);
        unset($option[$widget_number]);
        update_option('widget_'.$widget_name,$option);
    }

    // save our new widget setup
    $sidebars['wp_inactive_widgets'] = $new_inactive;
    wp_set_sidebars_widgets($sidebars);
}

上記のコードは、非アクティブなサイドバーを最後の10個のウィジェットに制限し、非アクティブなサイドバーのみを制限します。また、削除されたウィジェットのオプションも削除されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.