有一个有趣的难题。我需要为我的插件加载大约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()
  • 使用 Hook 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/

    10-13 07:31