实现WordPress主题侧边栏切换功能的PHP脚本详解

作为主题的制作者, 除了实现功能, 展示界面, 还有责任使主题灵活多变, 以满足更多人不同的需求.
可能一些朋友曾为选用双栏主题 (单侧边栏) 还是三栏主题 (双侧边栏) 而烦恼过. 下面我们以 Classic 主题为例, 谈谈如何在主题中方便地切换单侧边栏和双侧边栏. 最后我会提供修改后的主题.

添加管理选项
后台处理
首先, 我们要修改 function.php, 主要的处理工作都在这个文件里面, 如果主题没有这个文件, 就创建一个吧. (没有 function.php 说明主题不支持 Widget, 可不是一个好习惯哦, 还是赶紧新建一个吧)
我的处理包括 3 大块: 获取选项, 初始化, 标签页操作界面. 这里只创建一个公告栏, 包括两个选项 (是否显示公告栏和公告栏内容). 如果要添加更多选项, 也只需要代码中 3 个 TODO 的位置上追加一些代码而已. 当然, 你还需要改一下选项名称, 将 Classic 和 classic 全部之换掉.

<?php
/**
 * 选项组类型
 */
class ClassicOptions {

 /* -- 获取选项组 -- */
 function getOptions() {
 // 在数据库中获取选项组
 $options = get_option('classic_options');
 // 如果数据库中不存在该选项组, 设定这些选项的默认值, 并将它们插入数据库
 if (!is_array($options)) {
  $options['notice'] = false;
  $options['notice_content'] = '';
  // TODO: 在这里追加其他选项
  update_option('classic_options', $options);
 }
 // 返回选项组
 return $options;
 }

 /* -- 初始化 -- */
 function init() {
 // 如果是 POST 提交数据, 对数据进行限制, 并更新到数据库
 if(isset($_POST['classic_save'])) {
  // 获取选项组, 因为有可能只修改部分选项, 所以先整个拿下来再进行更改
  $options = ClassicOptions::getOptions();

  // 数据限制
  if ($_POST['notice']) {
  $options['notice'] = (bool)true;
  } else {
  $options['notice'] = (bool)false;
  }
  $options['notice_content'] = stripslashes($_POST['notice_content']);

  // TODO: 在这追加其他选项的限制处理

  // 更新数据
  update_option('classic_options', $options);

 // 否则, 重新获取选项组, 也就是对数据进行初始化
 } else {
  ClassicOptions::getOptions();
 }

 // 在后台 Design 页面追加一个标签页, 叫 Current Theme Options
 add_theme_page("Current Theme Options", "Current Theme Options", 'edit_themes', basename(__FILE__), array('ClassicOptions', 'display'));
 }

 /* -- 标签页 -- */
 function display() {
 $options = ClassicOptions::getOptions();
?>

<form action="#" method="post" enctype="multipart/form-data" name="classic_form" id="classic_form">
 <div class="wrap">
 <h2><?php _e('Current Theme Options', 'classic'); ?></h2>

 <!-- 公告栏 -->
 <table class="form-table">
  <tbody>
  <tr valign="top">
   <th scope="row">
   <?php _e('Notice', 'classic'); ?>
   <br/>
   <small style="font-weight:normal;"><?php _e('HTML enabled', 'classic') ?></small>
   </th>
   <td>
   <!-- 是否显示公告栏 -->
   <label>
    <input name="notice" type="checkbox" value="checkbox" <?php if($options['notice']) echo "checked='checked'"; ?> />
    <?php _e('Show notice.', 'classic'); ?>
   </label>
   <br/>
   <!-- 公告栏内容 -->
   <label>
    <textarea name="notice_content" cols="50" rows="10" id="notice_content" style="width:98%;font-size:12px;" class="code"><?php echo($options['notice_content']); ?></textarea>
   </label>
   </td>
  </tr>
  </tbody>
 </table>

 <!-- TODO: 在这里追加其他选项内容 -->

 <!-- 提交按钮 -->
 <p class="submit">
  <input type="submit" name="classic_save" value="<?php _e('Update Options »', 'classic'); ?>" />
 </p>
 </div>

</form>

<?php
 }
}

