短信代码前的WordPress插件事件调用

时间:2013-10-13 04:07:24

标签: wordpress events plugins shortcode

我正在编写一个插件,我在何时触发插件代码的特定功能时遇到了一些困难。

/*
// Plugin information goes here
*/


// ***** Area A

$GLOBALS['example_class'] = new example_class;

class example_class {

    // ***** Area B

    public function admin_init() {
        add_menu_page(

            // ...

        );
    } // End of admin_init function
} // End of example class

add_action('init', function() {
    global $example_class;

    // ***** Area C

    if ( ?????? ) {

        // Sanitize and set the view role
        $view = ( isset( $_REQUEST['view'] ) ) ? sanitize_key( $_REQUEST['ex'] ) : 'get_all';
        // Manage submitted data
        switch ( $view ) {

            // ...

        } // End of switch for view

        // Sanitize and set the action role
        $action = ( isset( $_REQUEST['action'] ) ) ? sanitize_key( $_REQUEST['action'] ) : NULL;
        // Manage submitted data
        switch ( $action ) {

            //...

        } // End of switch for action

    } // End of if page is being shown
});

add_action( 'admin_menu', function() {
    global $example_class;
    $example_class->admin_init();
});

add_shortcode( 'show_public_random', function () {
    global $example_class;
    // ...
});

根据stackexchange上的建议in a previous post,我将插件的控制器端分隔为init事件调用的函数。但是,我不希望在每个页面加载时评估init事件函数中包含的代码 - 我希望仅在加载包含短代码的页面时评估我的代码。

我已经尝试加载一个初始化为false但在add_shortcode函数中更改为true的布尔类变量,但到那时,为时已晚 - init事件已触发,函数的内容为不跑。

请帮帮我 - 我应该在我的代码的C区使用哪个表达式?我应该测试什么以确保仅在使用短代码时才运行init事件函数?

1 个答案:

答案 0 :(得分:0)

我找到了答案,虽然很乱。

/*
// Plugin information goes here
*/
$GLOBALS['example_class'] = new example_class;

class example_class {

    var $public_loaded = false,
        $content = '';

    public function admin_init() {
        add_menu_page(
            // ...
        );
    } // End of admin_init function

    public function get_random( ) {
        // ...
    }
} // End of example class

add_action('init', function() {
    global $example_class;

    // ***** Area A
    // Check for arbitrary variable sent with every user interaction
    if ( if ( isset( sanitize_key( $_REQUEST['tni'] ) ) ) {

        // ***** Area B
        /* Set the class variable `public_loaded` to true after it's
         * clear we're loading a public page which uses our plugin */
        $example_class->public_loaded = true;

        // Sanitize and set the action role
        $action = ( isset( $_REQUEST['action'] ) ) ? sanitize_key( $_REQUEST['action'] ) : NULL;
        // Manage submitted data
        switch ( $action ) {
            // ...
        } // End of switch for action

        // Sanitize and set the view role
        $view = ( isset( $_REQUEST['view'] ) ) ? sanitize_key( $_REQUEST['ex'] ) : 'get_all';
        // Manage submitted data
        switch ( $view ) {
            // ... Generate content and store in $this->content
        } // End of switch for view
    } // End of if page is being shown
});

add_action( 'admin_menu', function() {
    global $example_class;
    $example_class->admin_init();
});

add_shortcode( 'show_public_random', function () {
    global $example_class;
    // ***** Area C
    /* Check to see if page has loaded using the telltale sign
     * If not, load a default view - a random post */
    if ( $example_class->public_loaded === false ) {
        $example_class->content = $example_class->get_random();
        // ...
    }

    // Return the generated content
    return $example_class->content;
});

在区域A中,我设置了一个限定语句,以查看用户是否提交了变量以及他们与我的插件的交互。如果插件是我的,则会评估代码,并评估actionview模式。同样,该函数将类变量public_loaded设置为true。

在区域C中,我设置了一个限定语句,以查看类变量是否已设置为true;如果没有,则为短代码设置默认视图。