WP 5.5致命错误-rest-api.php中的GET_REST_CONTROLER()

时间:2020-09-17 作者:Hugh Mongoose

我有一个使用此插件自定义版本的网站:https://wordpress.org/plugins/user-tags/

安装Wordpress 5.5后,任何分类显示页面都会生成以下致命错误:

PHP Fatal error:  Uncaught Error: Call to undefined method stdClass::get_rest_controller() in /home/abc/domains/mydomain.com/public_html/wp-includes/rest-api.php:2209
Stack trace:
#0 /home/abc/domains/mydomain.com/public_html/wp-includes/rest-api.php(2245): rest_get_route_for_term(Object(WP_Term))
#1 /home/abc/domains/mydomain.com/public_html/wp-includes/rest-api.php(943): rest_get_queried_resource_route()
#2 /home/abc/domains/mydomain.com/public_html/wp-includes/class-wp-hook.php(285): rest_output_link_header()
#3 /home/abc/domains/mydomain.com/public_html/wp-includes/class-wp-hook.php(311): WP_Hook->apply_filters(NULL, Array)
#4 /home/abc/domains/mydomain.com/public_html/wp-includes/plugin.php(478): WP_Hook->do_action(Array)
#5 /home/abc/domains/mydomain.com/public_html/wp-includes/template-loader.php(13): do_action(\'template_redire...\')
#6 /home/abc/domains/mydomain.com/public_html/wp-blog-header.php(19): require_once(\'/home/abc/domai...\')
#7 /home/abc/domains/mydomain in /home/abc/domains/mydomain.com/public_html/wp-includes/rest-api.php on line 2209
将WP回滚到5.4.2可恢复功能。

我尝试在干净的5.5版本和未修改的插件版本上安装相同的插件,但我得到了相同的错误。

这个插件看起来被抛弃了,但它的代码库很小。我无法确定触发致命错误的原因,也无法找到任何其他注意到类似错误的问题。如果有人有任何想法,我们将不胜感激!

1 个回复
SO网友:Rup

由于5.5 WP\\u分类对象现在有了新方法,get_rest_controller(), 允许每个分类法控制器重写。问题是,您的插件用一个版本覆盖了保存在全局$wp\\u分类缓存中的分类法,该版本不是真正的wp\\u分类法对象,只是一个stdObject属性包,因此不需要调用get\\u rest\\u controller()。

这是中的相关位:ut\\u registered\\u taxonomy()UserTags.php lines 83-101, 这是一个registered_taxonomy 操作处理程序。

public function ut_registered_taxonomy( $taxonomy, $object, $args ) {
    global $wp_taxonomies;

    // Only modify user taxonomies, everything else can stay as is
    if ( $object != \'user\' ) {
        return;
    }

    // Array => Object
    $args = (object) $args;

    // Register any hooks/filters that rely on knowing the taxonomy now
    add_filter( "manage_edit-{$taxonomy}_columns", array( $this, \'set_user_column\' ) );
    add_filter( "manage_{$taxonomy}_custom_column",
                 array( $this, \'set_user_column_values\' ), 10, 3 );

    // Save changes
    $wp_taxonomies[ $taxonomy ]    = $args;  // <--- this line is the problem
    self::$taxonomies[ $taxonomy ] = $args;
}
请注意,我在“";“保存更改”;注释:这将覆盖的现有值$wp_taxonomies[ $taxonomy ] 具有错误的值,并且无论如何都不需要,因为没有对分类属性进行任何更改。所以我建议删除这一行作为最简单的修复。

(公平地说,这段代码是在4.7中添加WP\\U分类法类之前编写的(object) 如果您更改了$args的内容并且需要更新$wp\\u分类法,那么cast是从$args创建分类法对象的正确方法。)

现在,我们还可以确保在self中有一个真正的WP\\u Taxonomy对象::$taxonomies,例如,而不是$args = (object) $args) 从$wp\\U分类中获取真实对象$args = $wp_taxonomies[ $taxonomy ] 在本次通话前不久放置的位置。但我认为这实际上没有必要。