비활성 위젯 수 제한


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로 작성하여 허용 된 것으로 표시 할 수 있습니까? 감사!
카이저

아니요. 제대로 작동하지 않는다는 것을 알았 기 때문에 아니요. 다른 사이드 바에서 설정을 제거하는 것 같습니다
onetrickpony

그런 다음 Q. Hm에서 "솔루션을 찾았습니다"를 제거해야합니까?
카이저

1
업데이트 Q. 나는 시간이있을 때 그것을 다른 시도 줄거야
onetrickpony

if ( is_admin() && /* page does here */ )명세서 에 포장하려고 했습니까 ? 요점은 모든 요청에서 모든 위젯을 전역 적으로 제거한다는 것입니다. 확인 : 편집 그것에 대해 약간의 생각 후에, 당신 update_option은 전 세계적으로 액세스 할 수있는 것을 사용할 수 있습니다 (위젯의 정확한 내부 구조를 모릅니다). 어쩌면 사용자 정의 제한 위젯 옵션을 업데이트하고 비활성 위젯 영역을 사용자 정의 옵션으로 "공급"하여 간섭을 피할 수 있습니다.
kaiser

답변:


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.