哪里放第三方PHP库?


8

我正在开发几个开源插件和一个主题(“套件”的所有部分),它们都使用相同的第三方PHP库。我想知道将其包含在Wordpress中的最佳方法是什么。这里有一些想法:

  • 将其放在其中一个插件中,并要求安装并激活该插件
  • 创建一个特殊的“核心”插件,除了包含插件外什么也不做
  • 直接放进去 wp-content

有什么想法吗?


此开发是供单个站点还是多个站点/公共版本上供私人使用的吗?
2011年

它是用于一组开源插件。我正在更新问题以指出这一点。
gou1 2011年

Answers:


5

如果每个插件/主题独立运行,那么您应该将库放到每个主题/插件中。

然后,仅需检查一下,然后再从第三方库中检查它是否存在一个类或函数即可。

<?php
if( class_exists( 'SomeClass' ) )
{
    // require/include here
}

要么

<?php
if( function_exists( 'some_function' ) )
{
   // Require/include stuff here
}

或者,您可以包装第三方库中的每个函数/类/变量/常量,以检查其是否存在,例如可插入函数

如果所有的插件和主题都相互依赖,那么将它们分开并没有多大意义,您可能应该重新考虑一下。


插件具有不同的功能,因此是分开的:您仅激活所需的内容。但这全都依赖于框架,这就是为什么我需要包含该库的原因。它有一个自动加载器,并且有很多类,因此检查/要求每个类确实很麻烦。而且我不能真正将它放在每个类中,因为它将多次注册自动加载器。现在,更好的解决方案似乎是“核心”插件。首先激活它,使其需要所有第三方的东西,然后选择所需的插件。
gou1 2011年

您正在考虑这个错误:只需制作一个引导文件(包括您可以检查的内容)即可,该文件包含/需要所有类。然后要求该文件。一张支票。不要指望用户指出他们需要安装第二个插件。
chrisguitarguy 2011年

这正是我的问题:将文件放在什么位置(插件,引导程序等)?
gou1 2011年

哦,我将它们library放在每个插件/主题的文件夹中。然后在您的主插件文件中,运行检查并在必要时包括它们。
chrisguitarguy 2011年

3

将所有依赖的代码绑定到库插件中的操作。

库插件的示例代码:

add_action( 'plugins_loaded', 'load_library', 0 );

function load_library()
{
    # load all the classes and files you need
    # Set up $plugin_url and $plugin_directory

    do_action( 'library_loaded', $plugin_url, $plugin_directory );
}

在您依赖的代码中,在调用该操作之前不执行任何操作:

add_action( 'library_loaded', 'start_my_code', 10, 2 );

function start_my_code( $lib_url, $lib_directory )
{
    # do stuff
}

该库处理所有基本部分:检查适当的PHP版本,WordPress常量,多站点设置等。

如果'library_loaded'未调用该操作,则其他代码将不执行任何操作。


1

chrisguitarguy的回答是,如果您的库采用PHP类的形式,那么您可以利用spl_autoload_register()来加载那些尚未由其他插件加载的类。然后,您可以将库捆绑到您的插件中并使用它们,并在适当时依靠类加载器将它们包括在内。您还可以使用类加载器来加载您自己的插件的类。

例如

define('WPSE_31726_PLUGIN_ROOT', dirname(__FILE__) . '/');

/**
* autoload classes as/when needed
* @param string $class_name name of class to attempt to load
*/
function wpse_31726_autoload($class_name) {
    static $classMap = array (
        'Wpse31726_Admin'       => 'class.Wpse31726_Admin.php',
        'Wpse31726_CsvLoader'   => 'class.Wpse31726_CsvLoader.php',
        'Wpse31726_Plugin'      => 'class.Wpse31726_Plugin.php',
        'parseCSV'              => 'lib/parsecsv/parsecsv.lib.php',
    );

    if (isset($classMap[$class_name])) {
        require WPSE_31726_PLUGIN_ROOT . $classMap[$class_name];
    }
}

// register function for autoloading required classes
spl_autoload_register('wpse_31726_autoload');

这里的问题不是自动加载,而是“全部使用相同的第三方PHP库”。
gou1 2013年

1
每个chrisguitarguy都可以拥有自己的库副本,因此基本上可以独立运行。由于每个库都需要运行,因此需要该库,因此如果尚未加载该库,则将它们加载。自动加载类仅提供一种简便的方法来解决“如果尚未加载”位。
webaware

0

由于不存在正式的供应商目录,因此我会选择“ core”插件,该插件除了包含库外什么也不做。然后,使您的插件需要该核心插件。

将库放在您的真实插件之一中将要求用户启用该插件,即使他们可能永远不想使用其功能。一个单独的核心插件似乎更干净。

直接将其放在wp-content中似乎是最糟糕的解决方案。


刚开始我也是这样想的,但是我发现仅将包含的库放在一个激活的插件中是不够的:有时(例如,在激活它时)不需要“ core”插件的文件。
gou1 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.