所以,我在WordPress中开发插件并不是全新的,但这是我一直在讨论的问题。
我正在使用面向对象的风格制作一个插件。然而,这对我来说是全新的。
我正在尝试制作一个管理菜单图标以显示在后端。只使用功能时这很容易。但不知何故,在OOP中,我收到了这个错误:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'ssp_build_hook' not found or invalid function name in /home/example/domains/example.com/public_html/test/wp-includes/plugin.php on line 503
现在,我不知道如何解决这个问题。在尝试调用该函数时,我已经考虑过没有完全加载WordPress。
这是我的主要文件 test-plugin.php:
<?php
namespace SSP;
spl_autoload_register(__NAMESPACE__ . '\\autoload');
function autoload($cls)
{
$cls = ltrim($cls, '\\');
if(strpos($cls, __NAMESPACE__) !== 0)
return;
$cls = str_replace(__NAMESPACE__, '', $cls);
$path = plugin_dir_path(__FILE__) . 'inc' . str_replace('\\', DIRECTORY_SEPARATOR, $cls) . '.php';
require_once($path);
}
class CSSP_Prepare {
function __construct() {
global $wpdb;
$this->tablename = $wpdb->prefix . 'example_table';
$this->fssp_register_hooks();
}
function fssp_register_hooks() {
register_activation_hook(__FILE__, array(&$this, 'fssp_activate'));
register_deactivation_hook(__FILE__, array(&$this, 'fssp_deactivate'));
//register_uninstall_hook(__FILE__, array(&$this, 'fssp_uninstall'));
}
function fssp_activate($wpdb) {
global $wpdb;
if($wpdb->get_var("SHOW TABLES LIKE '" . $this->tablename . "'") != $this->tablename) {
$this->sql = 'CREATE TABLE ' . $this->tablename . ' (id bigint(21) NOT NULL AUTO_INCREMENT, text text, UNIQUE KEY id (id)) ';
require_once(ABSPATH.'wp-admin/includes/upgrade.php');
dbDelta( $this->sql );
}
}
function fssp_deactivate() {
}
function fssp_uninstall() {
$this->sql = 'DROP TABLE ' . $this->tablename . '';
require_once(ABSPATH.'wp-admin/includes/upgrade.php');
dbDelta( $this->sql );
}
}
new CSSP_Prepare();
class CSSP_Construct {
function __construct() {
$this->build = new CBuild();
}
function fssp_construct() {
$this->build->ssp_init();
}
}
$page_constructor = new CSSP_Construct();
$page_constructor->fssp_construct();
?>
正如您所看到的,我正在尝试从$this->build->ssp_init()
班级致电CBuild
。
CBuild代码如下 CBuild.php:
<?php
namespace SSP;
class CBuild {
function __construct() {
require_once( ABSPATH . '/wp-load.php' );
}
function ssp_init() {
add_action('wp_loaded', 'ssp_build_hook');
}
public function ssp_build_hook() {
add_action('admin_menu', 'ssp_buildpage_hooks');
}
function ssp_buildpage_hooks() {
add_menu_page('SSP Options', 'SSP Options', 'manage_options', 'example_plugin_options', 'ssp_build_options_page', 'dashicons-art');
add_menu_page('SSP Orders', 'SSP Orders', 'manage_options', 'example_plugin_orders', 'ssp_build_orders_page', 'dashicons-cart');
}
function ssp_build_options_page() {
?>
<div class="wrapper">
<form action="options.php" method="post">
<?php settings_fields('ssp_options'); ?>
<?php do_settings_sections('ssp_options_input'); ?>
<?php submit_button(); ?>
</form>
</div>
<?php
}
function ssp_build_orders_page() {
?>
<div class="wrapper">
<form action="options.php" method="post">
<?php settings_fields('ssp_orders'); ?>
<?php do_settings_sections('ssp_orders_input'); ?>
<?php submit_button(); ?>
</form>
</div>
<?php
}
}
?>
所以你可以看到,我在$this->build->ssp_init();
中呼叫test-plugin.php
,此功能位于CBuild.php
。
此功能包含一个WordPress动作挂钩,add_action('wp_loaded', 'ssp_build_hook');
。
但它找不到ssp_build_hook
。
所以我的问题是,为什么找不到ssp_build_hook
?
任何建议,教程,编码改进或问题改进将不胜感激!
答案 0 :(得分:1)
尝试add_action('wp_loaded', array( $this, 'ssp_build_hook'));
或add_action('wp_loaded', array( __CLASS__, 'ssp_build_hook'));
在课堂上添加操作,我们需要传递数组,$this
然后function_name
。希望这会有所帮助。适用于班级中的所有挂钩。