如何使用$_POST创建WP-CLI命令?

时间:2014-09-21 作者:grappler

我想为创建WP-CLI命令WordPress Database Reset plugin.

main function 它对选项使用$\\u POST,但在cli中运行命令时,这些选项将不存在。

应该如何创建cli命令?

我看到了commands cookbook.

function wp_reset_init() {
    global $wpdb, $current_user, $pagenow;

    // Grab the WordPress database tables
    $this->_wp_tables = $wpdb->tables();

    // Check for valid input - goes ahead and drops / resets tables
    if ( isset($_POST[\'wp-random-value\'], $_POST[\'wp-reset-input\']) && $_POST[\'wp-random-value\'] == $_POST[\'wp-reset-input\']
        && check_admin_referer(\'wp-nonce-submit\', $this->_nonce) ) {

        require_once( ABSPATH . \'/wp-admin/includes/upgrade.php\' );

        // No tables were selected
        if ( ! isset($_POST[\'tables\']) && empty($_POST[\'tables\']) ) {
            wp_redirect( admin_url( $pagenow ) . \'?page=wp-reset&reset=no-select\' ); exit();
        }

        // Get current options
        $blog_title = get_option(\'blogname\');
        $public = get_option(\'blog_public\');

        $admin_user = get_user_by(\'login\', \'admin\');
        $user = ( ! $admin_user || ! user_can($admin_user->ID, \'update_core\') ) ? $current_user : $admin_user;

        // Get the selected tables
        $tables = (isset($_POST[\'tables\'])) ? array_flip($_POST[\'tables\']) : array();

        // Compare the selected tables against the ones in the database
        $this->_tables = array_diff_key($this->_wp_tables, $tables);

        // Preserve the data from the tables that are unique
        if ( 0 < count($this->_tables) ) {
            $backup_tables = $this->_backup_tables($this->_tables);
        }

        // Grab the currently active plugins and theme
        if ( isset($_POST[\'wp-reset-check\']) && \'true\' == $_POST[\'wp-reset-check\'] ) {
            $current_data[\'active-plugins\'] = get_option( \'active_plugins\' );
            $current_data[\'current-theme\'] = get_option( \'current_theme\' );
            $current_data[\'template\'] = get_option( \'template\' );
            $current_data[\'stylesheet\'] = get_option( \'stylesheet\' );
        }

        // Run through the database columns, drop all the tables and
        // install wp with previous settings
        if ( $db_tables = $wpdb->get_col("SHOW TABLES LIKE \'{$wpdb->prefix}%\'") ) {
            foreach ($db_tables as $db_table) {
                $wpdb->query("DROP TABLE {$db_table}");
            }
            $keys = wp_install($blog_title, $user->user_login, $user->user_email, $public);
            $this->_wp_update_user($user, $keys);
        }

        // Delete and replace tables with the backed up table data
        if ( ! empty( $backup_tables ) ) {
            foreach ($this->_tables as $table) {
                $wpdb->query("DELETE FROM " . $table);
            }
            $this->_backup_tables($backup_tables, \'reset\');
        }

        if ( ! empty( $current_data ) ) {
            update_option( \'active_plugins\', $current_data[\'active-plugins\'] );
            if ( ! empty( $current_data[\'current-theme\'] ) ) {
                update_option( \'current_theme\', $current_data[\'current-theme\'] );
            }
            update_option( \'template\', $current_data[\'template\'] );
            update_option( \'stylesheet\', $current_data[\'stylesheet\'] );
            wp_redirect( admin_url($pagenow) . \'?page=wp-reset&reset=success\' ); exit();
        }

        wp_redirect( admin_url() ); exit();
    }
}

1 个回复
SO网友:John Blackbourn

主要问题是wp_reset_init() 方法处理太多的事情。它在看$_POST 请求,它执行数据库查询,并执行重定向。

你需要separate your concerns 因此,您最终得到了一个新方法,该方法只执行数据库重置,并接受参数,而不是使用$_POST 直接地然后,可以从WP-CLI命令调用这个重点更紧密的方法(使用$assoc_args) 从您当前的wp_reset_init() 方法(使用$_POST).

结束

相关推荐

当显示错误关闭时,wp-cli显示php通知

我使用的是wp cli,在运行wp export时会出现php通知和错误。其中一些警告和错误最终会出现在输出文件中。如何强制错误不显示。我试过了ini_set(\'display_errors\', 0); 和error_reporting(0); 在wp wp配置中。phproot@roc-apache-4:/var/www/blogs/html# wp export --quiet=true --debug=false --url=http://blogs.democratandchronicle.c