Wordpress从子主题应用过滤器/添加过滤器

时间:2013-11-14 22:43:47

标签: php wordpress wordpress-theming

我查看过应该如何完成的文档和示例,但无法看到下面代码的问题。我的孩子主题中的函数没有被调用。这可能是显而易见的,但我只是看不到它,看到任何最受欢迎的指针......

父主题的functions.php

add_action('init', 'st_header_scripts');
    function st_header_scripts() {
        $javascripts  = wp_enqueue_script('jquery');
        $javascripts .= wp_enqueue_script('custom',get_bloginfo('template_url') ."/javascripts/app.js",array('jquery'),'1.2.3',true);
        $javascripts .= wp_enqueue_script('superfish',get_bloginfo('template_url') ."/javascripts/superfish.js",array('jquery'),'1.2.3',true);
        $javascripts .= wp_enqueue_script('formalize',get_bloginfo('template_url') ."/javascripts/jquery.formalize.min.js",array('jquery'),'1.2.3',true);

        echo apply_filters ('child_add_javascripts',$javascripts);
    }

在儿童主题......

function child_add_javascripts($javascripts) {
        $javascripts  = "test";
        echo "test"; die;
        return $javascripts;
    }

    add_filter('st_header_scripts','child_add_javascripts');

2 个答案:

答案 0 :(得分:2)

这里有一些问题。 wp_enqueue_script不是返回函数,因此没有理由将它设置为变量。它的作用是在header.php

中调用wp_head()后生成所有必需的脚本标记

其次,问题源于您使用add_filter和apply_filter。但我认为我们应该重新考虑行动和过滤器之间的实际差异(您可能知道,但其他人可能不知道):

根据收到的数据执行操作 过滤器会对收到的数据进行处理并将其返回

do_action()apply_filter()是您的触发器函数,它将触发器名称作为其第一个参数,以及您希望传递给回调的参数,因为它是第二个参数。

add_action()add_filter()是您的侦听器,它在第一个参数中查找已定义的名称,然后执行在其第二个参数中定义的回调函数。

根据你的情况,你最好使用动作挂钩的第3个参数来优先处理动作挂钩。

父主题:

add_action('wp_enqueue_scripts', 'st_header_scripts');
function st_header_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('custom',get_bloginfo('template_url') ."/javascripts/app.js",array('jquery'),'1.2.3',true);
    wp_enqueue_script('superfish',get_bloginfo('template_url') ."/javascripts/superfish.js",array('jquery'),'1.2.3',true);
    wp_enqueue_script('formalize',get_bloginfo('template_url') ."/javascripts/jquery.formalize.min.js",array('jquery'),'1.2.3',true);
}

儿童主题:

add_action('wp_enqueue_scripts','child_add_javascripts',20); //This will execute the child_add_javascripts callback after the st_header_scripts callback
function child_add_javascripts(){
    wp_enqueue_script('child_javascript',get_bloginfo('stylesheet_directory') ."/javascripts/child_js.js",array('jquery'),'1.2.3',true); //This looks in the CHLID theme's directory while template_url looks in the parent theme's directory
}

我花了一些时间来掌握所有不同的核心动作和过滤器,但是一旦你习惯了它并将其用于满足你所有主题的需求,它们就会成为一个非常强大的工具。

如果有帮助,请告诉我

答案 1 :(得分:0)

那么,你想在父主题中有一个函数,挂钩你的JS文件并在子主题中只添加JS文件?

你的代码有点混乱。我解释

  1. 脚本应该挂钩到wp_enqueue_scripts,而不是init
  2. wp_enqueue_script不返回任何值(甚至不是NULL :-D),因此将其分配给变量是没用的
  3. 注意您对过滤器的命名,功能add_filterapply_filters“一起工作”,因此他们的第一个参数应该相同
  4. 这里是代码,我想,你想在父主题中创建一个函数,进行排队,通过子主题,你只需要设置一个javascript文件数组来连接和排队。

    function st_header_scripts() {
    
        /**
         * 'jquery' has FALSE value, since it is registered in wordpress and you do not need an url
         */
        $js_files = array(
            'jquery' => false,
            'custom' => get_bloginfo('template_url') ."/javascripts/app.js",
            'superfish' => get_bloginfo('template_url') ."/javascripts/superfish.js",
            'formalize' =>get_bloginfo('template_url') ."/javascripts/jquery.formalize.min.js"
        );
    
        /**
         * Here you create a variable with a possibility to be filtered
         * The first argument is your custom name of your filter
         * The second argument is a variable which might be modified with filter and assigned to the $javascripts variable
         */
        $javascripts = apply_filters('header_javascripts', $js_files);
    
        /**
         * Here you just enqueue your scripts
         */
        if(false != $javascripts)
            foreach($javascripts as $name => $uri)
                if(!$uri)
                    wp_enqueue_script($name);
                else
                    wp_enqueue_script($name, $uri, array('jquery'), '1.2.3', true );
    }
    add_action('wp_enqueue_scripts', 'st_header_scripts');
    
    /**
     * A callback for a filter `header_javascripts`
     * @param array $original_js array of JS files from parent theme
     * You can either add JS into array or create and return new array
     */
    function children_theme_js($original_js) {
    
        //adding to original array
        $original_js[] = 'jquery-ui-core';
    
        //not enqueueing JS from parent theme
        //$original_js = array();
        //$original_js['script'] = 'I-am-the-url';
    
        //you need to return an array into the filter
        return $original_js;
    }
    add_filter('header_javascripts','children_theme_js');