详解WordPress中简码格式标签编写的基本方法


Posted in PHP onDecember 22, 2015

WordPress 简码是一种类似于论坛标签的东西,格式类似于把尖括号换成中括号的 Html 标签。简码很多人叫做短代码,但官方的翻译应该是简码,在这里纠正一下。

简码的开发的逻辑比较简单,主要就是添加、删除和判断,会在本文全部介绍。

简码格式

简码的格式非常灵活,可以是有属性、无属性、闭合、非闭合等等:

[example]

[example]内容[/example]

[example attr="属性" attr-hide="1"]内容[/example]

[example "属性"]

添加简码

添加简码需要使用 add_shortcode() 函数,两个属性,第一个为简码名,第二个是简码的回调函数。

add_shortcode( $tag, $func );

例如添加名为 test 的简码,回调 Bing_shortcode_test() 函数:

function Bing_shortcode_test( $attr, $content ){
  return 'Hello World!';
}
add_shortcode( 'test', 'Bing_shortcode_test' );

在文章中添加 [test] 就会输出 “Hello World!”。

从上边的例子可以看到,简码的回调函数需要接收两个参数。第一个是简码所有的属性,通过数组储存;第二个是简码的内容(闭合简码中的内容)。

移除简码

remove_shortcode() 函数可以移除一个简码,只需要指定简码的名称即可移除。

remove_shortcode( 'test' );

remove_all_shortcodes() 函数用来移除当前添加的所有简码。

remove_all_shortcodes();

判断简码

关于判断简码,有两个函数,shortcode_exists() 函数判断简码是否存在。

remove_all_shortcodes();
if( shortcode_exists( 'test' ) ) echo '简码 test 存在';//False
add_shortcode( 'test', 'Bing_shortcode_test' );
if( shortcode_exists( 'test' ) ) echo '简码 test 存在';//True

还有一个 has_shortcode() 函数,判断字符串中是否出现某某简码。

$content = '测试测试测试测试测试测试测试测试';
if( has_shortcode( $content, 'test' ) ) echo '字符串中有 test 简码';//False
$content = '测试测试测试测[test]测试[/test]试测试测试测试测试';
if( has_shortcode( $content, 'test' ) ) echo '字符串中有 test 简码';//True

执行简码

do_shortcode() 函数用来在字符串中查找简码,并在简码处调用之前添加的回调函数,把简码执行成需要的内容。

WordPress 添加的钩子:

add_filter( 'the_content', 'do_shortcode', 11 );

例子:

function Bing_shortcode_test( $attr, $content ){
  return 'Hello World!';
}
add_shortcode( 'test', 'Bing_shortcode_test' );
$content = '测试测试测试测[test]试测试测试测试测试';
echo do_shortcode( $content );//测试测试测试测Hello World!试测试测试测试测试

简码属性

简码支持各种格式的属性,接受给简码回调函数的第一个参数。如果你要给参数设置默认值,可以使用 shortcode_atts() 函数:

function Bing_shortcode_test( $attr, $content ){
  extract( shortcode_atts( array(
    'url' => 'http://www.bgbk.org',
    'hide' => false,
    'text' => '点击隐藏 / 显示'
  ), $attr ) );
  $hide = $hide ? ' style="display:none;"' : '';
  return '<a href="' . $url . '"' . $hide . '>' . $text . '</a>';
}
add_shortcode( 'test', 'Bing_shortcode_test' );

只有页面中使用了简码的时候才加载脚本
而在开发的过程中,有时会遇到这种问题:简码模块需要加载 JS 或者 CSS 脚本,而当页面没有使用简码的时候就会造成资源浪费。

比如下边的这个 Google 地图插件:

//添加简码
function Bing_add_google_map( $atts, $content ){
  //content...
}
add_shortcode( 'google_map', 'Bing_add_google_map');
 
//挂载脚本
function Bing_add_javascript(){
  wp_enqueue_script( 'map_scripts' );
}
add_action( 'wp_enqueue_scripts', 'Bing_add_javascript' );

只有在页面中使用了 [google_map] 简码的时候才需要加载脚本,这怎么做到呢?

其实很简单,只需要在简码函数触发的时候在页脚挂载脚本即可。

//添加简码
function Bing_add_google_map( $atts, $content ){
  $GLOBALS['google_map_shortcode'] = true;
  return '地图的代码';
}
add_shortcode( 'google_map', 'Bing_add_google_map');
 
//挂载脚本
function Bing_add_javascript(){
  global $google_map_shortcode;
  if( isset( $google_map_shortcode ) && $google_map_shortcode ) wp_enqueue_script( 'map_scripts' );
}
add_action( 'wp_footer', 'Bing_add_javascript' );

总结

简码是个非常强大的功能,对文章内容是一种很好的扩展,利用好可以让添加某些东西变的方便快捷。

关于简码的函数都在:wp-includes/shortcode.php 文件里,有能力的朋友可以阅读一下,了解原理。

PHP 相关文章推荐
php 短链接算法收集与分析
Dec 30 PHP
PHP抽象类 介绍
Jun 13 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 PHP
Smarty3配置及入门语法
Feb 22 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
PHP7.3.10编译安装教程
Oct 08 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 #PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
Dec 22 #PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 #PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 #PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 #PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
Dec 22 #PHP
PHP使用mkdir创建多级目录的方法
Dec 22 #PHP
You might like
Windows下安装Memcached的步骤说明
2010/04/25 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
Javascript的匿名函数小结
2009/12/31 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
react build 后打包发布总结
2018/08/24 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
python微信撤回监测代码
2019/04/29 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
Django实现celery定时任务过程解析
2020/04/21 Python
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
计算机实训报告总结
2014/11/05 职场文书
2014年关工委工作总结
2014/11/17 职场文书
英文导游词
2015/02/13 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