Je voudrais créer une commande WP-CLI pour le plugin WordPress Database Reset .
Dans la fonction principale , il utilise $ _POST pour les options mais lors de l'exécution de la commande dans cli, elles n'existeront pas.
Comment devrait-on s'y prendre pour créer la commande cli?
J'ai vu le livre de recettes de commandes .
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();
}
}
Le problème principal est que votre méthode wp_reset_init()
traite trop de choses. Il examine la demande $_POST
, exécute des requêtes de base de données et effectue des redirections.
Vous devez séparer vos problèmes pour vous retrouver avec une nouvelle méthode qui effectue uniquement la réinitialisation de la base de données et accepte les paramètres plutôt que d'utiliser directement $_POST
. Vous pouvez ensuite appeler cette méthode plus ciblée à partir de votre commande WP-CLI (à l'aide des valeurs de $assoc_args
) et de votre méthode wp_reset_init()
actuelle (à l'aide des valeurs à partir de $_POST
).