详解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 会话(session 时间设定)使用入门代码
Jun 05 PHP
php 获取客户端的真实ip
Nov 30 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
php开启openssl的方法
May 15 PHP
PHP中feof()函数实例测试
Aug 23 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
利用PHPExcel实现Excel文件的写入和读取
Apr 26 PHP
php微信公众号开发之图片回复
Oct 20 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 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
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
ztree简介_动力节点Java学院整理
2017/07/19 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
python的else子句使用指南
2016/02/27 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
Keras搭建自编码器操作
2020/07/03 Python
Python如何进行时间处理
2020/08/06 Python
python如何实现图片压缩
2020/09/11 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
常见的软件开发流程有哪些
2015/11/14 面试题
中职生自荐信
2013/10/13 职场文书
中学教师请假制度
2014/02/03 职场文书
总经理助理工作职责
2014/02/06 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
学生病假条范文
2015/08/17 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
Tomcat配置访问日志和线程数
2022/05/06 Servers