2016-04-26 3 views
1

So, ich bin nicht völlig neu zu entwickeln Plugins in WordPress, aber das ist etwas, auf das ich gestoßen bin.Wordpress oop plugin Entwicklung, kann keine Funktion finden

Ich mache ein Plugin mit dem objektorientierten Stil. Dies ist jedoch völlig neu für mich.

Ich versuche, ein Admin-Menü-Symbol im Back-End anzuzeigen. Dies ist ziemlich einfach, wenn Sie nur die Funktion verwenden. Aber irgendwie, in OOP, bekomme ich diesen Fehler:

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 

Jetzt habe ich keine Ahnung, wie das zu beheben. Ich habe darüber nachgedacht, dass WordPress beim Aufruf dieser Funktion nicht vollständig geladen ist.

Das ist meine Hauptdatei, 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(); 
?> 

So wie Sie sehen können, ich versuche $this->build->ssp_init() von der CBuild Klasse aufzurufen.

CBuild Code ist als CBuild.php folgt:

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

    } 

} 

?> 

So können Sie sehen, ich rufe $this->build->ssp_init(); in test-plugin.php und diese Funktion in CBuild.php befindet.
Diese Funktion enthält einen WordPress-Aktions-Hook,
add_action('wp_loaded', 'ssp_build_hook');. Aber es kann ssp_build_hook nicht finden.

Also meine Frage ist, warum kann es ssp_build_hook nicht finden?
Alle Ratschläge, Tutorials, Verbesserungen der Programmierung oder Fragen Verbesserungen würden sehr geschätzt werden!

Antwort

1

Versuchen Sie, wie add_action('wp_loaded', array($this, 'ssp_build_hook')); oder add_action('wp_loaded', array(__CLASS__, 'ssp_build_hook')); Aktion in Klasse hinzuzufügen, müssen wir in Array übergeben, $this und dann function_name. Hoffe, das wird helfen. Gilt für alle Hooks einer Klasse.

+0

Erstaunlich! Vielen Dank. Ich kam von Leuten, die es so machten, aber ich verstand nicht wirklich warum. Jetzt tue ich es doch, nochmals vielen Dank! – Sj03rs

Verwandte Themen