有一个有趣的难题。我需要为我的插件加载大约8个javascript文件和相同数量的样式。仅在运行我的简码的地方才需要这些。
我试图用print_styles和print_scripts加载它们,但是它们不能正确渲染,而且这样做会破坏xhtml验证。因此,目前它们加载在每个页面上,并且由于需要的文件数量,因此使其保持这种状态是不可行的。
在另一个项目中,我在插件的index.php文件中编写了一个函数,该函数将显示当前页面,在其中搜索我的短代码,如果找到,则将打印脚本,但这是一个丑陋的hack。
有人有任何建议或解决方案吗?
任何帮助,将不胜感激,
问候,
戴提
最佳答案
使用简码每页动态加载脚本和样式
好处
strstr()
或strpos()
慢。如果需要提取args,则应使用上面提到的简码正则表达式。 代码说明
save_post
时,才使用post_type
钩子(Hook)在页面上查找简码。 add_option()
将发现的帖子ID保存为数组,并将autoload设置为yes。然后它将使用update_option()
。 wp_enqueue_scripts
调用我们的add_scripts_and_styles()
函数。 get_option()
来检索我们的页面ID数组。如果当前$page_id
在$option_id_array
中,则它将添加脚本和样式。 请注意:我从OOP命名空间类转换了代码,所以我可能错过了一些东西。如果我愿意,请在评论中让我知道。
代码示例:查找简码出现
function find_shortcode_occurences($shortcode, $post_type = 'page')
{
$found_ids = array();
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => -1,
);
$query_result = new WP_Query($args);
foreach ($query_result->posts as $post) {
if (false !== strpos($post->post_content, $shortcode)) {
$found_ids[] = $post->ID;
}
}
return $found_ids;
}
function save_option_shortcode_post_id_array( $post_id )
{
if ( wp_is_post_revision( $post_id ) OR 'page' != get_post_type( $post_id )) {
return;
}
$option_name = 'yourprefix-yourshortcode';
$id_array = find_shortcode_occurences($option_name);
$autoload = 'yes';
if (false == add_option($option_name, $id_array, '', $autoload)) update_option($option_name, $id_array);
}
add_action('save_post', 'save_option_shortcode_id_array' );
代码示例:简码动态包含脚本和样式
function yourshortcode_add_scripts_and_styles() {
$page_id = get_the_ID();
$option_id_array = get_option('yourprefix-yourshortcode');
if (in_array($page_id, $option_id_array)) {
wp_enqueue_script( $handle, $src, $deps, $ver, $footer = true );
wp_enqueue_style( $handle, $src , $deps);
}
}
add_action('wp_enqueue_scripts', 'yourshortcode_add_scripts_and_styles');
关于php - wordpress:仅在出现简码的地方加载javascript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6235338/