Wordpress 从父主题覆盖一个函数

Wordpress Override a function from a parent theme

我在我的 word press 上安装了一个使用 Visual Composer 的主题。但是在安装它之后我发现主题已经禁用了 Visual Composer 中的一些元素。退出一段时间后,我找到了正在执行的文件以删除这些元素。

我创建了一个子主题来覆盖这个函数,但没有成功。

原函数是这样的:

if ( ! function_exists('remove-elements-from-vc') ) {

function remove-elements-from-vc() {

    /*** Remove Grid Elements if grid elements disabled */
    vc_remove_element('vc_basic_grid');
    vc_remove_element('vc_media_grid');
    vc_remove_element('vc_masonry_grid');
    vc_remove_element('vc_masonry_media_grid');
    vc_remove_element('vc_icon');
    vc_remove_element('vc_button2');
    vc_remove_element("vc_custom_heading");

    /*** Remove unused parameters from grid elements */
    if (function_exists('vc_remove_param')) {
        vc_remove_param('vc_basic_grid', 'button_style');
        vc_remove_param('vc_basic_grid', 'button_color');
        vc_remove_param('vc_basic_grid', 'button_size');
        vc_remove_param('vc_basic_grid', 'filter_color');
        vc_remove_param('vc_basic_grid', 'filter_style');
        vc_remove_param('vc_media_grid', 'button_style');
        vc_remove_param('vc_media_grid', 'button_color');
        vc_remove_param('vc_media_grid', 'button_size');
        vc_remove_param('vc_media_grid', 'filter_color');
        vc_remove_param('vc_media_grid', 'filter_style');
        vc_remove_param('vc_masonry_grid', 'button_style');
        vc_remove_param('vc_masonry_grid', 'button_color');
        vc_remove_param('vc_masonry_grid', 'button_size');
        vc_remove_param('vc_masonry_grid', 'filter_color');
        vc_remove_param('vc_masonry_grid', 'filter_style');
        vc_remove_param('vc_masonry_media_grid', 'button_style');
        vc_remove_param('vc_masonry_media_grid', 'button_color');
        vc_remove_param('vc_masonry_media_grid', 'button_size');
        vc_remove_param('vc_masonry_media_grid', 'filter_color');
        vc_remove_param('vc_masonry_media_grid', 'filter_style');
        vc_remove_param('vc_basic_grid', 'paging_color');
        vc_remove_param('vc_basic_grid', 'arrows_color');
        vc_remove_param('vc_media_grid', 'paging_color');
        vc_remove_param('vc_media_grid', 'arrows_color');
        vc_remove_param('vc_masonry_grid', 'paging_color');
        vc_remove_param('vc_masonry_grid', 'arrows_color');
        vc_remove_param('vc_masonry_media_grid', 'paging_color');
        vc_remove_param('vc_masonry_media_grid', 'arrows_color');
    }
}

add_action('vc_after_init', 'remove-elements-from-vc');
}

这就是我在 functions.php 的儿童主题中尝试做的事情:

add_action( 'vc_after_init', 'undo-remove-elements-from-vc' );
function undo-remove-elements-from-vc(){
    remove_action( 'vc_after_init', 'remove-elements-from-vc'); 
}

导致此操作的函数位于一个名为 "visual-composer-config.php" 的文件中,它是从一个名为 "load.php"

的同级文件中加载的
if (visual_composer_installed()) {
include_once ELATED_FRAMEWORK_MODULES_ROOT_DIR.'/visualcomposer/visual-composer-functions.php';
include_once ELATED_FRAMEWORK_MODULES_ROOT_DIR.'/visualcomposer/visual-composer-config.php';
}

我不想编辑原始主题代码,以防以后有任何主题更新,更改将被删除。所以我需要从儿童主题中找到解决方案。

谢谢

因为有问题的函数包含在 if ( ! function_exists('') ) 中(读作:"if this function does not exist"),所以您应该能够在父函数之前声明它。这将防止父函数中的代码成为 运行.

注意:我替换了您的连字符 (-),因为我没有看到连字符语法,并假设这是一个拼写错误。根据我的经验,正确使用的语法是下划线 (_).

您可以将类似这样的内容添加到子主题的 functions.php 文件中:

function remove_elements_from_vc() {
    return;
}

但是,您的 remove_action() 应该也能正常工作。有可能你的函数在父主题的函数被挂钩之前就挂钩了。添加操作 after 之前,您无法删除操作。来自 the codex:

  1. You may need to prioritize the removal of the action to a hook that occurs after the action is added.
  2. You cannot successfully remove the action before it has been added.
  3. You also cannot remove an action after it has been run.
  4. To remove an action the priority must match the priority with with the function was originally added.

如果是这种情况,您可以尝试以较低的优先级添加它:

add_action( 'vc_after_init', 'undo_remove_elements_from_vc', 20 );

function undo_remove_elements_from_vc(){
remove_action( 'vc_after_init', 'remove_elements_from_vc'); 
}