WordPress不同页面显示不同侧边栏(插件与非插件)

WordPress支持小工具,小工具组成侧边栏,但是大多数主题都是整个网站共用一个侧边栏,这往往让一些有特殊需求的人头疼。比如,你想在某个页面的侧边栏上单独投放广告,你想在某个页面的侧边栏显示特定的超链接,或者你只是想DIY一些特定的图片和文字,等等。

这里有实现WordPress在不同页面显示不同小侧边栏的两种方法。

插件:Widget Logic

发现这样一个插件 Widget Logic 十分方便,可以给每一个小工具添加简单的判断代码,让它们在不同的页面显示不同的小工具。

Widget Logic

开启之后,每一个小工具后面都会跟着一个尾巴(文本框)可以在文本框里输入判断代码

Widget Logic

一些基本的判断代码如下

  • is_home() ,仅显示在主页
  • is_single() ,仅显示在文章页
  • is_page() ,仅显示在页面
  • is_category() ,仅显示在文章分类页
  • is_tag() ,仅显示在文章标签页
  • is_archive(),仅显示在 归档页
  • is_404() ,仅显示在 404页
  • is_search() ,仅显示在搜索结果页

并且也支持逻辑字符 和&& 或|| 非!

非插件:利用模板

当然,并不是所有人都喜欢用插件的方式实现这种功能,这里写一个利用模板template添加不同sidebar的方法(个人折腾的成果)

原理简述呢,就是自己写一个小工具sidebar-n.php,再写一个模板template-x.php,把小工具挂到模板里,ok~

这里以Twenty Eleven主题为例,我们首先要“注册”一个新的sidebar,打开function.php,搜索sidebar找到如下代码:

function twentyeleven_widgets_init() {

	register_widget( 'Twenty_Eleven_Ephemera_Widget' );

	register_sidebar( array(
		'name' => __( 'Main Sidebar', 'twentyeleven' ),
		'id' => 'sidebar-1',
		'before_widget' => '<aside id="%1$s" class="widget %2$s">',
		'after_widget' => "</aside>",
		'before_title' => '<h3 class="widget-title">',
		'after_title' => '</h3>',
	) );
}

这些代码是通用的,因为每一个function.php都有。我们把这段代码扩展一下:

function twentyeleven_widgets_init() {

	register_widget( 'Twenty_Eleven_Ephemera_Widget' );

	register_sidebar( array(
		'name' => __( 'Main Sidebar', 'twentyeleven' ),
		'id' => 'sidebar-1',
		'before_widget' => '<aside id="%1$s" class="widget %2$s">',
		'after_widget' => "</aside>",
		'before_title' => '<h3 class="widget-title">',
		'after_title' => '</h3>',
	) );

register_sidebar( array(
		'name' => __( '我的小工具', 'twentyeleven' ),
		'id' => 'sidebar-n',
		'description' => __( '这里可以填一些描述性文字', 'twentyeleven' ),
		'before_widget' => '<aside id="%1$s" class="widget %2$s">',
		'before_widget' => '<aside id="%1$s" class="widget %2$s">',
		'after_widget' => "</aside>",
		'before_title' => '<h3 class="widget-title">',
		'after_title' => '</h3>',
	) );
}

新的sidebar-n就这样创建成功了,这里的n可以是任何数字,如果你现在打开后台小工具页面,就可以看到新的sidebar-n了。

但它目前只是“理论地”存在于后台,我们还要让它实际地显示在网站前台。

继续创建一个同名文件sidebar-n.php,直接复制并修改原主题sidebar.php里的代码就可以

	<?php if ( is_active_sidebar( 'sidebar-n' ) ) : ?>
		<div id="secondary" class="widget-area" role="complementary"> /*div里都是一些css规则*/
		<?php dynamic_sidebar( 'sidebar-n' ); ?>
		</div><!-- #secondary .widget-area -->
	<?php endif; ?>

然后我们要建立一个模板,调用sidebar-n。创建template-x.php,复制并修改原主题page.php里的代码就可以

<?php
/**
 * Template Name: 模板名称
 * Description: 模板描述
 */
get_header(); ?>
		<div id="primary">
			<div id="content" role="main"> /*css规则*/

				<?php while ( have_posts() ) : the_post(); ?> /*这里是主循环*/

					<?php get_template_part( 'content', 'page' ); ?>

					<?php comments_template( '', true ); ?>

				<?php endwhile; // end of the loop. ?>

			</div><!-- #content -->
		</div><!-- #primary -->
<?php get_sidebar(x); ?> /*注意这里!*/
<?php get_footer(); ?>

注意尾部是 get_sidebar(x) 而不是 get_sidebar() 把参数传递进去就ok了。

以上,大功告成。新建一个页面,选择你建立的那个模板,之后你会发现相应的侧边栏就会出现在这个页面上。

其实,相比之下用模板改的方法实在是繁琐,并且还需要对主题文件进行修改,个人写这些纯粹是为了显摆一下个人折腾的成果,因为如果你更换了主题,它也就失效了。个人更推崇使用插件的方法,这样即便更换主题,小工具的判断依然有效。