提供后备功能,并允许通过插件覆盖

时间:2016-10-18 作者:Faisal Khurshid

我在我的主题中使用了ACF(高级自定义字段)插件。这个插件提供了一个更简单的方法get_field() 我们可以用它代替WordPress nativeget_post_meta() 方法现在,问题是get_field() 如果ACF插件处于活动状态,则方法可以正常工作,但当插件处于非活动状态时,主题前端会出现以下错误:

Fatal error: Call to undefined function get_field()

现在,我尝试提供一个回退功能,该功能应该在插件未激活时使用,我的回退功能如下:

if ( !function_exists(\'get_field\') ) {

    function get_field($key) {
        return get_post_meta(get_the_ID(), $key, true);
    }
}

add_action( \'after_setup_theme\', \'get_field\' );
现在,当ACF插件处于非活动状态时,此功能确实可以工作,但一旦我尝试激活ACF插件,后端就会出现以下错误:

Fatal error: Cannot redeclare get_field()

现在,我只想在插件未激活时使用我的回退功能,并且它不应该在之后停止激活ACF插件。

解决方案是什么?

3 个回复
最合适的回答,由SO网友:Faisal Khurshid 整理而成

这个问题已经解决了。似乎定义了ACF插件get_field() 函数无法重写定义的主题get_field() 激活ACF插件的功能。因此,它抛出Fatal error: Cannot redeclare get_field() 使用以下代码时出错:

if ( !function_exists(\'get_field\') ) {

    function get_field($key) {
        return get_post_meta(get_the_ID(), $key, true);
    }
}
现在,在激活ACF插件之前,我们只需要在主题的前端使用此自定义包装器函数,我们可以将其注册限制在前端,如下所示:

if ( !is_admin() && !function_exists(\'get_field\') ) {

    function get_field($key) {
        return get_post_meta(get_the_ID(), $key, true);
    }

}
现在,我们的后端不知道我们的自定义get_field() 这样在激活插件时和激活插件后,ACF插件的get_field() 功能将按预期接管。

SO网友:David

这个after_setup_theme 钩子实际上是一个动作钩子,而不是过滤器钩子。尽管如此,这是不必要的。

尝试一下:

if( ! function_exists( \'get_field\' ) ) {
    function get_field( $key, $post_id = false, $format_value = true ) {
        if( false === $post_id ) {
            global $post;
            $post_id = $post->ID;
        }

        return get_post_meta( $post_id, $key, true );
    }
}

SO网友:Xavier Serrano

这个答案并不好。由于get\\u字段不仅仅是获取post\\u meta,它还可以获得选项。最好的选择是使用if ( !is_admin() && !function_exists(\'get_field\') ) {} 您可能需要修改函数正在执行的某些操作,例如调用其他acf挂钩和函数。我的首选选项是不使用get\\u字段,而是使用wp核心函数来获取post、comment、user meta和get\\u选项函数。它将使您的前端与插件分离,并加快速度。

相关推荐

Add code to Functions.php

我想知道我是否在函数中添加了一些短代码。php在我的主题和解决我的问题,会发生什么,如果我更新我的主题??更新后是否删除我的短代码??在将代码添加到函数后,更新主题是否会有任何问题。php?