/**
 * 登记初始化方法
 */
add_action('admin_menu', array('ClassicOptions', 'init'));

?>

前台处理

要公告栏在首页上显示, 需要修改一下 index.php, 这个比较简单, 只是通过一些判断语句决定东西要不要显示出来而已. 当然, 你可以进行其他操作, 关键是获取到选项的值, 并对它们进行处理.
其实可以分为两步:

获取选项 (对每个 PHP 文件, 获取一次就行了, 可以在文件顶部执行)
对选项进行处理 (这里判断成立的话就将公告内容显示出来)

<!-- 获取选项 -->
<?php $options = get_option('classic_options'); ?>

<!-- 如果用户选择显示公告栏, 并且公告栏有内容, 则显示出来 -->
<?php if($options['notice'] && $options['notice_content']) : ?>
 <div id="notice">
 <div class="content"><?php echo($options['notice_content']); ?></div>
 </div>
<?php endif; ?>

可以使用管理项来控制侧边栏的数量, 在主题文件中获取侧边栏的数量, 对不同的数量作出不同的处理, 以达到在不同数量侧边栏之间切换的目的.

// 侧边栏数量, 默认为单侧边栏
$options['sidebar'] = 1;
// 获得最新提交的值
$options['sidebar'] = $_POST['sidebar'];
<select name="sidebar" size="1">
 <!-- 单侧边栏 -->
 <option value="1" <?php if($options['sidebar'] != 2) echo ' selected '; ?>><?php _e('Single', 'classic'); ?></option>
 <!-- 双侧边栏 -->
 <option value="2" <?php if($options['sidebar'] == 2) echo ' selected '; ?>><?php _e('Double', 'classic'); ?></option>
</select>
 <?php _e('sidebar(s)', 'classic'); ?>.

添加 Widget 支持

因为要在单侧边栏和双侧边栏中切换, 所以我们需要对不同的两种模式定义两个 Widget 初始化的分支.
这里比较特殊, 为了在代码中正确获取 Widget 信息, 就算是单侧边栏也需要起一个别名. 就像代码中的 Sidebar_single. 当侧边栏个数为 1 时, 登记 Sidebar_single. 当侧边栏个数为 2 时, 登记 Sidebar_top 和 Sidebar_bottom.

// Widgets
$options = get_option('classic_options');

// 单侧边栏
if(function_exists('register_sidebar') && $options['sidebar'] == 1) {
 register_sidebar(array(
 'name' => 'Sidebar_single',
 'before_widget' => '<li id="%1$s" class="widget %2$s">',
 'after_widget' => '</li>',
 'before_title' => '<h3>',
 'after_title' => '</h3>'
 ));

// 双侧边栏
} else if(function_exists('register_sidebar') && $options['sidebar'] == 2) {
 register_sidebar(array(
  'name' => 'Sidebar_bottom',
  'before_widget' => '<li id="%1$s" class="widget %2$s">',
  'after_widget' => '</li>',
  'before_title' => '<h3>',
  'after_title' => '</h3>'
 ));
 register_sidebar(array(
  'name' => 'Sidebar_top',
  'before_widget' => '<li id="%1$s" class="widget %2$s">',
  'after_widget' => '</li>',
  'before_title' => '<h3>',
  'after_title' => '</h3>'
 ));
}

修改侧边栏结构

首先要明确, 我们现在需要双侧边栏结构. 怎样将双侧边栏变为单侧边栏呢? 只要将前一个侧边栏的结束标签和后一个侧边栏的开始标签删除, 两个侧边栏就合并为一个侧边栏了. 单纯的文字很难将我的想法和实现表达出来, 你可以接着看下面的代码和示例图片.

