我查看过应该如何完成的文档和示例,但无法看到下面代码的问题。我的孩子主题中的函数没有被调用。这可能是显而易见的,但我只是看不到它,看到任何最受欢迎的指针......
父主题的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');
答案 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文件?
你的代码有点混乱。我解释
wp_enqueue_scripts
,而不是init
wp_enqueue_script
不返回任何值(甚至不是NULL :-D),因此将其分配给变量是没用的add_filter
和apply_filters
“一起工作”,因此他们的第一个参数应该相同这里是代码,我想,你想在父主题中创建一个函数,进行排队,通过子主题,你只需要设置一个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');