Wordpress子模板-functions.php:重新声明函数


Wordpress child template - functions.php: redeclareing functions

我有一个已经创建的网站(基于:wordpress,biznex模板),现在我必须使用子模板重新创建它。该模板没有子模板,我创建了它,现在我必须将所有自定义内容迁移到子模板中。

我遇到的问题是,在基本模板functions.php文件中有一些修改后的函数,我需要将其放入子模板的functions.php中,但它给了我下一个错误:

致命错误:无法重新声明biznex_contact_ajax()(以前在中声明C: ''examplep''htdocs''enetix clean temp''wp content''themes''biznex child''functions.php:16)在里面C: ''examplep''htdocs''enetix clean temp''wp content''themes''biznex''functions.php在线883

我如何使子主题函数.php覆盖基本模板函数而不从基本模板函数.php中删除它们。

以下是用作混凝土出口的函数之一:

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" );

不幸的是,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');