【问题标题】:Use multiple files in a WordPress plugin - Call to undefined function add_action()在 WordPress 插件中使用多个文件 - 调用未定义函数 add_action()
【发布时间】:2012-10-31 21:06:29
【问题描述】:

我正在尝试编写一个包含多个文件的插件。我确定我之前没有问题,但现在我遇到了问题。

在主插件文件中,我包含了一个文件名 - ydp-includes.php。在 ydp-includes.php 中,我包含了我想要的所有文件,如下所示:

<?php
    include(dirname(__FILE__) . '/1.php');
    include(dirname(__FILE__) . '/2.php');
    include(dirname(__FILE__) . '/3.php');
    include(dirname(__FILE__) . '/4.php');
?>

但我得到了:

致命错误:调用未定义的函数 add_action()

这些文件已包含在内,但出于某种原因,我目前看不到 WordPress 并没有将它们视为一个插件包,并且内部的每个 WordPress 功能都被忽略了。

是否有另一种最佳实践方式来开发多个文件 WordPress 插件?我做错了什么?

【问题讨论】:

  • 如果可能的话,最好创建一个包含所有功能的类,或者创建几个分别具有特定功能的类。 ¿ 是否有任何理由使用包含函数的包含文件?根据这些包含文件的位置,WP 可能无法将它们识别为插件的一部分。

标签: php wordpress


【解决方案1】:

在 PHP 中,includestatement, not a function

应该是这样的:

<?php
include dirname( __FILE__ ) .'/1.php';
include dirname( __FILE__ ) .'/2.php';
include dirname( __FILE__ ) .'/3.php';
include dirname( __FILE__ ) .'/4.php';
?>

或者是完美的:

<?php
require_once dirname( __FILE__ ) .'/1.php';
require_once dirname( __FILE__ ) .'/2.php';
require_once dirname( __FILE__ ) .'/3.php';
require_once dirname( __FILE__ ) .'/4.php';
?>

【讨论】:

  • -1 表示语义,两种包含文件的方法都有效。 +1 推荐 require_once。 :]
【解决方案2】:

使用plugin_dir_path( __FILE__ ); 获取插件的文件。使用下面的代码参考:

$dir = plugin_dir_path( __FILE__ );

require_once($dir.'1.php');

require_once($dir.'2.php');

require_once($dir.'3.php');

require_once($dir.'4.php');

【讨论】:

    【解决方案3】:

    根据错误消息,听起来您正在尝试直接访问插件文件,这是不正确的。 WordPress 使用前端控制器设计模式,这意味着您将希望拥有这样的文件:

    my-plugin-folder/my-plugin-name.php
    my-plugin-folder/includes/ydp-includes.php
    my-plugin-folder/includes/ydp-database.php
    

    my-plugin-name.php 内部:

    //Get the absolute path of the directory that contains the file, with trailing slash.
    define('MY_PLUGIN_PATH', plugin_dir_path(__FILE__)); 
    //This is important, otherwise we'll get the path of a subdirectory
    require_once MY_PLUGIN_PATH . 'includes/ydb-includes.php';
    require_once MY_PLUGIN_PATH . 'includes/ydb-database.php';
    //Now it's time time hook into the WordPress API ;-)
    add_action('admin_menu', function () {
      add_management_page('My plugin Title', 'Menu Title', 'edit_others_posts', 'my_menu_slug', 'my_plugin_menu_page_content'
    });
    //Php 5.3+ Required for anonymous functions. If using 5.2, create a named function or class method
    
    function my_plugin_menu_page_content () {
        //Page content here
    }
    

    这将添加一个 WordPress 管理菜单项,并加载所需的文件。现在,您还可以使用常量 MY_PLUGIN_PATH 在包含的文件中要求更多文件

    另请参阅:

    add_menu_page plugin_dir_path()

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 2016-08-27
      • 2018-11-04
      • 2020-04-24
      • 2014-07-11
      • 2011-09-01
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多