当其他插件已经在使用简单的HTMLDOM解析器时,我该如何在插件中使用它?

时间:2022-02-01 作者:TheKidsWantDjent

在我目前正在编写的插件中,我想使用简单的HTML DOM解析器库。然而,当我将其包括在内时

require(CPS_PLUGIN_PATH . \'/vendor/simple_html_dom.php\');
我收到以下错误:

Fatal error: Cannot redeclare file_get_html() (previously declared in /www/htdocs/12345/mydomain.com/wp-content/plugins/custom-post-snippets/vendor/simple_html_dom.php:48) in /www/htdocs/12345/mydomain.com/wp-content/plugins/fast-velocity-minify/libs/simplehtmldom/simple_html_dom.php on line 54
所以很明显,Fast Velocity Minify插件已经在使用它了。如果我不想在图书馆里胡闹,我该怎么办?在这种情况下,最佳做法是什么?

2 个回复
最合适的回答,由SO网友:kero 整理而成

如果不想打乱插件加载顺序,可以触发require 稍晚一点分开,例如通过plugins_loaded hook.

function csp_require_simplehtml() {
    if (!function_exists(\'file_get_html\')) {
        require(CPS_PLUGIN_PATH . \'/vendor/simple_html_dom.php\');
    }
}
add_action(\'plugins_loaded\', \'csp_require_simplehtml\');

SO网友:TheKidsWantDjent

正如@Sally CJ指出的,我必须使用function_exists(\'file_get_html\'), 像这样:

if (!function_exists(\'file_get_html\')) {
    require(CPS_PLUGIN_PATH . \'/vendor/simple_html_dom.php\');
}
然而,这在一开始仍然没有起到作用,因为错误不是发生在我的插件中,而是发生在最先加载的Fast Velocity Minify插件中。所以我不得不改变插件加载的顺序。我将插件放在加载序列的最后,代码如下:

function csp_load_last()
{
    $path = str_replace( WP_PLUGIN_DIR . \'/\', \'\', __FILE__ );
    if ( $plugins = get_option( \'active_plugins\' ) ) {
        if ( $key = array_search( $path, $plugins ) ) {
            array_splice( $plugins, $key, 1 );
            array_push( $plugins, $path );
            update_option( \'active_plugins\', $plugins );
        }
    }
}

add_action( \'activated_plugin\', \'csp_load_last\' );
代码必须进入主插件文件,在我的例子中,它是custom-post-snippets.php.

我只希望这不会导致任何其他错误,但到目前为止,它似乎像这样工作得很好。