【问题标题】:WordPress PSR-4 Namespaced Plugin Accessing Another Namespaced PluginWordPress PSR-4 命名空间插件访问另一个命名空间插件
【发布时间】:2015-12-01 06:08:09
【问题描述】:

快速地说,我正在尝试使用 WordPress 构建一个“生态系统”,其中我有一个核心插件,然后是其他附加插件。

更深入地说,每个附加插件都需要核心插件才能运行。我使用 WordPress 标准编码和文件结构实践实现了这一点。我正在修改这个项目,现在使用 Namespacing PSR-4、composer、bower 等。

标准 WordPress 安装

|
|__www
  |
  |___wp-admin
  |
  |___wp-content
  |   | 
  |   |___plugins
  |   |   |
  |   |   |___my-core-plugin
  |   |   |   |
  |   |   |   |___library
  |   |   |   |    |
  |   |   |   |    |___class-post-register.php
  |   |   |   |
  |   |   |   |___vendor
  |   |   |   |    |
  |   |   |   |    |___autoload.php
  |   |   |   |
  |   |   |   |___composer.json
  |   |   |   |
  |   |   |   |___core.php
  |   |   |
  |   |   |___my-first-addon-plugin
  |   |   |   |
  |   |   |   |___library
  |   |   |   |
  |   |   |   |___vendor
  |   |   |   |    |
  |   |   |   |    |___autoload.php
  |   |   |   |
  |   |   |   |___composer.json
  |   |   |   |
  |   |   |   |___core.php
  |   |   |
  |   |   |___my-second-addon-plugin
  |   |   |   |
  |   |   |   |___library
  |   |   |   |
  |   |   |   |___vendor
  |   |   |   |    |
  |   |   |   |    |___autoload.php
  |   |   |   |
  |   |   |   |___composer.json
  |   |   |   |
  |   |   |   |___core.php
  |   |   |
  |   |___themes
  |   |   |   
  |   |   |___my-custom-theme
  |   |
  |   wp-includes

核心插件 psr4 通过 composer

"autoload": {
    "psr-4": {
        "CorePlugin\\Library\\": "library"
    }
}

核心插件类示例

<?php 

namespace CorePlugin\library;

class Post_Register {

    private __construct() {
        // ... code
     }

    private init() {

    }

    private register( $data ) {
        // .. code to register a custom post for example.
    }

}

第一个附加插件 psr4 通过作曲家

"autoload": {
    "psr-4": {
        "FirstAddon\\Library\\": "library"
    }
}

来自附加插件的类

下面是我感到困惑的地方。我正在尝试在不同的命名空间中使用来自核心插件的类,但出现错误:

致命错误:在...中找不到类“CorePlugin\Library\Post_Register”

两个插件都自动加载它们各自的作曲家生成自动加载文件,所以我虽然可以use 命名空间。在深入研究 PHP 手册 (http://php.net/manual/en/language.namespaces.php) 的这一部分之前,我来这里询问,我可能会尝试子命名空间。

<?php 

namespace FirstAddon;

use CorePlugin\Library\Post_Register;

class First_Addon {

    private __construct() {
        // ... code
     }

    private init() {

    }

    private another_function() {

    }

}

另外,我很犹豫是否使用带括号的子命名空间,例如,在 laravel 中,usefoo\bar;和use bar\foo;像这样。

<?php namespace App\Services;

use App\User;
use Validator;
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;

class Registrar implements RegistrarContract {

【问题讨论】:

    标签: php wordpress plugins namespaces


    【解决方案1】:

    我确定你已经从这里开始了,但我想我还是会回答,以防其他人试图让插件相互依赖。我在我的插件中使用类和命名空间。我的插件重复使用彼此的类。

    命名空间插件

    首先,它基本上归结为 Wordpress 加载插件的顺序。我自己来自 C#/Java,最初对 WP 的工作方式感到困惑。您要确保要使用的插件已加载。最好的方法是通过延迟钩子实例化类——你知道在加载插件之后发生的。一个例子可以是

    add_action('plugins_loaded', function () { new whatever() });
    

    然后让构造函数使用其他插件中的类(或任何你需要的地方):

    function __construct() {
      $other_plugin_class = new \Namespace\To\Other\Plugin\MyClass();
    }
    

    依赖关系

    如果插件相互依赖,并且需要根据启用和未启用的插件采取不同的行动,您可以这样做:

    if ( ! function_exists( 'is_plugin_active' ) )
      require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
    
    if ( is_admin() and is_plugin_active('myplugin1/plugin1.php') ) {
      add_action( 'admin_menu', array( $this, 'add_a_menu_depending_on_another_plugin' ), 99 );
    }
    

    首先它确保我们需要的功能已经加载,然后检查是否启用了相关插件。

    自动加载器

    值得一提的是,我使用的是内置的自动加载器:

    spl_autoload_register( 'my_autoloader' );
    function my_autoloader( $class_name ) {
      if ( false !== strpos( $class_name, 'Nuvobook' ) ) {
        $classes_dir = plugin_dir_path( __DIR__ );
        $class_file = strtolower(str_replace( '_', '-', str_replace( '\\', DIRECTORY_SEPARATOR, $class_name ) ) . '.php');
        include_once $classes_dir . $class_file;
      }
    }
    

    .. 将 My_Class 的类命名约定映射到文件名 my-class.php

    一切都很好。

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 2022-12-10
      • 2014-11-12
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2015-07-03
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多