首页 文章

Wordpress覆盖父主题中的函数

提问于
浏览
0

我在使用Visual Composer的word press上安装了一个主题 . 但是在安装之后我发现主题已经禁用了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';
}

我不想在以后进行任何主题更新的情况下编辑原始主题代码,更改将被删除 . 所以我需要从儿童主题中找到解决方案 .

谢谢

1 回答

  • 1

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

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

    你可以在你孩子主题的 functions.php 文件中添加这样的东西:

    function remove_elements_from_vc() {
        return;
    }
    

    但是,您的 remove_action() 也应该可以正常工作 . 它's possible you' re函数在父主题's function is hooked. You can' t删除之前挂钩,直到 after 添加它为止 . 来自the codex

    您可能需要优先将操作删除到添加操作后发生的挂钩 . 在添加操作之前,您无法成功删除该操作 . 运行后也无法删除操作 . 要删除操作,优先级必须与最初添加的功能相匹配 .

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

    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'); 
    }
    

相关问题