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

Wordpress child template - functions.php: redeclareing functions

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

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

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

如何使子主题 functions.php 覆盖基本模板功能而不从基本模板中删除它们 functions.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 中不能有 2 个同名函数。

但是 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');