有没有办法在侧边栏中只允许某些类型的小部件?

时间:2013-05-30 作者:Luigi

例如,我希望侧栏A显示nothing but one 要显示的文本小部件和侧栏Banything but 文本小部件。我该怎么做?

谢谢

2 个回复
SO网友:s_ha_dum

可以钩住sidebars_widgets 并找到哪个小部件位于哪个侧边栏中。

function dump_sidebar($a) {
  echo \'<pre>\'.var_export($a,true).\'</pre>\';
}
add_action( \'sidebars_widgets\', \'dump_sidebar\');
通过检查该数组,可以消除特定的小部件。

function limit_sidebar_wpse_101279($sidebars_widgets) {
  if (!empty($sidebars_widgets[\'sidebar-1\'])) {
    foreach ($sidebars_widgets[\'sidebar-1\'] as $k =>$v) {
      if (\'pages\' == substr($v,0,5)) {
        unset($sidebars_widgets[\'sidebar-1\'][$k]);
      }
    }
  }
  return $sidebars_widgets;
}
add_action( \'sidebars_widgets\', \'limit_sidebar_wpse_101279\');
这在前端和后端都有效,但不能防止小部件被拖到后端的错误侧栏中。也就是说,您仍然可以将小部件拖动到错误的侧栏中,使其看起来正常工作,但它将在下一页加载时被删除。要解决这个问题,您需要构造一些Javascript来防止拖动或发出某种警告。

SO网友:iEmanuele

WordPress管理面板有三个小部件区域:

所有可用的小部件注册侧栏,以便将小部件从“所有可用的小部件”或“非活动的小部件”设置为“错误的”侧栏时不可删除。widget类和标识它的id。我需要将“自定义最近帖子”小部件设置为不可删除,以便:

从以下位置拖动:可用小部件区域、非活动小部件区域

$(\'.widget\').on( \'dragcreate dragstart\', function( event, ui ){
  id =  $(this).find( \'input[name="id_base"]\').val();
  if( id == \'custom_recent_posts\' ){ //check if the widget is the right one
    $(this).draggable({
      connectToSortable: \'#primary-sidebar, #wp_inactive_widgets\'//limit drop event only to these sidebars
    })
  }
});
没关系,但活动小部件会发生什么情况?这些小部件不受“拖动”的影响,但受“排序”的影响。这一部分有点棘手,可能我的解决方案不酷,但它可以工作:)我需要将“自定义最近帖子”小部件设置为不可排序(您可以拖动,在jquery逻辑中是一种排序):

从活动窗口小部件中拖动/排序:

$( \'.widgets-sortables\' ).on( \'sortactivate sort\', function( event, ui ){
  id = $(ui.item).find( \'input[name="id_base"]\').val();
  if ( id == \'custom_recent_posts\'){//identifying the wrong or right widget

      if ( $(ui.sender).attr( \'id\' ) != \'primary-sidebar\' ){// if it\'s coming from a sidebar that is not his "right" place, set \'connectWith\' option to this sidebar and the inactive widgets area
        $(this).sortable(\'option\', \'connectWith\', \'#primary-sidebar, #wp_inactive_widgets\');
        $(this).sortable(\'refresh\');
      }else{//else set \'connectWith\' to false
        $(this).sortable(\'option\', \'connectWith\', false);
        $(this).sortable(\'refresh\');
      }

  }else{// else default behavior 
    $(this).sortable(\'option\', \'connectWith\', \'div.widgets-sortables\');
    $(this).sortable(\'refresh\');
  } 
});
我需要在我的项目中使用相同的逻辑,我现在正在测试,它似乎像预期的那样工作尝试:)希望它有帮助

结束

相关推荐

Multiple widgets in wordpress

我已经创建了一个wordpress小部件。它在小部件选项中有一个下拉列表。下拉列表包含“facebook”和“twitter”。如果管理员选择“twitter”,那么twitter关注者计数将显示在小部件中,与facebook的情况类似。使用jquery,该计数显示在id为“social count”的div中。当页面加载时,jquery ajax将获取计数并将其插入到“社交计数”中。问题是它在单个实例中运行良好。但是,如果在侧栏中添加了2个实例,则在这两个实例中都会显示最新的计数,因为我使用的是$(“.