按下设置按钮时触发自定义操作

时间:2013-01-09 作者:norman784

这是我的第一个wordpress插件,我在运行它时遇到了很多麻烦,它几乎可以正常工作,但我没有找到一种方法来完成这个特定的事情。

基本上,我有我的插件自定义设置页面,它省去了所有的麻烦,但问题是,在这种情况下,我如何能用我的另一个按钮(在同一个设置页面内)触发同步操作。

因为我的插件在配置后会触发另一个创建/更新表上记录的操作,但第一次我需要运行同步来创建/更新wordpress旧帖子中的记录。

Edit:

插件源代码打开wsd-parse-api.

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

你需要一秒钟form 具有admin_url(\'admin-post.php\') 作为表单操作。然后你就可以admin_post_custom_action 执行您的操作。

示例代码:

add_action( \'admin_post_wpse_79898\', \'wpse_79898_test\' );

function wpse_79898_test() {
    if ( isset ( $_GET[\'test\'] ) )
        echo esc_html( $_GET[\'test\'] );

    die( __FUNCTION__ );
}
在设置页面中:

<form action="<?php echo admin_url( \'admin-post.php\' ); ?>">
<input type="hidden" name="action" value="wpse_79898">
<input type="text" name="test" value="">
<?php submit_button( \'Send\' ); ?>
</form>
<小时>

Update

这是一个相当扩展的示例。它显示:

基本安全操作(nonces,escaping),如何注册和使用回调,如何重定向回原始页面,这甚至适用于网络激活的插件,如何根据允许值的白名单显示自定义消息我在这里使用的示例—更新选项—不应仅用于为现场激活的插件。对于网络激活的插件,这是非常有用的,因为这些插件没有可选的API。

我应该添加评论,但我太懒了。:)我将就此写一篇博客文章,稍后用链接更新答案。

<?php
/* Plugin Name: admin-post demo */

add_action( \'wp_loaded\', array ( WPSE_79898_Admin_Post_Demo::get_instance(), \'register\' ) );

class WPSE_79898_Admin_Post_Demo
{
    /**
     * Plugin instance.
     *
     * @see get_instance()
     * @type object
     */
    protected static $instance = NULL;

    protected $action     = \'wpse_79898\';
    protected $option_name     = \'wpse_79898\';
    protected $page_id = NULL;

    /**
     * Access this plugin’s working instance
     *
     * @wp-hook wp_loaded
     * @return  object of this class
     */
    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    public function register()
    {
        add_action( \'admin_menu\', array ( $this, \'add_menu\' ) );
        add_action( "admin_post_$this->action", array ( $this, \'admin_post\' ) );
    }

    public function add_menu()
    {
        $page_id = add_options_page(
            \'Admin Post Demo\',
            \'Admin Post Demo\',
            \'manage_options\',
            \'admin-post-demo\',
            array ( $this, \'render_options_page\' )
        );

        add_action( "load-$page_id", array ( $this, \'parse_message\' ) );
    }

    public function parse_message()
    {
        if ( ! isset ( $_GET[\'msg\'] ) )
            return;

        $text = FALSE;

        if ( \'updated\' === $_GET[\'msg\'] )
            $this->msg_text = \'Updated!\';

        if ( \'deleted\' === $_GET[\'msg\'] )
            $this->msg_text = \'Deleted!\';

        if ( $this->msg_text )
            add_action( \'admin_notices\', array ( $this, \'render_msg\' ) );
    }

    public function render_msg()
    {
        echo \'<div class="\' . esc_attr( $_GET[\'msg\'] ) . \'"><p>\'
            . $this->msg_text . \'</p></div>\';
    }

    public function render_options_page()
    {
        $option = esc_attr( stripslashes( get_option( $this->option_name ) ) );
        $redirect = urlencode( remove_query_arg( \'msg\', $_SERVER[\'REQUEST_URI\'] ) );
        $redirect = urlencode( $_SERVER[\'REQUEST_URI\'] );

        ?><h1><?php echo $GLOBALS[\'title\']; ?></h1>
        <form action="<?php echo admin_url( \'admin-post.php\' ); ?>" method="POST">
            <input type="hidden" name="action" value="<?php echo $this->action; ?>">
            <?php wp_nonce_field( $this->action, $this->option_name . \'_nonce\', FALSE ); ?>
            <input type="hidden" name="_wp_http_referer" value="<?php echo $redirect; ?>">

            <label for="<?php echo $this->option_name; ?>">Enter some text:</label>
            <input type="text" name="<?php echo $this->option_name;
                ?>" id="<?php echo $this->option_name;
                ?>" value="<?php echo $option; ?>">
            <?php submit_button( \'Send\' ); ?>
        </form>
        <?php
    }

    public function admin_post()
    {
        if ( ! wp_verify_nonce( $_POST[ $this->option_name . \'_nonce\' ], $this->action ) )
            die( \'Invalid nonce.\' . var_export( $_POST, true ) );

        if ( isset ( $_POST[ $this->option_name ] ) )
        {
            update_option( $this->option_name, $_POST[ $this->option_name ] );
            $msg = \'updated\';
        }
        else
        {
            delete_option( $this->option_name );
            $msg = \'deleted\';
        }

        if ( ! isset ( $_POST[\'_wp_http_referer\'] ) )
            die( \'Missing target.\' );

        $url = add_query_arg( \'msg\', $msg, urldecode( $_POST[\'_wp_http_referer\'] ) );

        wp_safe_redirect( $url );
        exit;
    }
}

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $