2016-04-26 10 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(); 
?> 

、私はCBuildクラスから$this->build->ssp_init()を呼び出すようにしようとしています。 CBuild.php次のように

cbuildにコードがある:

<?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

関連する問題