2013-11-14 8 views
1

Я просмотрел документы и примеры того, как это должно быть сделано, но не может понять, что проблема с кодом ниже. Функция в моей дочерней теме просто не называется. Это, вероятно, со всей очевидностью, но я просто не могу видеть его, видеть любые указатели наиболее приветственные ...Wordpress применить фильтр/добавить фильтр из дочерней темы

родитель 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

Здесь есть несколько вещей. wp_enqueue_script не является функцией возврата, поэтому нет никакой причины, чтобы вы устанавливали ее в переменную. То, что он делает, генерирует все теги скриптов, необходимые, когда wp_head() вызывается внутри header.php

Во-вторых, проблема связана с использованием вами add_filter и apply_filter. Но я думаю, что мы должны идти по тому, что фактические различия между действиями и фильтрами (которые вы, вероятно, могли бы знать, но другие не могли бы):

Действия делать вещи в зависимости от данных, которые он получает
фильтры делают материал к данные, которые он получает и возвращает его

do_action() и apply_filter() ваши функции триггера, которые принимают во имя триггера в качестве первого параметра, и аргументы, которые вы хотели бы передать функцию обратного вызова, как это второй-степени п аргументов.

add_action() и add_filter() Ваши слушатели, которые ищут определенное имя в своем первом аргументе, а затем выполняет функцию обратного вызова, определенную во втором аргументе.

Учитывая ваш случай, вам будет лучше определить приоритеты ваших крючков действия, используя третий параметр ваших крючков действия.

Родитель Тема:

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 
} 

Он взял меня немного, чтобы получить твердое понимание на всех различных основных действий и фильтров , но как только вы привыкнете к этому и используете его во всех потребностях вашей темы, они становятся очень сильными l инструмент.

Позвольте мне знать, если это помогает

0

Итак, вы хотите в родительской теме есть функция, которая перехватывает файлы JS и в детской теме только добавить JS-файлы?

Ваш код вроде грязный.Я объясняю

  1. скрипты должны быть подключены в wp_enqueue_scripts, не init
  2. wp_enqueue_script не возвращает никакого значения (даже не NULL :-D), поэтому присвоение его переменной бесполезно
  3. Обратите внимание на ваш именование фильтра, функции 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'); 
Смежные вопросы