【问题标题】:How to override a not plugable parent theme function from a non function.php file?如何从非 function.php 文件中覆盖不可插入的父主题函数?
【发布时间】:2015-07-08 05:49:49
【问题描述】:

我想减少我的父主题生成的图像文件的数量。经过一番研究,我发现为此我需要从父主题的 php 文件 (not function.php) 中覆盖一个函数,但这是不可能的,因为 此函数不可插入(不包含在 if (!function_exists()) 条件中)。现在,我只是将父函数包装在 if (!function_exists()) 条件中,并在我的子主题 function.php 文件中覆盖它。

在所描述的情况下,是否可以覆盖父函数而不更改父主题?我在这里问是因为我没有得到开发者的任何反应。

我尝试使用子主题和插件中的下一个代码删除父主题功能,但这没有帮助:

function remove_fastnews_actions() {
    remove_action('after_setup_theme','kopa_front_after_setup_theme');
}
add_action('after_setup_theme','remove_fastnews_actions');
//add_action('wp_loaded','remove_fastnews_actions');

这是我需要重写的函数(它更大,所以我只保留了我真正需要更改的内容):

add_action('after_setup_theme', 'kopa_front_after_setup_theme');

function kopa_front_after_setup_theme() {
    $sizes = array(
        'flexslider-image-size'   => array(500, 500, TRUE, __('Flexslider Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-image-size' => array(300, 277, TRUE, __('Article List Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-sm-image-size' => array(120, 120, TRUE, __('Article List Small Post Image (Kopatheme)', kopa_get_domain())),
        'article-carousel-image-size' => array(354, 354, TRUE, __('Article Carousel Post Image (Kopatheme)', kopa_get_domain())),
        'entry-list-image-size' => array(227, 182, TRUE, __('Entry List Thumbnail Image (Kopatheme)', kopa_get_domain())),
        'blog-image-size' => array(680, 419, TRUE, __('Blog Image Size (Kopatheme)', kopa_get_domain())),
    );

    apply_filters('kopa_get_image_sizes', $sizes);

    foreach ($sizes as $slug => $details) {
        add_image_size($slug, $details[0], $details[1], $details[2]);
    }
}

相同的父函数可插入:

if( !function_exists('kopa_front_after_setup_theme') )
{

add_action('after_setup_theme', 'kopa_front_after_setup_theme');

function kopa_front_after_setup_theme() {
    $sizes = array(
        'flexslider-image-size'   => array(500, 500, TRUE, __('Flexslider Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-image-size' => array(300, 277, TRUE, __('Article List Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-sm-image-size' => array(120, 120, TRUE, __('Article List Small Post Image (Kopatheme)', kopa_get_domain())),
        'article-carousel-image-size' => array(354, 354, TRUE, __('Article Carousel Post Image (Kopatheme)', kopa_get_domain())),
        'entry-list-image-size' => array(227, 182, TRUE, __('Entry List Thumbnail Image (Kopatheme)', kopa_get_domain())),
        'blog-image-size' => array(680, 419, TRUE, __('Blog Image Size (Kopatheme)', kopa_get_domain())),
    );

    apply_filters('kopa_get_image_sizes', $sizes);

    foreach ($sizes as $slug => $details) {
        add_image_size($slug, $details[0], $details[1], $details[2]);
    }
}

}

以及覆盖父函数的子主题函数:

add_action('after_setup_theme', 'kopa_front_after_setup_theme');

function kopa_front_after_setup_theme() {
    $sizes = array(
        'flexslider-image-size'   => array(0, 0, TRUE, __('Flexslider Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-image-size' => array(0, 0, TRUE, __('Article List Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-sm-image-size' => array(120, 120, TRUE, __('Article List Small Post Image (Kopatheme)', kopa_get_domain())),
        'article-carousel-image-size' => array(0, 0, TRUE, __('Article Carousel Post Image (Kopatheme)', kopa_get_domain())),
        'entry-list-image-size' => array(0, 0, TRUE, __('Entry List Thumbnail Image (Kopatheme)', kopa_get_domain())),
        'blog-image-size' => array(0, 0, TRUE, __('Blog Image Size (Kopatheme)', kopa_get_domain())),
    );

    apply_filters('kopa_get_image_sizes', $sizes);

    foreach ($sizes as $slug => $details) {
        add_image_size($slug, $details[0], $details[1], $details[2]);
    }
}

【问题讨论】:

  • 你可以把它放在一个插件文件中。
  • 与其停止运行,您可以致电remove_image_size 删除不需要的尺寸吗?
  • @GopalSRathore - 你的意思是 remove_action 和子主题功能吗?我试过了,不行。
  • @Hobo - 也许我可以,但我不明白如何在我的上下文中执行此操作:(。
  • 抱歉,误读了您的要求。看起来你应该能够使用过滤器(我之前错过了) - 查看我的答案

标签: php wordpress overriding


【解决方案1】:

既然原来的函数在函数中有一个过滤器,为什么不利用它呢?在您的functions.php 中,类似(未经测试的代码):

add_filter('kopa_get_image_sizes', 'override_kopa_images');

function override_kopa_images($sizes) {
    $new_sizes = array(
        'flexslider-image-size'   => array(0, 0, TRUE, __('Flexslider Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-image-size' => array(0, 0, TRUE, __('Article List Post Image (Kopatheme)', kopa_get_domain())),
        'article-list-sm-image-size' => array(120, 120, TRUE, __('Article List Small Post Image (Kopatheme)', kopa_get_domain())),
        'article-carousel-image-size' => array(0, 0, TRUE, __('Article Carousel Post Image (Kopatheme)', kopa_get_domain())),
        'entry-list-image-size' => array(0, 0, TRUE, __('Entry List Thumbnail Image (Kopatheme)', kopa_get_domain())),
        'blog-image-size' => array(0, 0, TRUE, __('Blog Image Size (Kopatheme)', kopa_get_domain())),
    );
    return $new_sizes;
}

或者,您可以使用输入变量$sizes 来更改单个条目,例如

add_filter('kopa_get_image_sizes', 'override_kopa_images');

function override_kopa_images($sizes) {
    $sizes['flexslider-image-size'] = array(0, 0, TRUE, __('Flexslider Post Image (Kopatheme)', kopa_get_domain()));
    return $sizes;
}

【讨论】:

  • 流浪汉——这行不通。我也尝试了@gopal-s-rathore 的建议,但没有成功。我认为发生这种情况是因为父函数不可插入并且因为它在另一个文件中,而不是在 function.php 中。
  • 嗯;我很困惑。父函数(是否可插入,是否在functions.php 中定义)正在调用apply_filters('kopa_get_image_sizes', $sizes);,因此如果您正确添加了过滤器,则应该调用它。您究竟是如何添加过滤器的?
  • 我添加(复制/粘贴,检查错误)你的最后一个函数到我的子主题function.php,然后将图像上传到我的站点,并且定义为 flexslider-image-size 的图像在那里(我在此之前删除了它)。
  • 啊。编写代码的人错误地使用了该构造。应该是$sizes = apply_filters('kopa_get_image_sizes', $sizes); - 他们错过了任务。我不确定它是否有效,但您可以尝试使用第二种方法并将函数声明更改为使用引用调用:function override_kopa_images(&$sizes) {(注意&)。那样有用吗?如果没有,我认为所写的过滤器调用毫无用处。
  • 我将父主题中的 apply_filters('kopa_get_image_sizes', $sizes); 替换为 $sizes = apply_filters('kopa_get_image_sizes', $sizes); 你的第二种方法就像一个魅力!我认为第一种方法也必须有效。我会尝试联系开发人员,但他没有回复我的消息。或者我会分叉他的主题,但我不想要这个。无论如何,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2021-10-19
相关资源
最近更新 更多