问题描述

我正在使用一个主题,使用以下方式正确定义了大量图像大小:

add_image_size( 'name', 500, 200, true );

我想从孩子主题中覆盖这些定义的大小:

add_image_size( 'new-name', 400, 300, true );

我知道我可以添加新的大小,但如果我添加相同的名称,即:

add_image_size( 'name', 400, 300, true );

然后使用父函数调用 – 忽略子对象 – 添加额外的规则会添加额外的图像,这将永远不会被使用 – 它不是那么糟糕,但效率不高。

有没有功能 de-register 添加图像大小?

干杯!

射线

最佳解决方案

add_image_size( $name, $width, $height, $crop )功能可以使用相同的 $name 来处理多个呼叫。它只是 overwrites the existing value

$_wp_additional_image_sizes[$name] = array( 'width' => absint( $width ), 'height' => absint( $height ), 'crop' => (bool) $crop );

所以这意味着你需要做的只是为了覆盖父主题的自定义图像大小的定义,以确保在主题主题调用之后,对 add_image_size()的调用被触发。

假设父主题是这样的:

function parent_theme_setup() {
    add_image_size( 'name', 500, 200, true );
    add_image_size( 'new-name', 400, 300, true );
}
add_action( 'after_setup_theme', 'parent_theme_setup' );

然后,父主题的 add_image_size()呼叫在 after_setup_theme 钩子处以默认优先级 (即 10) 触发。

(注意:如果调用未包装在回调中,则在 plugins_loaded 钩子处,以 10 为优先级) 。

以下是关键部分:子主题的 functions.php 文件在父主题之前被解析,所以如果使用相同的钩子来触发 add_image_size()调用,它们将被父主题的 add_image_size()调用所覆盖。

解决方案是使用稍后的挂钩或更低的优先级,以确保在主题主题之后触发子主题的 add_image_size()调用。

这应该是诀窍,无论父主题如何触发它的调用:

function child_theme_setup() {
    add_image_size( 'name', 400, 300, true );
}
add_action( 'after_setup_theme', 'child_theme_setup', 11 );

请注意,我们使用相同的 after_setup_theme 钩子,但使用较低的优先级 (即 11 而不是 10) 。从优先级 (较低的数字) 到较低的优先级 (较高的数量),从回调开始,从优先级 0 开始,回调挂起优先级 11 将在一个回调挂钩到 10 之后触发。

还要注意,after_setup_theme 钩子本身在 plugins_loaded 钩子之后触发,所以这个回调依然会覆盖父主题,即使父主题是_doing_it_wrong(),也没有将这样的调用包含在适当的回调中,挂钩到一个适当的钩子中。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。