如何检测是否已在任何页面上触发函数,以便可以有条件地加载脚本/样式

时间:2013-07-06 作者:Andrew

我正在构建一个小的图库插件,如果图库是通过模板标签加载的,我只想将脚本/样式加载到页面上。当模板标记用于从主题中需要的任何位置调用帖子库时,可以使用帖子ID参数。

我知道如何在单个页面上执行此操作(我只需查找meta\\u键并将其与当前查看的帖子进行匹配),但检测主页(或任何其他页面)上是否存在图库更为困难。

因此,我们假设模板标记如下所示:

if ( function_exists( \'my_gallery\' ) )
    echo my_gallery( \'100\' ); // gallery of image from post 100 will be shown
gallery函数如下所示(简化):

function my_gallery( $post_id = \'\' ) {
    // whole bunch of stuff in here which is returned
}
库的脚本和样式如下所示(简化):

function my_gallery_scripts() {

   wp_register_script( \'my-gallery-js\', MY_GALLERY_URL . \'js/my-gallery.js\', array( \'jquery\' ), \'1.0\', true );
   wp_register_style( \'my-gallery-css\', MY_GALLERY_URL . \'css/my-gallery.css\', \'\', \'1.0\', \'screen\' );

    // need to load these conditionally, but how?
    wp_enqueue_style( \'my-gallery-js\' );
    wp_enqueue_script( \'my-gallery-css\' );

}
add_action( \'wp_enqueue_scripts\', \'my_gallery_scripts\' );
我试过使用set_query_var 在…内my_gallery() 这样可以在$wp\\u查询中设置一个全局变量。

 function my_gallery( $post_id = \'\' ) {

    set_query_var( \'has_gallery\', true );

    // whole bunch of stuff in here which is returned
}    
但问题是我不能使用get_query_var 内部wp_enqueue_scripts 行动

因此,我相信下面的内容对我来说非常理想,将has\\u gallery加载到$wp\\u查询对象中,我可以在每个页面上使用该对象(除非它不起作用)。

 function my_gallery_scripts() {

   wp_register_script( \'my-gallery-js\', MY_GALLERY_URL . \'js/my-gallery.js\', array( \'jquery\' ), \'1.0\', true );
   wp_register_style( \'my-gallery-css\', MY_GALLERY_URL . \'css/my-gallery.css\', \'\', \'1.0\', \'screen\' );

    // does not work
    $has_gallery = get_query_var( \'has_gallery\' );

    if ( $has_gallery ) {
        wp_enqueue_style( \'my-gallery-js\' );
        wp_enqueue_script( \'my-gallery-css\' );
    }
}
add_action( \'wp_enqueue_scripts\', \'my_gallery_scripts\' );
是否有其他方法可以设置类似于set\\u query\\u var的全局选项,但可以在我的场景中使用?很明显,我想避免使用全局变量。我还尝试设置一个常量,但没有效果。

3 个回复
SO网友:Rarst

对于脚本来说,这是不需要动脑筋的-只要在里面排队就可以了my_gallery() 函数,它们将在页脚中输出(因为页眉已经传递)。

然而样式表是一个挑战,它们只应该在head 不支持节和页脚排队。

本质上,您需要知道函数在被调用之前是否被调用过。对于给定的条件,这没有简单的解决方案。

我可能会尝试从JS代码中加载样式表,以在您描述的表单中实现这一点。

SO网友:kaiser

我能想象的最好的方法(我的意思是“工作”,而不是“快速”)是检查帖子内容是否存在该短代码。使用核心Regex函数可以很容易地做到这一点。

步骤1:注册

/**
 * Register the needed assets
 */
add_action( \'wp_enqueue_scripts\', \'wpse_105537_register_assets\', 0 );
function wpse_105537_register_assests()
{
    wp_register_script(
        \'wpse_105537_script\',
        // ETC.
    );
    wp_register_style(
        \'wpse_105537_style\',
        // ETC.
    );
}

步骤2:排队

/**
 * Enqueue the needed assets if the shortcode is present anywhere
 */
add_action( \'wp_enqueue_scripts\', \'wpse_105537_register_assets\' );
function wpse_105537_enqueue_assets()
{
    if ( ! wpse_105537_check_content() )
        return;

    wp_enqueue_script( \'wpse_105537_script\' );
    wp_enqueue_style( \'wpse_105537_style\' );
}
帮助程序:搜索帖子内容中的短代码。此帮助程序函数在第一次匹配后中止。

/**
 * Check if any of the posts has the shortcode in its post_content
 * @return bool
 */
function wpse_105537_check_content()
{
    global $wp_query;

    foreach ( $GLOBALS[\'wp_query\']->posts as $post )
    {
        $pattern = get_shortcode_regex();
        if (
            preg_match_all( \'/\'. $pattern .\'/s\', $post->post_content, $matches )
            AND array_key_exists( 2, $matches )
            AND in_array( \'gallery\', $matches[2] )
        )
            return true;
    }

    return false;
}

SO网友:kaiser

我知道如何在单个页面上执行此操作(我只需查找meta\\u键并将其与当前查看的帖子进行匹配),但检测主页(或任何其他页面)上是否存在图库更为困难。

因此,如果有一个元键,它将更加简单:只需尽早获取它。前两个函数可以从另一个答案中选取。仅检查本身将替换为以下功能:

/**
 * Check if any of the posts has the needed gallery meta data attached
 * @return bool
 */
function wpse_105537_check_meta()
{
    global $wp_query;

    foreach ( $GLOBALS[\'wp_query\']->posts as $post )
    {
        if ( \'\' !== get_post_meta( $post->ID, \'your_meta_key\', true ) )
            return true;
    }

    return false;
}

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post