在插件模板中实现命名空间

时间:2016-10-02 作者:Ethan O\'Sullivan

为了适应时间并改进我的编码实践,我开始实施namespaces 在我自己的插件中,由于有一些优势,such as eliminating ambiguity.

我找到了一个similar question 来帮助我建立我的插件模板,这对我很有用。然而,我后来对它做了一些修改。这是我的设置:

在里面wp-plugin-template/wp-plugin-template.php:

<?php
/**
 * Plugin Name: WP Plugin Template
 */
# If accessed directly, exit
if ( ! defined( \'ABSPATH\' ) ) exit;
# Call the autoloader
require_once( \'autoloader.php\' );

use PluginTemplate\\admin\\Plugin_Meta;
new Plugin_Meta;
在中wp-plugin-template/autoloader.php:

<?php
spl_autoload_register( \'autoload_function\' );
function autoload_function( $classname ) {
    $class = str_replace( \'\\\\\', DIRECTORY_SEPARATOR, str_replace( \'_\', \'-\', strtolower($classname) ) );
    # Create the actual file-path
    $path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $class . \'.php\';
    # Check if the file exists
    if ( file_exists( $path ) ) {
        # Require once on the file
        require_once $path;
    }
}
在中wp-plugin-template/admin/plugin-meta.php:

<?php
namespace PluginTemplate\\admin;
class Plugin_Meta {
    public function __construct() {
        add_action( \'plugins_loaded\', array($this, \'test\' ) );
    }

    public function test() {
        echo \'It works!\';
    }
}
当我尝试激活插件模板进行测试时,出现以下错误:

Fatal error: 班PluginTemplate\\admin\\Plugin_Meta 在中找不到wp-content/plugins/wp-plugin-template/wp-plugin-template.php 在第11行

在这种情况下,第11行是:

new Plugin_Meta;
我想这是因为我将名称空间命名为PluginTemplate? 我做错了什么?只是重申一下,the previous question that I mentioned 在我开始重命名文件和目录之前为我工作。

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

问题在于您的自动装弹机设置。您需要将Camelcase名称空间转换为破折号,以便根据当前文件夹结构定位文件。

我添加了转换功能并更新了自动加载器功能。

在里面wp-plugin-template/autoloader.php:

<?php
spl_autoload_register( \'autoload_function\' );
function autoload_function( $classname ) {
    $class = str_replace( \'\\\\\', DIRECTORY_SEPARATOR, str_replace( \'_\', \'-\', strtolower(convert($classname)) ) );
    # Create the actual file-path
    $path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $class . \'.php\';
    # Check if the file exists
    if ( file_exists( $path ) ) {
        # Require once on the file
        require_once $path;
    }
}

function convert($class){
    $class = preg_replace(\'#([A-Z\\d]+)([A-Z][a-z])#\',\'\\1_\\2\', $class);
    $class = preg_replace(\'#([a-z\\d])([A-Z])#\', \'\\1_\\2\', $class);
    return $class;
}
您还必须将顶级命名空间更新为WpPluginTemplate 在两者中wp-plugin-template.phpadmin/plugin-meta.php 因为您正在使用wp插件模板作为插件文件夹名称。

更新时间:

当自动加载器尝试查找Plugin_Meta 类,它将查看您的\\u PLUGIN\\u DIR/wp PLUGIN template/admin/PLUGIN meta。php

在里面wp-plugin-template.php

<?php
/**
 * Plugin Name: WP Plugin Template
 */
# If accessed directly, exit
if ( ! defined( \'ABSPATH\' ) ) exit;
# Call the autoloader
require_once( \'autoloader.php\' );

use WpPluginTemplate\\admin\\Plugin_Meta;
new Plugin_Meta;
在中wp-plugin-template/admin/plugin-meta.php

<?php
namespace WpPluginTemplate\\admin;
class Plugin_Meta {
    public function __construct() {
        add_action( \'plugins_loaded\', array($this, \'test\' ) );
    }

    public function test() {
        echo \'It works!\';
    }
}

SO网友:birgire

只是关于自动加载器的一些附加说明:

如果$classname 输入为PluginTemplate\\admin\\Plugin_Meta 然后$path 成为

/full/path/to/wp-content/plugins/plugintemplate/admin/plugin-meta.php
并且此文件不存在Plugin_Meta 未加载类定义。

它也是not recommended 要使用WP_PLUGIN_DIR 直接常数,有其他选择,如plugin_dir_path( __FILE__ ).

还有更完整的自动装弹机,例如generated autoloader in Composer.

相关推荐

Namespaced shortcode?

我正在改造一个旧的WP站点,该站点有许多自定义的短代码,显然由于代码当前的组织方式,这些短代码在性能方面付出了代价。当然,我可以修复优化不好的代码,使用十几个短代码,并且一天就可以完成,但我想知道如何更好地组织它们。根据WordPress\'documentation, 建议将它们放在插件中并在上初始化init. 我们可以通过这样“命名”它们来减少这个钩子中的负载吗?[com.company shortcode attr=\"attr\" prop=\"prop\"] 有人尝试过这样的解决方案吗