【问题标题】:I'm trying to use Composer with WordPress plugin我正在尝试将 Composer 与 WordPress 插件一起使用
【发布时间】:2019-02-17 17:28:03
【问题描述】:

我的源文件是这样开始的:

<?php
/**
 * @package JpLists
 */
namespace Inc\Pages;

use WP_List_Table;

class ListTable extends WP_List_Table {

尝试扩展标准 WordPress 类时,浏览器中出现以下错误:

Fatal error: Class 'WP_List_Table' not found in /srv/www/wordpress/wp-content/plugins/jpLists/inc/Pages/ListTable.php on line 9

This post suggests Composer + WordPress plugins is a bad idea

我正要认输并返回硬编码的 require_once() 调用,但命名空间和自动加载的想法对我很有吸引力。

我的 composer.json 文件看起来像:

{
    "name": "jp/jp-lists",
    "description": "WordPress plugin",
        "type": "wordpress-plugin",
    "license": "GPL",
    "authors": [
        {
            "name": "JP",
            "email": "jp@example.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {},
    "autoload": {
        "psr-4":{"Inc\\": "./inc"}
    }
}

【问题讨论】:

    标签: wordpress composer-php


    【解决方案1】:

    Composer 的自动加载器将负责在您的命名空间 (Inc) 中自动加载类。您在加载 WP_List_Table 时遇到问题,但这不是您的类 - 它是 WordPress 核心类,您项目中的 autolader 甚至不会尝试加载它(因为它没有任何定义在哪里搜索它)。

    此外,此类被标记为内部类,WordPress 文档不鼓励在插件或主题中使用它。这可能是默认情况下不可用的原因。如果你真的需要它,你应该手动要求它:

    if (!class_exists('WP_List_Table')) {
        require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
    }
    

    或者只是以不同的名称将其复制到您的项目中并使用它,就像文档建议的那样:

    这个类的访问被标记为private。这意味着它不适合插件和主题开发人员使用,因为它可能会在未来的任何 WordPress 版本中更改,恕不另行通知。如果您仍想使用该类,则应制作一份副本以与您自己的项目一起使用和分发,否则使用它需要您自担风险。

    https://codex.wordpress.org/Class_Reference/WP_List_Table

    【讨论】:

    • 感谢您的建议。我已经尝试过您之前建议的代码修复,但最终出现了同样的错误。至于类是私有的,警告之外是这样的声明:然而,WP_List_Table 类已经被插件和 WordPress 开发人员广泛使用,因为它提供了一种可靠、一致和语义化的方式来在 WordPress 中创建自定义列表。迄今为止,此类中没有发生或计划发生重大更改,因此使用 WordPress 开发的 beta/RC 阶段测试您的插件应该足以避免任何重大问题。
    【解决方案2】:

    请将以下内容添加到 composer.json。

    [示例案例:wp-content/plugins/example/src/composer.json]

    "autoload": {
        "files": ["../../../../wp-admin/includes/class-wp-list-table.php"]
    }
    

    和生成自动加载文件

    composer dumpautoload
    

    写入类文件

    use WP_List_Table;
    class Test_WP_List_table extentds WP_List_Table {
    .....
    

    但我不知道使用 ABSPATH 方法


    我使用谷歌翻译是因为我不懂英文。

    【讨论】:

      【解决方案3】:

      事实证明,如果你只是在名称前添加一个“\”,PHP 就知道你指的是全局命名空间中的一个类,而不是文件开头指定的命名空间。

      use \WP_List_Table;
      

      我已经放弃了几个月使用命名空间和作曲家的努力,但是在对命名空间进行了一些勤奋的研究之后,我决定再次解决这个问题,并且这是一个简单的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 2019-06-10
        • 1970-01-01
        • 2012-01-10
        • 2011-06-29
        相关资源
        最近更新 更多