如何将add_filters应用于由add_action执行的自定义函数?

时间:2019-02-16 16:47:01

标签: php wordpress

我在父主题中有一个自定义函数,该函数挂接到Wordpress admin_head中,用我在函数中定义的允许域进行处理。这部分工作正常。

但是,我希望能够从子主题向该功能添加其他允许的域(换句话说,无需修改父主题中的原始功能)。我以为apply_filters可能是一个不错的解决方案,但似乎并没有传递其他域。我在做什么错呢?还是有更好的方法来做到这一点?

这说明了我要解决的问题:

function custom_function( $additional_domains ) { 
    $allowed_domains = array(
        'domain1.com',
        'domain2.com',
        'domain3.com',
    );

    if ( $additional_domains ) {
        array_push( $allowed_domains, $additional_domains );
    }

    print_r( $allowed_domains );
}
add_action('admin_head', 'custom_function');


function send_domains_to_custom_function( $domains ) {
    return $domains;
}
add_filter( 'custom_function', 'send_domains_to_custom_function', 10, 1 );


$add_these_domains = array(
    'domain4.com',
    'domain5.com',
);
apply_filters( 'custom_function', $add_these_domains );

这是先前代码的结果:

Array
(
    [0] => domain1.com
    [1] => domain2.com
    [2] => domain3.com
)

但这是我想要的结果:

Array
(
    [0] => domain1.com
    [1] => domain2.com
    [2] => domain3.com
    [3] => domain4.com
    [3] => domain5.com
)

更新:最终的完整工作解决方案

感谢@melvin,并为以后可能会发现此问题的其他人提供清晰的信息,以下是我得出的结论:

父主题功能:

function custom_function( $additional_domains ) { 
    $allowed_domains = array(
        'domain1.com',
        'domain2.com',
        'domain3.com',
    );

    $additional_domains = apply_filters( 'add_to_allowed_domains', $additional_domains );

    if ( !empty($additional_domains) ) {
        $allowed_domains = array_merge( $allowed_domains, $additional_domains );
    }

    print_r( $allowed_domains );
}
add_action('admin_head', 'custom_function');

儿童主题功能和过滤器:

add_filter('add_to_allowed_domains','add_to_domains_fn');
function add_to_domains_fn($domains){
   $domains= array('domain4.com','domain5.com');
   return $domains;
}

父主题功能仍可与其中定义的原始允许域一起使用。如果子主题包含add_to_domains_fn()和过滤器,则会按预期添加其他域。

1 个答案:

答案 0 :(得分:1)

wordpress

店面主题中查看以下功能
./anagram <<EOW && echo "Test succeeded" || echo "Test Failed"
listen
silent
EOW

您是否了解了如何应用apply_filters以使用变量function storefront_header_styles() { $is_header_image = get_header_image(); $header_bg_image = ''; if ( $is_header_image ) { $header_bg_image = 'url(' . esc_url( $is_header_image ) . ')'; } $styles = array(); if ( '' !== $header_bg_image ) { $styles['background-image'] = $header_bg_image; } $styles = apply_filters( 'storefront_header_styles', $styles ); foreach ( $styles as $style => $value ) { echo esc_attr( $style . ': ' . $value . '; ' ); } }

$styles

该主题应该在该位置放置一个过滤器,或者您应该手动向该主题添加apply_filter。

#UPDATE

我真的从主题功能和子主题中得不到什么代码。假设我已正确理解,则需要以下内容

$styles = apply_filters( 'storefront_header_styles', $styles );

按上述方法更改功能后,即可使用

function custom_function( $additional_domains ) { 
    $allowed_domains = array(
        'domain1.com',
        'domain2.com',
        'domain3.com',
    );
    $allowed_domains = apply_filters( 'add_to_allowed_domains', $allowed_domains );
    if ( $additional_domains ) {
        array_push( $allowed_domains, $additional_domains );
    }

    print_r( $allowed_domains );
}
add_action('admin_head', 'custom_function');

NB:由于父主题中的函数没有任何过滤器,因此不建议手动添加apply_filters。因为这些更改将在下一次主题更新时被覆盖。因此,您可以要求主题开发人员在此处添加过滤器