<ul class="sidebar_1">
 <?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('sidebar_single') ) : // single ?>

 <?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('sidebar_top') ) : // top ?>
<!-- TODO: 顶部侧边栏内容 -->
 <?php endif; // top ?>

 <?php if ($options['sidebar'] >= 2) : ?>
</ul>
<ul class="sidebar_2">
 <?php endif; ?>

 <?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('sidebar_bottom') ) : // bottom ?>
<!-- TODO: 底部侧边栏内容 -->
 <?php endif; // bottom ?>

 <?php endif; // single ?>
</ul>

OK, 这就是侧边栏代码结构了. 它可以完美得实现单双侧边栏间的切换. 但它是怎么工作的呢? 我将在后面用图片列出它的 6 种可能出现的状态.
因为主题已经支持 Widget 了, 所以代码中 function_exists('dynamic_sidebar') === true, 则 !function_exists('dynamic_sidebar') === false.
记得添加 Widget 支持时写的代码吗? 侧边栏为 1 时 sidebar_single 有效, 侧边栏为 2 时, sidebar_top 和 sidebar_bottom 有效. 这是贯穿整个思路的关键.

备注:

  • 红色: 表示选中代码的值是 false, 不通过
  • 绿色: 表示选中代码的值是 true, 通过
  • 蓝色: 表示选中部分将被选用的 widgets 所取代
  • 灰色: 表示选中部分代码将会失效

状态一: 单侧边栏, 没使用 Widget

状态二:双侧边栏, 没使用 Widget

状态三: 单侧边栏, 使用 Widget

状态四: 双侧边栏, 顶部侧边栏使用 Widget

状态五: 双侧边栏, 底部侧边栏使用 Widget

状态六: 双侧边栏, 顶部和底部侧边栏都使用 Widget

(0)

