2015-12-15 3 views
1

У меня есть сайт, который уже был создан (на основе: wordpress, biznex template), теперь мне нужно его воссоздать с использованием дочернего шаблона. В шаблоне не было дочернего шаблона, и я его создал, и теперь мне нужно перенести все пользовательские материалы в дочерний шаблон.Wordpress child template - functions.php: redeclareing

Проблема у меня есть то, что есть некоторые модифицированные функции в базовых шаблонов файл functions.php, что мне нужно поместить в functions.php дочернего tempalte, но это дает мне следующую ошибку:

Fatal error: Cannot redeclare biznex_contact_ajax() (previously declared in C:\xampp\htdocs\enetix-clean-temp\wp-content\themes\biznex-child\functions.php:16) in C:\xampp\htdocs\enetix-clean-temp\wp-content\themes\biznex\functions.php on line 883

Как сделать child-themes functions.php переопределить функцию базовых шаблонов, не удаляя их из базовых шаблонов functions.php.

Вот одна из функций, для использования в качестве Concret exmaple:

function biznex_contact_ajax(){ 

    $receiver_mail = get_bloginfo('admin_email'); 
    if(!empty($receiver_mail)) 
    { 
     $mail_title_prefix = _go('email_prefix'); 
     $mail_prefix_cont = sprintf(__('This e-mail was sent from a contact form on %1$s %2$s.'),(get_bloginfo('name')),('('.get_site_url().')')); 
     $mail_prefix = '</br></br>' .$mail_prefix_cont; 
     if(empty($mail_title_prefix)) 
      $mail_title_prefix = ''; 
     if(!empty($_POST['biznex-name']) && !empty($_POST['biznex-email']) && !empty($_POST['biznex-subject']) && !empty($_POST['biznex-message'])){ 
      $subject = $mail_title_prefix.$_POST['biznex-subject']; 
      $reply_to = is_email($_POST['biznex-email']); 
      if(false!==$reply_to){ 
       $reply_to = $_POST['biznex-name'] . '<' . $reply_to . '>'; 
       $headers = ''; 
       $headers .= 'MIME-Version: 1.0' . "\r\n"; 
       $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; 
       $headers .= 'From:'.$_POST['biznex-name'].'<'.$_POST['biznex-email']."> \r\n"; 
       $headers .= 'Reply-to: ' . $reply_to . "\r\n"; 
       if (wp_mail($receiver_mail, $subject, $_POST['biznex-message'] .$mail_prefix , $headers)) 
        $result = __("Message successfully sent. Thank you!"); 
       else 
        $result = __("Operation could not be completed."); 
      }else{ 
       $result = __("You have provided an invalid e-mail address."); 
      } 
     }else{ 
      $result = __("Please fill in all the required fields."); 
     } 
    }else{ 
     $result = __('Error! There is no e-mail configured to receive the messages.'); 
    } 
    echo $result; 
    die; 

} 
add_action("wp_ajax_biznex_contact", "biznex_contact_ajax"); 
add_action("wp_ajax_nopriv_biznex_contact", "biznex_contact_ajax"); 
+0

Почему бы не создать совершенно другое имя функции? – rnevius

+0

Потому что, например, эта функция встроена, и я не знаю, где она используется, и если я переименую ее или создаю другую функцию с теми же свойствами, мне нужно найти, где она вызывается в других файлах, и мне нужно для редактирования всех вещей там тоже .. Я нашел тему, и парень говорит здесь, что ее действительно трудно найти что-то полезное в отношении этой проблемы; он решил все, переименовав функцию в родительские темы function.php, но это нехорошее решение, потому что если произойдет обновление, переименованные функции будут сброшены. – elodpal

ответ

2

К сожалению, вы не можете иметь 2 функции с тем же именем в PHP.

Но Wordpress написан, чтобы позволить разработчикам подключаться к действиям/фильтрам. Если вы изучите процесс загрузки, вы увидите, что wp загружает некоторые функции, затем активную тему (дочерняя тема сначала + родительская, если это необходимо). Это позволяет разработчикам создавать код и запускаться позже в процессе без изменения кода ядра. Примером этого являются крючки Ajax.

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

Следовательно, подключите функцию к init для удаления функций и добавьте пользовательскую функцию.

function change_ajax_funct(){ 
    remove_action("wp_ajax_biznex_contact", "biznex_contact_ajax"); 
    remove_action("wp_ajax_nopriv_biznex_contact", "biznex_contact_ajax"); 
    // note leave action hook the same, just change the function call this means that you don't have to change the js code to use a new hook. 
    add_action("wp_ajax_biznex_contact", "biznex_contact_ajaxb"); 
    add_action("wp_ajax_nopriv_biznex_contact", "biznex_contact_ajaxb"); 

} 

add_action('init', 'change_ajax_funct');