有一个有趣的难题.我需要加载大约8个
JavaScript文件和相同数量的样式为我的插件.这些只有在我的短代码运行的地方才需要.
我尝试使用print_styles和print_scripts加载它们,但是它们没有正确渲染,加上这样做会打破xhtml验证.所以目前他们在每个页面都加载,而且由于需要的文件数量,不可能像这样.
在另一个项目中,我将一个函数写入我的插件的index.PHP文件,该文件将占用当前页面,搜索它的短代码,如果只找到它,那么它将打印脚本,但这是一个丑陋的黑客.
有谁有任何建议或解决方案?
任何帮助将不胜感激,
问候,
Daithi
使用短码动态地加载每个页面的脚本和样式
优点
>每次调用短代码时都不会搜索所有的帖子.
>只有当网页上有短码时,才能动态添加样式和脚本.
>不使用正则表达式,因为它们往往比strstr()或strpos()慢.如果你需要提取参数,那么你应该使用上面提到的shortcode正则表达式.
>减少文件调用
代码说明
>仅当post不是修订版并与指定的post_type匹配时,才能使用save_post钩子查找页面上的短码.
>使用add_option()将发现的ids作为数组保存,其中autoload设置为yes,除非条目已经存在.然后它将使用update_option().
>使用hook wp_enqueue_scripts来调用我们的add_scripts_and_styles()函数.
>那个函数然后调用get_option()来检索我们的页面ID数组.如果当前$page_id在$option_id_array中,那么它会添加脚本和样式.
请注意:我转换了OOP Namespaced类的代码,所以我可能错过了一些.如果我这样做,请在评论中告诉我
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,$deps); } } add_action('wp_enqueue_scripts','yourshortcode_add_scripts_and_styles');