相关推荐

  • WordPress主题制作之模板文件的引入方法

    get_template_part() 用来引用模板文件,类似于 get_header().get_sidebar() 和 get_footer(),只不过这个 get_template_part() 可以引入自定义名字的文件. 使用方法 get_template_part( $slug, $name ); 参数 $slug (字符串)(必须)要引入的模板的文件名,不包括后缀名 .php,也就是如果需要引入当前主题根目录的 loop.php 文件 $slug 填写 "loop" 即可.

  • WordPress的主题编写中获取头部模板和底部模板

    get_header()(获取头部) 引入主题的头部模板,默认会引入当前主题目录里的 header.php 文件.如果指定了一个名称,则引入当前主题目录的 header-{name}.php 文件,如果需要引入的文件不存在则引入 wp-includes/theme-compat/header.php 文件. 用法 get_header( $name ); 参数 $name (字符串)(可选)要引入的文件的名称,如果指定则引入 header-{$name}.php 文件. 例子 <?php get

  • WordPress主题制作中自定义头部的相关PHP函数解析

    header_image() header_image() 函数是 WordPress 自定顶部图像的标准接口函数,该函数可以自动判断后台设置,并返回字符串形式的用户自定义顶部图像地址.本文主要涉及该函数的详解及使用. [Display header image path.] 即,显示顶部图像地址. 使用 复制代码 代码如下: <img src="<?php header_image(); ?>" width="<?php echo $header_i

  • WordPress中编写自定义存储字段的相关PHP函数解析

    WordPress 的自定义字段就是文章的 meta 信息(元信息),利用这个功能,可以扩展文章的功能,是学习 WordPress 插件开发和主题深度开发的必备知识,方便给文章储存一些额外的自定义内容. 自定义字段不光给插件开发者使用,WordPress 的特色图像.自定义页面模板等功能的信息都储存在自定义字段的表单里边. 在文章编辑器界面的 "自定义栏目" 板块可以管理除了名字开头是 "_" 的字段(没有 "自定义栏目" 板块请在右上角的 &q

  • WordPress中给文章添加自定义字段及后台编辑功能区域

    add_post_meta add_post_meta 函数是 WordPress 中用来给文章或页面添加自定义字段值的一个函数, 其用法与在编写文章时在文章编写界面中利用自定义栏目面板为文章添加自定义字段值的效果是一样的. add_post_meta函数描述 为文章添加自定义字段. 常见的使用有:文章浏览次数.喜欢按钮.seo插件等常用插件就是使用的自定义字段功能. 参数详解 add_post_meta($post_id, $meta_key, $meta_value,$unique); $p

  • 在WordPress中获取数据库字段内容和添加主题设置菜单

    get_option() 函数使用技巧 get_option()这个函数,实际上我们在整合后台功能的时候经常会用到的一个函数,主要用来从 WordPress 博客数据库 option 表中取得我们想要的字段内容的一个函数,在目前大部分的主题中,只要是主题集成了后台控制页面,也大都用到了这个函数,虽然 WP 给了我们很多方法去临时存储我们对主题的设置,但是用比较稳定的数据库去存储主题设置还是大部分主题作者的首选. get_option() 函数的解释.用法网上还是有很多中文文献的,包括官方文档该函

  • WordPress中使主题支持小工具以及添加插件启用函数

    让主题支持小工具 WordPress 的小工具(widget)是一大特色,它让用户自由拖动组合内容,而且任何插件和主题都可以添加一个额外的小工具,增加扩展性. 默认情况下,一个主题并不会支持小工具,需要主题开发者启用小工具功能并把小工具在相应的前台位置调用出来,这样用户才能在后台直接拖动生成侧边栏. 本文就来教你如何激活小工具功能,并且添加一个侧边栏,最后在前台显示出来. 注册侧边栏 默认的,后台外观下是没有 "小工具" 这个菜单按钮的,如果想要让他出现,就至少需要注册一个侧边栏,否则

  • WordPress主题中添加文章列表页页码导航的PHP代码实例

    WordPress 默认给主题开发者的建议是在文章列表底部提供上下页按钮,所以没有提供直接用在文章列表下的分页导航的函数.这里我提供一个比较完善的分页导航函数. /** *WordPress 文章列表分页导航 *http://www.endskin.com/page-navi/ */ function Bing_get_pagenavi( $query = false, $num = false, $before = '<article class="pagenavi postlistpa

  • 编写PHP脚本使WordPress的主题支持Widget侧边栏

    帮网友小改了一下主题. 任务比较简单, 只是为一个三栏主题添加对 Widget 的支持而已,就先从这次简单的案例开始说吧. 单侧边栏 functions.php <?php if( function_exists('register_sidebar') ) { register_sidebar(array( 'before_widget' => '<li class="widget">', // widget 的开始标签 'after_widget' =>

  • 实现WordPress主题侧边栏切换功能的PHP脚本详解

    作为主题的制作者, 除了实现功能, 展示界面, 还有责任使主题灵活多变, 以满足更多人不同的需求. 可能一些朋友曾为选用双栏主题 (单侧边栏) 还是三栏主题 (双侧边栏) 而烦恼过. 下面我们以 Classic 主题为例, 谈谈如何在主题中方便地切换单侧边栏和双侧边栏. 最后我会提供修改后的主题. 添加管理选项 后台处理 首先, 我们要修改 function.php, 主要的处理工作都在这个文件里面, 如果主题没有这个文件, 就创建一个吧. (没有 function.php 说明主题不支持 Wi

  • react实现antd线上主题动态切换功能

    demo 框架选择: create-react-app + mobx + webpack5 + antdesign 说明 由于最近公司有多个主题的共存性,所以需要实现线上主题切换的功能,所以本文主要描述的是基于create-react-app之上的主题切换. CSS切换 有考虑过根据用户选择的主题在切换的时候选择加载页面css文件的区分方案,但是考虑到这种形式需要在页面切换的时候去reload,因为htmlDOM是在css与JS的结合产物,用户体验不是很好. Less切换 单纯引入所有的less

  • 微信小程序换肤功能实现代码(思路详解)

    在手机.电脑使用频率如此高的当下,应用可以更换皮肤,以提升美观性,并减轻屏幕对眼睛的刺激,无疑对用户体验有很大的帮助 实现功能 要实现如上更换皮肤的效果,有几个思路: 1.准备皮肤相关的wxss,引入到app.wxss中,方便每个页面使用: 2.设置皮肤时,动态改变wxml中元素的类名或id,使页面应用对应的皮肤: 3.将选中皮肤的值保存在小程序本地缓存中,保证其他页面及下一次打开小程序时,页面展示正确的皮肤: 下面介绍一些实现的细节 wxml <view class="page"

  • Vue openLayers实现图层数据切换与加载流程详解

    目录 openlayers介绍 一.实现效果预览 二.代码实现 openlayers介绍 OpenLayers是一个用于开发WebGIS客户端的JavaScript包.OpenLayers 支持的地图来源包括Google Maps.Yahoo. Map.微软Virtual Earth 等,用户还可以用简单的图片地图作为背景图,与其他的图层在OpenLayers 中进行叠加,在这一方面OpenLayers提供了非常多的选择.OpenLayers采用面向对象方式开发. OpenLayers 是一个专

  • Gradle 依赖切换源码实践示例详解

    目录 引言 1.一般的修改办法 2.通过 Gradle 脚本动态修改依赖 2.1 配置文件和工作流程抽象 2.2 为项目动态添加子工程 2.3 使用子工程替换依赖 2.4 注意事项 总结 引言 最近,因为开发的时候经改动依赖的库,所以,我想对 Gradle 脚本做一个调整,用来动态地将依赖替换为源码.这里以 android-mvvm-and-architecture 这个工程为例.该工程以依赖的形式引用了我的另一个工程 AndroidUtils.在之前,当我需要对 AndroidUtils 这个

  • BootStrap实现带有增删改查功能的表格(DEMO详解)

    前言 bootstrap的表格样式,有类似EasyUI的表格,也有卡片式表格,放到移动端显示,各有千秋.但是BootStrap自带的表格是没有操作列的,网上的资源不少,但是都是比较单一.零碎,JS.CSS也经常给的不全,自己经过大概一个月左右的时间,把表格封装了一下,希望能分享给大家. 表格封装了3个版本,接下来给大家展示一下样式和代码. 版本一 1. 样式 表格布局: 添加:添加一行新的空白代码 修改:选中可修改的列,点击需要修改的单元格,即可变成可编辑的状态. 2.代码 @using Dat

  • 微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee',//改成你自己的链接 header: { 'Content-Type': 'application/x-www-form-urlencoded' }, method:'POST', success: function(res) { console.log(res.data); console.lo

  • Android Studio搜索功能(查找功能)及快捷键图文详解

    1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[find],开始在整个工程内查找该字符串 查找结果如下: 3.查找类[Ctrl+N] 4.查找文件[Ctrl+Shift+N] 5.查找项目中的方法或变量[Ctrl+Shift+Alt+N] 6.查找类/方法/变量引用的地方 先定位光标 右键选择"Find Usages"(快捷键Alt+F7)

  • 微信推送功能实现方式图文详解

    推送的方式: 短信推送(第三方) 邮件推送 微信推送 公众号:认证的公众号(个人的认证公众号每天只能发一篇文章),粉丝可以跟公众号聊天,未认证公众号 服务号:企业认证(营业执照),沙箱环境测试主动给用户发消息(推送),用户要接收到推送消息前提是需要关注对应的服务号才行 企业号 微信小程序 微信推送的流程: 微信沙箱环境:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 使用pycharm打开微信推送demo,然后进行相关修

  • 移动端滑动切换组件封装 vue-swiper-router实例详解

    具体代码如下所述: <strong>组件部分</strong> <template> <div class="main"> <div class="page-tab"> <div :class="nowPath == item.path ? 'tab-item tab-item_active' : 'tab-item'" v-for='(item, index) in tabLis

随机推荐