【问题标题】:Wordpress Override a function from a parent themeWordpress 覆盖父主题中的函数
【发布时间】:2017-06-05 12:08:15
【问题描述】:

我在我的 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';
}

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

谢谢

【问题讨论】:

  • remove_action 调用中的函数名称是您自己的函数名称,而不是父主题中的函数名称...应该是 remove-elements-from-vc
  • 等等...函数名中的破折号还能用吗?
  • 我的错,我在这里写错了函数名,在原始文件中我调用了正确的函数。
  • 命名只是随机命名,我用“undo-remove-elements-from-vc”等替换了我原来的函数名……原来的函数不包含“-”跨度>
  • 尝试将您的add_action 调用的优先级更改为更早(默认为10),所以它看起来像这样:add_action('vc_after_init', 'function_name', 5); - 5 应该没问题,它只需要在 10 之前。 .

标签: wordpress themes visual-composer


【解决方案1】:

因为有问题的函数包含在if ( ! function_exists('') ) 中(阅读:“如果此函数不存在”),您应该能够在父函数之前声明它。这将阻止父函数内部的代码运行。

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

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

function remove_elements_from_vc() {
    return;
}

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

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

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

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

【讨论】:

  • 谢谢@DaveLak,我在我的子主题中创建了这个函数,并把它的优先级设置为 5,它成功了。
  • 太好了,您根本不需要将那个空函数添加到操作中。您所做的就是在父母面前声明它。当functions.php 运行时,该函数被加载到内存中并“存在”到php。因为 php 知道该函数现在“存在”,所以 if() 在父项中的检查失败,并且该函数也可能只是一个注释块。 TL;DR:只需添加功能即可设置。
  • @Joey- +1 - 和两个 cmets:1. - 将是非法的/不会运行,所以你是对的 - 这一定是一个错字,以及 2. 当试图确保一个钩子尽早钩子,它可以运行(并工作)一个大的负数(例如-9999)。作为“劫持”父主题的钩子的替代方法(以防删除操作由于某种原因不起作用),这可能是有用的。
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 2012-06-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多