问题描述
我需要一种方法来过滤页面/帖子内容之前加载,所以如果一个特定的短代码存在,我可以添加脚本到标题。经过多次搜索,我在 http://wpengineer.com 上碰到过
function has_my_shortcode($posts) {
if ( empty($posts) )
return $posts;
$found = false;
foreach ($posts as $post) {
if ( stripos($post->post_content, '[my_shortcode') )
$found = true;
break;
}
if ($found){
$urljs = get_bloginfo( 'template_directory' ).IMP_JS;
wp_register_script('my_script', $urljs.'myscript.js' );
wp_print_scripts('my_script');
}
return $posts;
}
add_action('the_posts', 'has_my_shortcode');
这是绝对辉煌,做了我所需要的。
现在我需要进一步扩展它,并为侧边栏做同样的事情。它可以通过特定的小工具类型,短代码,代码片段或其他任何可以确定脚本需要加载的功能。
问题是我无法弄清楚在侧边栏加载之前如何访问侧边栏内容 (相关主题将有几个侧边栏)
最佳解决方案
您可以使用功能 is_active_widget 。例如。:
function check_widget() {
if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used
wp_enqueue_script('my-script');
}
}
add_action( 'init', 'check_widget' );
要在仅加载小工具的页面中加载脚本,您必须在您的小工具类中添加 is_active_widget() 代码。例如,参见默认的最近评论小工具 (wp-includes /default-widgets.php,第 602 行):
class WP_Widget_Recent_Comments extends WP_Widget {
function WP_Widget_Recent_Comments() {
$widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
$this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops);
$this->alt_option_name = 'widget_recent_comments';
if ( is_active_widget(false, false, $this->id_base) )
add_action( 'wp_head', array(&$this, 'recent_comments_style') );
add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );
}
次佳解决方案
只是想分享一个解决方案,这使我在我的实现中变得更加多样化。而不是对各种短信进行功能检查,我修改了它,以寻找引用需要排入队列的脚本/样式函数的单个短代码。这将适用于其他类中的两种方法 (例如可能无法自己完成的插件) 和 in-scope 功能。只需将以下代码放在 functions.php 中,并将以下语法添加到您想要的特定 CSS& JS 。
页面/后缀语法:[loadCSSandJS function =「(class-> method /function name)」]
functions.php 代码:
function page_specific_CSSandJS( $posts ) {
if ( empty( $posts ) )
return $posts;
foreach ($posts as $post) {
$returnValue = preg_match_all('#[loadCSSandJS function="([A-z->]+)"]#i', $post->post_content, $types);
foreach($types[1] as $type) {
$items = explode("->",$type);
if (count($items) == 2) {
global $$items[0];
if( method_exists( $$items[0], $items[1] ))
add_action( 'wp_enqueue_scripts', array(&$$items[0], $items[1]) );
}
else if( !empty( $type ) && function_exists( $type ))
add_action( 'wp_enqueue_scripts', $type );
}
}
return $posts;
}
这也将允许您在页面上添加所需的数量。请记住,您需要一个加载方法/函数。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。