Add `wc com connect` command (#34073)
This commit is contained in:
parent
7a1048340e
commit
796c52018f
|
@ -0,0 +1,4 @@
|
|||
Significance: minor
|
||||
Type: dev
|
||||
|
||||
Add `wc com connect` command to allow stores to connect to WCCOM via CLI
|
|
@ -809,26 +809,7 @@ class WC_Helper {
|
|||
wp_die( 'Something went wrong' );
|
||||
}
|
||||
|
||||
WC_Helper_Options::update(
|
||||
'auth',
|
||||
array(
|
||||
'access_token' => $access_token['access_token'],
|
||||
'access_token_secret' => $access_token['access_token_secret'],
|
||||
'site_id' => $access_token['site_id'],
|
||||
'user_id' => get_current_user_id(),
|
||||
'updated' => time(),
|
||||
)
|
||||
);
|
||||
|
||||
// Obtain the connected user info.
|
||||
if ( ! self::_flush_authentication_cache() ) {
|
||||
self::log( 'Could not obtain connected user info in _helper_auth_return' );
|
||||
WC_Helper_Options::update( 'auth', array() );
|
||||
wp_die( 'Something went wrong.' );
|
||||
}
|
||||
|
||||
self::_flush_subscriptions_cache();
|
||||
self::_flush_updates_cache();
|
||||
self::update_auth_option( $access_token['access_token'], $access_token['access_token_secret'], $access_token['site_id'] );
|
||||
|
||||
/**
|
||||
* Fires when the Helper connection process has completed successfully.
|
||||
|
@ -1697,6 +1678,83 @@ class WC_Helper {
|
|||
// If `access_token` is empty, there's no active connection.
|
||||
return ! empty( $auth['access_token'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows to connect with WCCOM using application password. used it to connect via CLI
|
||||
*
|
||||
* @param string $password The application password.
|
||||
*
|
||||
* @return void|WP_Error
|
||||
*/
|
||||
public static function connect_with_password( string $password ) {
|
||||
$request = WC_Helper_API::post(
|
||||
'connect',
|
||||
array(
|
||||
'headers' => array(
|
||||
'X-API-Key' => $password,
|
||||
'Content-Type' => 'application/json',
|
||||
),
|
||||
'body' => wp_json_encode( array( 'home_url' => home_url() ) ),
|
||||
'authenticated' => false,
|
||||
)
|
||||
);
|
||||
|
||||
$code = wp_remote_retrieve_response_code( $request );
|
||||
|
||||
if ( $code === 403 ) {
|
||||
$message = 'Invalid password';
|
||||
self::log( $message );
|
||||
|
||||
return new WP_Error( 'connect-with-password-invalid-password', $message );
|
||||
} elseif ( $code !== 200 ) {
|
||||
$message = sprintf( 'Call to /connect returned a non-200 response code (%d)', $code );
|
||||
self::log( $message );
|
||||
|
||||
return new WP_Error( 'connect-with-password-' . $code, $message );
|
||||
}
|
||||
|
||||
$access_data = json_decode( wp_remote_retrieve_body( $request ), true );
|
||||
if ( empty( $access_data['access_token'] ) || empty( $access_data['access_token_secret'] ) ) {
|
||||
$message = sprintf( 'Call to /connect returned an invalid body: %s', wp_remote_retrieve_body( $request ) );
|
||||
self::log( $message );
|
||||
|
||||
return new WP_Error( 'connect-with-password-invalid-response', $message );
|
||||
}
|
||||
|
||||
self::update_auth_option( $access_data['access_token'], $access_data['access_token_secret'], $access_data['site_id'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates auth options and flushes cache
|
||||
*
|
||||
* @param string $access_token The access token.
|
||||
* @param string $access_token_secret The secret access token.
|
||||
* @param int $site_id The site id returned by the API.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function update_auth_option( string $access_token, string $access_token_secret, int $site_id ): void {
|
||||
WC_Helper_Options::update(
|
||||
'auth',
|
||||
array(
|
||||
'access_token' => $access_token,
|
||||
'access_token_secret' => $access_token_secret,
|
||||
'site_id' => $site_id,
|
||||
'user_id' => get_current_user_id(),
|
||||
'updated' => time(),
|
||||
)
|
||||
);
|
||||
|
||||
// Obtain the connected user info.
|
||||
if ( ! self::_flush_authentication_cache() ) {
|
||||
self::log( 'Could not obtain connected user info in _helper_auth_return.' );
|
||||
WC_Helper_Options::update( 'auth', array() );
|
||||
wp_die( 'Something went wrong. Could not obtain connected user info in _helper_auth_return.' );
|
||||
}
|
||||
|
||||
self::_flush_subscriptions_cache();
|
||||
self::_flush_updates_cache();
|
||||
}
|
||||
}
|
||||
|
||||
WC_Helper::load();
|
||||
|
|
|
@ -22,6 +22,7 @@ class WC_CLI_COM_Command {
|
|||
public static function register_commands() {
|
||||
WP_CLI::add_command( 'wc com extension list', array( 'WC_CLI_COM_Command', 'list_extensions' ) );
|
||||
WP_CLI::add_command( 'wc com disconnect', array( 'WC_CLI_COM_Command', 'disconnect' ) );
|
||||
WP_CLI::add_command( 'wc com connect', array( 'WC_CLI_COM_Command', 'connect' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -116,4 +117,79 @@ class WC_CLI_COM_Command {
|
|||
WC_Helper::disconnect();
|
||||
WP_CLI::success( 'You have successfully disconnected your store from WooCommerce.com' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Connects to WooCommerce.com with application-password.
|
||||
*
|
||||
* [--password]
|
||||
* : If set, password won't be prompt.
|
||||
*
|
||||
* [--force]
|
||||
* : If set, site will be disconnected and a new connection will be forced.
|
||||
*
|
||||
* ## EXAMPLES
|
||||
*
|
||||
* # Connect to WCCOM using password.
|
||||
* $ wp wc com connect
|
||||
*
|
||||
* # force connecting to WCCOM even if site is already connected.
|
||||
* $ wp wc com connect --force
|
||||
*
|
||||
* # Pass password to comman.
|
||||
* $ wp wc com connect --password=PASSWORD
|
||||
*
|
||||
* @param array $args Positional arguments to include when calling the command.
|
||||
* @param array $assoc_args Associative arguments to include when calling the command.
|
||||
*
|
||||
* @return void
|
||||
* @throws \WP_CLI\ExitException If WP_CLI::$capture_exit is true.
|
||||
*/
|
||||
public static function connect( array $args, array $assoc_args ) {
|
||||
$password = \WP_CLI\Utils\get_flag_value( $assoc_args, 'password' );
|
||||
$force = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false );
|
||||
|
||||
if ( WC_Helper::is_site_connected() ) {
|
||||
if ( $force ) {
|
||||
WC_Helper::disconnect();
|
||||
} else {
|
||||
WP_CLI::error( 'Your store is already connected.' );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// @todo add URL to application password section
|
||||
if ( empty( $password ) ) {
|
||||
$password = self::ask( 'Connection password:' );
|
||||
}
|
||||
$password = sanitize_text_field( $password );
|
||||
if ( empty( $password ) ) {
|
||||
WP_CLI::error( 'Invalid password.' );
|
||||
}
|
||||
|
||||
$auth = WC_Helper::connect_with_password( $password );
|
||||
if ( is_wp_error( $auth ) ) {
|
||||
WP_CLI::error( $auth->get_error_message() );
|
||||
}
|
||||
|
||||
if ( WC_Helper::is_site_connected() ) {
|
||||
WP_CLI::success( 'Store connected successfully.' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We are asking a question and returning an answer as a string.
|
||||
*
|
||||
* @param string $question The question being prompt.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function ask( $question ) {
|
||||
// phpcs:disable WordPress.WP.AlternativeFunctions.file_system_read_fwrite
|
||||
// Adding space to question and showing it.
|
||||
fwrite( STDOUT, $question . ' ' );
|
||||
|
||||
return trim( fgets( STDIN ) );
|
||||
// phpcs:enable
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue