2016-04-26 54 views
1

所以,我在开发WordPress插件方面并不是全新的,但这是我一直在碰到的东西。开发wordpress的oop插件,找不到函数

我正在制作一个使用面向对象风格的插件。然而,这对我来说是全新的。

我试图做一个管理菜单图标显示在后端。使用功能时这很简单。但不知何故,在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没有完全加载。

这是我的主要文件,测试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 

    } 

} 

?> 

所以你可以看到,我打电话test-plugin.php$this->build->ssp_init();而这个函数位于CBuild.php
此功能包含一个WordPress动作钩子,
add_action('wp_loaded', 'ssp_build_hook');。 但它找不到ssp_build_hook

所以我的问题是,为什么找不到ssp_build_hook
任何意见,教程,编码改进或问题改进将不胜感激!

回答

1

尝试像add_action('wp_loaded', array($this, 'ssp_build_hook'));add_action('wp_loaded', array(__CLASS__, 'ssp_build_hook'));在课堂上添加动作,我们需要传入数组,$this,然后function_name。希望这会有所帮助。适用于班级中的所有挂钩。

+0

令人惊叹!非常感谢你。我是这样做的,但是并不真正理解为什么。现在我做了,再次感谢! – Sj03rs