我迟迟未回答这个问题,但是自从Ian从今天在wp-hackers列表上启动此线程以来,它使我认为值得回答,特别是考虑到我一直在计划将这样的功能添加到我一直在研究的某些插件中。
考虑的一种方法是检查第一页加载,以查看是否实际使用了短代码,然后将短代码的使用状态保存到后元密钥中。这是如何做:
分步操作方法
- 将
$shortcode_used
标志设置为'no'
。
- 在shortcode函数本身中,将
$shortcode_used
标志设置为'yes'
。
- 设置一个
'the_content'
挂钩优先级12
,该优先级在WordPress处理完短代码并检查发布元数据后''
使用键"_has_{$shortcode_name}_shortcode"
。(''
当帖子ID不存在帖子元键时,将返回的值。)
'save_post'
如果用户更改了简码用法,请使用钩子删除帖子元,清除该帖子的持久标记。
- 还可以在
'save_post'
挂钩中使用,wp_remote_request()
以将无阻塞的HTTP GET发送到帖子自己的永久链接,以触发首页加载和持久标记的设置。
- 最后一集
'wp_print_styles'
,检查后为元的值'yes'
,'no'
或''
使用该密钥"_has_{$shortcode_name}_shortcode"
。如果值是'no'
不服务外部。如果值是'yes'
或''
继续为外部服务。
那应该做到的。我已经编写并测试了一个示例插件,以显示这一切的工作原理。
插件代码示例
该插件会以一个[trigger-css]
短代码唤醒,该代码会将<h2>
页面上的元素设置为红色白色,因此您可以轻松地看到它正在工作。假定一个css
子目录包含其中包含style.css
此CSS的文件:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
以下是工作插件中的代码:
<?php
/**
* Plugin Name: CSS on Shortcode
* Description: Shows how to conditionally load a shortcode
* Author: Mike Schinkel <mike@newclarity.net>
*/
class CSS_On_Shortcode {
/**
* @var CSS_On_Shortcode
*/
private static $_this;
/**
* @var string 'yes'/'no' vs. true/false as get_post_meta() returns '' for false and not found.
*/
var $shortcode_used = 'no';
/**
* @var string
*/
var $HAS_SHORTCODE_KEY = '_has_trigger-css_shortcode';
/**
*
*/
function __construct() {
self::$_this = $this;
add_shortcode( 'trigger-css', array( $this, 'do_shortcode' ) );
add_filter( 'the_content', array( $this, 'the_content' ), 12 ); // AFTER WordPress' do_shortcode()
add_action( 'save_post', array( $this, 'save_post' ) );
add_action( 'wp_print_styles', array( $this, 'wp_print_styles' ) );
}
/**
* @return CSS_On_Shortcode
*/
function this() {
return self::$_this;
}
/**
* @param array $arguments
* @param string $content
* @return string
*/
function do_shortcode( $arguments, $content ) {
/**
* If this shortcode is being used, capture the value so we can save to post_meta in the 'the_content' filter.
*/
$this->shortcode_used = 'yes';
return '<h2>THIS POST WILL ADD CSS TO MAKE H2 TAGS WHITE ON RED</h2>';
}
/**
* Delete the 'has_shortcode' meta value so that it can be regenerated
* on first page load in case shortcode use has changed.
*
* @param int $post_id
*/
function save_post( $post_id ) {
delete_post_meta( $post_id, $this->HAS_SHORTCODE_KEY );
/**
* Now load the post asynchronously via HTTP to pre-set the meta value for $this->HAS_SHORTCODE_KEY.
*/
wp_remote_request( get_permalink( $post_id ), array( 'blocking' => false ) );
}
/**
* @param array $args
*
* @return array
*/
function wp_print_styles( $args ) {
global $post;
if ( 'no' != get_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, true ) ) {
/**
* Only bypass if set to 'no' as '' is unknown.
*/
wp_enqueue_style( 'css-on-shortcode', plugins_url( 'css/style.css', __FILE__ ) );
}
}
/**
* @param string $content
* @return string
*/
function the_content( $content ) {
global $post;
if ( '' === get_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, true ) ) {
/**
* This is the first time the shortcode has ever been seen for this post.
* Save a post_meta key so that next time we'll know this post uses this shortcode
*/
update_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, $this->shortcode_used );
}
/**
* Remove this filter now. We don't need it for this post again.
*/
remove_filter( 'the_content', array( $this, 'the_content' ), 12 );
return $content;
}
}
new CSS_On_Shortcode();
屏幕截图示例
这是一系列屏幕截图
基本帖子编辑器,无内容
帖子显示,无内容
带[trigger-css]
简码的基本帖子编辑器
使用[trigger-css]
简码发布显示
不确定是否为100%
我相信以上内容几乎可以在所有情况下使用,但是由于我只是编写了这段代码,所以我不能百分百确定。如果您发现无法使用的情况,我真的很想知道,这样我就可以修复一些我刚刚添加到其中的插件中的代码。提前致谢。