Wordpress oop插件开发,找不到功能

时间:2016-04-26 14:55:53

标签: php wordpress oop

所以,我在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
任何建议,教程,编码改进或问题改进将不胜感激!

1 个答案:

答案 0 :(得分:1)

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