一、概念描述
- 菜单可见性:就是让设定的某个菜单中的某个菜单项满足设定条件时的可见或不可见状态
- 小工具条件判断:让设定的某个小工具在满足设定条件时的可见或不可见状态
好处:可以使菜单和小工具的显示与调用更加灵活,不必因为某个小小的需求而额外添加一个菜单或小工具组。
二、后台添加功能项
首先:打开【inc/options/begin-options.php】文件,在适当位置添加
$options[] = array( 'name' => '', 'desc' => '小工具条件判断', 'id' => 'widget_logic', 'std' => '1', 'type' => 'checkbox' ); $options[] = array( 'id' => 'clear' );
我加在了【主题选项--基本设置】选项卡里,添加后就可以在对应的位置看到这个选项了。
然后:在【inc/】目录下新建一个名为【widget-logic.php】的文件,并向该文件添加下面的代码
<?php /* Name: Widget Logic */ if (is_admin()){ add_filter( 'in_widget_form', 'begin_widget_logic_in_widget_form', 10, 3 ); add_filter( 'widget_update_callback', 'begin_widget_logic_update_callback', 10, 4); }else{ add_filter( 'sidebars_widgets', 'begin_widget_logic_filter_sidebars_widgets', 10); } function begin_widget_logic_update_callback( $instance, $new_instance, $old_instance, $this_widget ){ if ( isset( $new_instance['begin_widget_logic'] ) ) $instance['begin_widget_logic'] = $new_instance['begin_widget_logic']; return $instance; } function begin_widget_logic_in_widget_form( $widget, $return, $instance ){ $logic = isset( $instance['begin_widget_logic'] ) ? $instance['begin_widget_logic'] : begin_widget_logic_by_id( $widget->id ); ?> <p> <label for="<?php echo $widget->get_field_id('begin_widget_logic'); ?>">条件判断</label> <textarea class="widefat" name="<?php echo $widget->get_field_name('begin_widget_logic'); ?>" id="<?php echo $widget->get_field_id('begin_widget_logic'); ?>"><?php echo esc_textarea( $logic ) ?></textarea> </p> <?php return; } function begin_widget_logic_by_id( $widget_id ){ global $wl_options; if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $m ) ){ $widget_class = $m[1]; $widget_i = $m[2]; $info = get_option( 'widget_'.$widget_class ); if ( empty( $info[ $widget_i ] ) ) return ''; $info = $info[ $widget_i ]; }else $info = (array)get_option( 'widget_'.$widget_id, array() ); if ( isset( $info['begin_widget_logic'] ) ) $logic = $info['begin_widget_logic']; elseif ( isset( $wl_options[ $widget_id ] ) ){ $logic = stripslashes( $wl_options[ $widget_id ] ); begin_widget_logic_save( $widget_id, $logic ); unset( $wl_options[ $widget_id ] ); update_option( 'begin_widget_logic', $wl_options ); } else $logic = ''; return $logic; } function begin_widget_logic_save( $widget_id, $logic ){ global $wl_options; if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $m ) ){ $widget_class = $m[1]; $widget_i = $m[2]; $info = get_option( 'widget_'.$widget_class ); if ( !is_array( $info[ $widget_i ] ) ) $info[ $widget_i ] = array(); $info[ $widget_i ]['begin_widget_logic'] = $logic; update_option( 'widget_'.$widget_class, $info ); }else{ $info = (array)get_option( 'widget_'.$widget_id, array() ); $info['begin_widget_logic'] = $logic; update_option( 'widget_'.$widget_id, $info ); } } // CALLED ON 'sidebars_widgets' FILTER function begin_widget_logic_filter_sidebars_widgets( $sidebars_widgets ){ global $wl_options, $wl_in_customizer; if ( $wl_in_customizer ) return $sidebars_widgets; if ( !empty( $wl_options['begin_widget_logic-options-wp_reset_query'] ) ) wp_reset_query(); foreach($sidebars_widgets as $widget_area => $widget_list){ if ($widget_area=='wp_inactive_widgets' || empty($widget_list)) continue; foreach($widget_list as $pos => $widget_id){ $logic = begin_widget_logic_by_id( $widget_id ); if ( !begin_widget_logic_check_logic( $logic ) ) unset($sidebars_widgets[$widget_area][$pos]); } } return $sidebars_widgets; } function begin_widget_logic_check_logic( $logic ){ $logic = @trim( (string)$logic ); $logic = apply_filters( "begin_widget_logic_eval_override", $logic ); if ( is_bool( $logic ) ) return $logic; if ( $logic === '' ) return true; if ( stristr( $logic, "return" ) === false ) $logic = "return ( $logic );"; try { $show_widget = eval($logic); } catch ( Error $e ) { trigger_error( $e->getMessage(), E_USER_WARNING ); $show_widget = false; } restore_error_handler(); return $show_widget; }
这个文件主要用来实现菜单和小工具的条件判断。
三、加载widget-logic.php文件
打开【inc/load.php】文件,在适当位置添加
if (zm_get_option('widget_logic')) {require get_template_directory() . '/inc/widget-logic.php';}
你也可以将该代码添加在【inc/call.php】文件中。若你的主题中打不开这两个文件,或没有这两个文件,也可以将该代码添加在主题根目录下的【functions.php】文件中。
四、使用方法
- 菜单中的使用方法
这里我以【首页布局】这个菜单为例讲解一下如何让某个设定的菜单可见或不可见。
我想实现的是:在访问首页的时候让这个菜单不可见,在访问其他分类或页面或具体的某篇文章时这个菜单才可见。
进入菜单,并展开【首页布局】这个菜单
如上图所示,可以看到有一个可见性设置项,在此输入
! is_home()
这条代码表示仅在首页不显示。
保存后,刷新前台就可以看到,在访问首页的时候这个菜单是没有的,而访问其他页面时这个菜单就会出现,从而达到了预期的目的。
这里仅仅只是做个简单的演示,其实这个功能的作用还是比较丰富的,相关的代码会在后面详细介绍。
- 小工具中的使用方法
使用方法其实是差不多的,这里我想实现的是:让【热门标签】这个小工具只在【建博笔记】这个分类的归档页显示,而在其他分类的归档页不显示。
进入【小工具】,找到【分类列表页侧边栏】小工具组,找到【热门标签】小工具
展开这个小工具,可以看到一个【条件判断】设置项
在这个地方输入代码
is_category( array( 2 ) )
其中,2
是【建博笔记】这个分类的分类ID。
保存后,刷新前台,可以发现这个小工具只在【建博笔记】这个分类的归档页出现,而不会出现在其他分类的归档页。
五、条件判断标签代码介绍
这里介绍几个常用的条件判断标签的代码:
- 只在指定的分类页面可见:
is_category( array( 1,2,3 ) )
- 只在指定分类ID的文章正文显示:
in_category( array( 1,2,3 ) )
- 只在指定的文章正文页面可见:
is_single( array( 17, 19, 1, 11 ) )
- 不在指定的文章正文页面可见:
!is_single( array( 88 ) )
- 只在指定的页面可见:
is_page( array( 42, 54, 6 ) )
- 只在指定分类ID的分类或者文章显示:
in_category( array( 1,2,3 ) )
- 只在移动端显示:
wp_is_mobile()
- 登录后不可见:
! is_user_logged_in()
- 只管理员可见:
in_array('administrator', $GLOBALS['current_user']->roles)
- 只在首页可见:
is_home()
- 在首页不可见:
! is_home()
更多WordPress条件判断标签,请 点击这里 查阅。