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:
- You may need to prioritize the removal of the action to a hook that occurs after the action is added.
- You cannot successfully remove the action before it has been added.
- You also cannot remove an action after it has been run.
- 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');
}
我在我的 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:
- You may need to prioritize the removal of the action to a hook that occurs after the action is added.
- You cannot successfully remove the action before it has been added.
- You also cannot remove an action after it has been run.
- 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');
}