<?php /** * CLI Commands Handler * * @package Kadence Starter Templates */ namespace KadenceWP\KadenceStarterTemplates\CLI; use WP_CLI; use KadenceWP\KadenceStarterTemplates\Starter_Import_Processes; use function KadenceWP\KadenceStarterTemplates\StellarWP\Uplink\get_original_domain; use function KadenceWP\KadenceStarterTemplates\StellarWP\Uplink\get_license_key; use function kadence_blocks_get_current_license_data; use function wp_remote_get; use function is_wp_error; use function wp_remote_retrieve_response_code; use function wp_remote_retrieve_body; /** * CLI Commands Class */ class CLI_Commands { /** * Import selection data * * @var array */ private $import_selection_data; /** * Import base sites * * @var array */ private $import_base_sites; /** * Import base site * * @var array */ private $import_base_site; /** * Plugins to check. */ private $plugins_to_check = [ 'woocommerce', 'elementor', 'kadence-blocks', 'kadence-blocks-pro', 'kadence-pro', 'fluentform', 'wpzoom-recipe-card', 'learndash', 'learndash-course-grid', 'lifterlms', 'tutor', 'give', 'the-events-calendar', 'event-tickets', 'orderable', 'restrict-content', 'kadence-woo-extras', 'seriously-simple-podcasting', 'bookit', ]; /** * Product IDs * * @var array */ private $product_ids = []; /** * Give form ID * * @var string */ private $give_form_id; /** * Ai content * * @var array */ private $ai_content = []; /** * Team image collection * * @var array */ private $team_image_collection = []; /** * Import key * * @var string */ private $import_key; /** * Initialize the CLI commands */ public function __construct() { if ( defined( 'WP_CLI' ) && WP_CLI ) { WP_CLI::add_command( 'kadence-starter run', array( $this, 'run_commands' ) ); } } /** * Run sequential commands * * ## OPTIONS * * [--task=<task>] * : The specific task to run * * [--id=<id>] * : The specific id to run * * [--env=<env>] * : The specific environment to run (dev, staging, live) * * ## EXAMPLES * * wp kadence-starter run --task=import * * @when after_wp_load * @param array $args Arguments. * @param array $assoc_args Associated arguments. */ public function run_commands( $args, $assoc_args ) { $task = isset( $assoc_args['task'] ) ? $assoc_args['task'] : 'default'; $id = isset( $assoc_args['id'] ) ? $assoc_args['id'] : ''; $env = isset( $assoc_args['env'] ) ? $assoc_args['env'] : 'live'; try { switch ( $task ) { case 'import': WP_CLI::log( 'Starting import task sequence...' ); // First task WP_CLI::log( 'Getting import selection data...' ); $this->get_import_selection_data( $id, $env ); WP_CLI::success( 'Import selection data received' ); // Second task WP_CLI::log( 'Removing default content...' ); $this->remove_content(); WP_CLI::success( 'Default content removed' ); // Third task WP_CLI::log( 'Perhaps install plugins...' ); $this->install_plugins(); WP_CLI::success( 'Plugins stage complete' ); // Fourth task WP_CLI::log( 'Perhaps install posts...' ); $this->install_posts(); WP_CLI::success( 'Posts stage complete' ); // Fifth task WP_CLI::log( 'Perhaps install products...' ); $this->install_products(); WP_CLI::success( 'Products stage complete' ); // Sixth task WP_CLI::log( 'Perhaps install events...' ); $this->install_events(); WP_CLI::success( 'Events stage complete' ); // Seventh task WP_CLI::log( 'Perhaps install course...' ); $this->install_course(); WP_CLI::success( 'Course stage complete' ); // Eighth task WP_CLI::log( 'Perhaps install give form...' ); $this->install_give_form(); WP_CLI::success( 'Give form stage complete' ); // Ninth task WP_CLI::log( 'Perhaps install pages...' ); $this->install_pages(); WP_CLI::success( 'Pages stage complete' ); // Ninth task WP_CLI::log( 'Perhaps install theme settings...' ); $this->install_theme(); WP_CLI::success( 'Theme stage complete' ); // Tenth task WP_CLI::log( 'Perhaps install navigation...' ); $this->install_navigation(); WP_CLI::success( 'Navigation stage complete' ); // Eleventh task WP_CLI::log( 'Perhaps install widgets...' ); $this->install_widgets(); WP_CLI::success( 'Widgets stage complete' ); break; default: WP_CLI::error( 'Invalid task specified.' ); break; } WP_CLI::success( 'All tasks completed successfully!' ); } catch ( \Exception $e ) { WP_CLI::error( 'Error: ' . $e->getMessage() ); } } /** * Check if a response code is an error. * * @access public * @return string Returns the remote URL contents. */ public function is_response_code_error( $response ) { $response_code = (int) wp_remote_retrieve_response_code( $response ); if ( $response_code >= 200 && $response_code < 300 ) { return false; } else { return true; } } /** * Example first task */ private function get_import_selection_data( $id = '', $env = 'live' ) { // Get the local license key $license_data = Starter_Import_Processes::get_instance()->get_pro_license_data(); // Make a request to the API to get the import selection data $key = ( !empty( $license_data['api_key'] ) ? $license_data['api_key'] : '' ); $args = [ 'key' => ( !empty( $id ) ? $id : $key ), 'site_url' => ( !empty( $license_data['site_url'] ) ? $license_data['site_url'] : '' ), ]; if ( empty( $args['key'] ) && 'live' === $env ) { WP_CLI::log( 'No license key found.' ); WP_CLI::halt( 0 ); return; } if ( 'dev' === $env ) { $args['env'] = 'dev'; } if ( 'staging' === $env ) { $args['env'] = 'staging'; } $api_url = add_query_arg( $args, 'https://base.startertemplatecloud.com/wp-json/kadence-starter-base/v1/data' ); // Get the response. $response = wp_safe_remote_get( $api_url, array( 'timeout' => 20, ) ); $temp_site_name = get_option( 'blogname' ); // if the temp site name contains .nxcli.io then set it to the site url as a better temp name. if ( strpos( $temp_site_name, '.nxcli.io' ) !== false ) { // Get site url. $site_url = get_option( 'siteurl' ); if ( ! empty( $site_url ) ) { // Get the domain from the site url. $domain = wp_parse_url( $site_url, PHP_URL_HOST ); // Update the site name to the domain. update_option( 'blogname', $domain ); } } // Early exit if there was an error. if ( is_wp_error( $response ) ) { WP_CLI::log( 'Failed to get import selection data: ' . $response->get_error_message() ); WP_CLI::halt( 0 ); return; } if ( $this->is_response_code_error( $response ) ) { $response_code = (int) wp_remote_retrieve_response_code( $response ); if ( 501 === $response_code ) { WP_CLI::log( 'Import selection data is not available for this license key.' ); WP_CLI::halt( 0 ); return; } else { $contents = wp_remote_retrieve_body( $response ); if ( ! empty( $contents ) ) { $contents = json_decode( $contents, true ); } $message = isset( $contents['message'] ) ? $contents['message'] : 'Unknown Response Message'; WP_CLI::log( 'Failed to get import selection data, message: ' . $message ); WP_CLI::halt( 0 ); return; } } // Get the CSS from our response. $contents = wp_remote_retrieve_body( $response ); // Early exit if there was an error. if ( is_wp_error( $contents ) ) { WP_CLI::log( 'Failed to get import selection data: ' . $contents->get_error_message() ); WP_CLI::halt( 0 ); return; } $this->import_selection_data = json_decode( $contents, true ); if ( empty( $this->import_selection_data['ai_data']['template'] ) ) { WP_CLI::log( 'No import selection data found.' ); WP_CLI::halt( 0 ); return; } $this->import_key = $this->import_selection_data['ai_data']['template']; $auth = null; if ( ! empty( $this->import_selection_data['ai_data']['ai_request_id'] ) ) { $auth = $this->import_selection_data['ai_data']['ai_request_id']; unset( $this->import_selection_data['ai_data']['ai_request_id'] ); } update_option( 'kadence_blocks_prophecy', wp_json_encode( $this->import_selection_data['ai_data'] ) ); if ( ! empty( $this->import_selection_data['ai_data']['timezone'] ) ) { update_option( 'timezone_string', $this->import_selection_data['ai_data']['timezone'] ); } $base_site = Starter_Import_Processes::get_instance()->get_ai_base_site( $this->import_key ); if ( is_wp_error( $base_site ) ) { WP_CLI::error( 'Failed to get ai base site: ' . $base_site->get_error_message() ); return; } if ( ! isset( $base_site[$this->import_key] ) ) { WP_CLI::error( 'No import base site found.' ); return; } $this->import_base_site = $base_site[$this->import_key]; // Get the ai content. if ( ! empty( $this->import_selection_data['ai_jobs'] ) && is_array( $this->import_selection_data['ai_jobs'] ) ) { $ai_data = Starter_Import_Processes::get_instance()->get_all_local_ai_items( $this->import_selection_data['ai_jobs'], $auth ); if ( empty( $ai_data ) || is_wp_error( $ai_data ) ) { WP_CLI::error( 'Failed to get ai content: ' . $ai_data->get_error_message() ); return; } $this->ai_content = $ai_data; update_option( 'kb_design_library_prompts', $this->import_selection_data['ai_jobs'] ); } // Get team image collection. $team_image_collection = Starter_Import_Processes::get_instance()->get_images_by_industry( ['Other'], '', 'JPEG', [], false ); if ( is_wp_error( $team_image_collection ) ) { WP_CLI::log( 'Failed to get team image collection: ' . $team_image_collection->get_error_message() ); } update_option( '_kadence_starter_templates_last_import_data', array( $this->import_key ), 'no' ); $this->team_image_collection = ! empty( $team_image_collection ) && is_array( $team_image_collection ) ? $team_image_collection : []; Starter_Import_Processes::get_instance()->trigger_writing_cache(); } /** * Remove content */ private function remove_content() { $remove_content = Starter_Import_Processes::get_instance()->remove_content(); if ( is_wp_error( $remove_content ) ) { WP_CLI::error( 'Failed to remove content: ' . $remove_content->get_error_message() ); return; } } /** * Install plugins */ private function install_plugins() { // Check if the plugins are already installed. $plugins = [ 'kadence-blocks', ]; if ( ! empty( $this->import_selection_data['ai_data']['goals'] ) && is_array( $this->import_selection_data['ai_data']['goals'] ) ) { $goals = $this->import_selection_data['ai_data']['goals']; if ( in_array( 'ecommerce', $goals ) ) { $plugins[] = 'woocommerce'; } if ( in_array( 'events', $goals ) ) { $plugins[] = 'the-events-calendar'; $plugins[] = 'event-tickets'; } if ( in_array( 'tickets', $goals ) ) { $plugins[] = 'event-tickets'; } if ( in_array( 'booking', $goals ) ) { $plugins[] = 'bookit'; } if ( in_array( 'courses', $goals ) ) { $plugins[] = 'learndash'; $plugins[] = 'learndash-course-grid'; } if ( in_array( 'donations', $goals ) ) { $plugins[] = 'give'; } if ( in_array( 'podcasting', $goals ) ) { $plugins[] = 'seriously-simple-podcasting'; } } $installer = new Plugin_Installer(); $result = $installer->install_plugins($plugins); if ( is_wp_error( $result ) ) { WP_CLI::error( 'Failed to install plugins: ' . $result->get_error_message() ); return; } } /** * Install posts */ private function install_posts() { $posts = Starter_Import_Processes::get_instance()->get_remote_posts('base'); if ( is_wp_error( $posts ) ) { WP_CLI::error( 'Failed to get posts: ' . $posts->get_error_message() ); return; } $images = []; if ( ! empty( $this->import_selection_data['ai_data']['imageCollection'] ) && is_array( $this->import_selection_data['ai_data']['imageCollection'] ) ) { $images = $this->import_selection_data['ai_data']['imageCollection']; } $prepared_posts = Starter_Import_Processes::get_instance()->prepare_posts( $posts, $images ); if ( is_wp_error( $prepared_posts ) ) { WP_CLI::error( 'Failed to prepare posts: ' . $prepared_posts->get_error_message() ); return; } $prepared_posts = Starter_Import_Processes::get_instance()->install_posts_extras( $prepared_posts, $images ); if ( is_wp_error( $prepared_posts ) ) { WP_CLI::error( 'Failed to install posts extras: ' . $prepared_posts->get_error_message() ); return; } $install_posts = Starter_Import_Processes::get_instance()->install_posts( $prepared_posts ); if ( is_wp_error( $install_posts ) ) { WP_CLI::error( 'Failed to install posts: ' . $install_posts->get_error_message() ); return; } } /** * Install products */ private function install_products() { $goals = []; if ( ! empty( $this->import_selection_data['ai_data']['goals'] ) && is_array( $this->import_selection_data['ai_data']['goals'] ) ) { $goals = $this->import_selection_data['ai_data']['goals']; } if ( ! in_array( 'ecommerce', $goals ) ) { WP_CLI::log( 'No ecommerce goals found, skipping products installation...' ); return; } if ( ! class_exists( 'WooCommerce' ) ) { WP_CLI::log( 'WooCommerce is not installed, skipping products installation...' ); return; } $products = Starter_Import_Processes::get_instance()->get_remote_products(); if ( is_wp_error( $products ) ) { WP_CLI::error( 'Failed to get products: ' . $products->get_error_message() ); return; } $images = []; if ( ! empty( $this->import_selection_data['ai_data']['imageCollection'] ) && is_array( $this->import_selection_data['ai_data']['imageCollection'] ) ) { $images = $this->import_selection_data['ai_data']['imageCollection']; } $prepared_products = Starter_Import_Processes::get_instance()->prepare_products( $products, $images ); if ( is_wp_error( $prepared_products ) ) { WP_CLI::error( 'Failed to prepare products: ' . $prepared_products->get_error_message() ); return; } $install_products = Starter_Import_Processes::get_instance()->install_products( $prepared_products, $images ); if ( is_wp_error( $install_products ) ) { WP_CLI::error( 'Failed to install products: ' . $install_products->get_error_message() ); return; } $this->product_ids = $install_products; } /** * Install events */ private function install_events() { $goals = []; if ( ! empty( $this->import_selection_data['ai_data']['goals'] ) && is_array( $this->import_selection_data['ai_data']['goals'] ) ) { $goals = $this->import_selection_data['ai_data']['goals']; } if ( ! in_array( 'events', $goals ) ) { WP_CLI::log( 'No events goals found, skipping events installation...' ); return; } if ( ! class_exists( '\Tribe__Events__Main' ) ) { WP_CLI::log( 'The Events Calendar is not installed, skipping events installation...' ); return; } $events = Starter_Import_Processes::get_instance()->get_remote_events(); if ( is_wp_error( $events ) ) { WP_CLI::error( 'Failed to get events: ' . $events->get_error_message() ); return; } $images = []; if ( ! empty( $this->import_selection_data['ai_data']['imageCollection'] ) && is_array( $this->import_selection_data['ai_data']['imageCollection'] ) ) { $images = $this->import_selection_data['ai_data']['imageCollection']; } $prepared_events = Starter_Import_Processes::get_instance()->prepare_events( $events, $images ); if ( is_wp_error( $prepared_events ) ) { WP_CLI::error( 'Failed to prepare events: ' . $prepared_events->get_error_message() ); return; } $install_events = Starter_Import_Processes::get_instance()->install_events( $prepared_events, $images); if ( is_wp_error( $install_events ) ) { WP_CLI::error( 'Failed to install events: ' . $install_events->get_error_message() ); return; } } /** * Install course */ private function install_course() { $goals = []; if ( ! empty( $this->import_selection_data['ai_data']['goals'] ) && is_array( $this->import_selection_data['ai_data']['goals'] ) ) { $goals = $this->import_selection_data['ai_data']['goals']; } if ( ! in_array( 'courses', $goals ) ) { WP_CLI::log( 'No courses goals found, skipping course installation...' ); return; } if ( ! class_exists( '\Learndash_Admin_Import_Export' ) ) { WP_CLI::log( 'LearnDash is not installed, skipping course installation...' ); return; } $course = Starter_Import_Processes::get_instance()->install_course(); if ( is_wp_error( $course ) ) { WP_CLI::log( 'Failed to install course: ' . $course->get_error_message() ); return; } } /** * Install give form */ private function install_give_form() { $goals = []; if ( ! empty( $this->import_selection_data['ai_data']['goals'] ) && is_array( $this->import_selection_data['ai_data']['goals'] ) ) { $goals = $this->import_selection_data['ai_data']['goals']; } if ( ! in_array( 'donations', $goals ) ) { WP_CLI::log( 'No non-profit goals found, skipping give form installation...' ); return; } if ( ! class_exists( '\Give' ) ) { WP_CLI::log( 'Give is not installed, skipping give form installation...' ); return; } $images = []; if ( ! empty( $this->import_selection_data['ai_data']['imageCollection'] ) && is_array( $this->import_selection_data['ai_data']['imageCollection'] ) ) { $images = $this->import_selection_data['ai_data']['imageCollection']; } $site_name = ( !empty( $this->import_selection_data['ai_data']['companyName'] ) ? $this->import_selection_data['ai_data']['companyName'] : 'GiveWP' ); $primary_color = ( !empty( $this->import_selection_data['ai_data']['colorPalette']['colors'][0] ) ? $this->import_selection_data['ai_data']['colorPalette']['colors'][0] : '' ); $give_form = Starter_Import_Processes::get_instance()->install_give_form( $this->ai_content, $images, $site_name, $primary_color ); if ( is_wp_error( $give_form ) ) { WP_CLI::error( 'Failed to install give form: ' . $give_form->get_error_message() ); return; } $this->give_form_id = $give_form; } /** * Install pages */ private function install_pages() { $pages = []; $include_pages = ['home', 'contact', 'about']; if ( ! empty( $this->import_selection_data['ai_data']['includePages'] ) && is_array( $this->import_selection_data['ai_data']['includePages'] ) ) { $include_pages = $this->import_selection_data['ai_data']['includePages']; } $template_pages = $this->import_base_site['pages']; if ( ! empty( $template_pages ) && is_array( $template_pages ) ) { foreach ( $template_pages as $page ) { if ( in_array( $page['slug'], $include_pages ) ) { $pages[] = $page; } } } $images = []; if ( ! empty( $this->import_selection_data['ai_data']['imageCollection'] ) && is_array( $this->import_selection_data['ai_data']['imageCollection'] ) ) { $images = $this->import_selection_data['ai_data']['imageCollection']; } $goals = []; if ( ! empty( $this->import_selection_data['ai_data']['goals'] ) && is_array( $this->import_selection_data['ai_data']['goals'] ) ) { $goals = $this->import_selection_data['ai_data']['goals']; } $color_palette = []; if ( ! empty( $this->import_selection_data['ai_data']['colorPalette'] ) && is_array( $this->import_selection_data['ai_data']['colorPalette'] ) ) { $color_palette = $this->import_selection_data['ai_data']['colorPalette']; } $prepared_pages = Starter_Import_Processes::get_instance()->prepare_pages( $pages, $images, $this->ai_content, $color_palette, $goals, $this->product_ids, $this->team_image_collection, $this->give_form_id ); if ( is_wp_error( $prepared_pages ) ) { WP_CLI::error( 'Failed to prepare pages: ' . $prepared_pages->get_error_message() ); return; } $prepared_pages = Starter_Import_Processes::get_instance()->install_pages_extras( $prepared_pages, $images ); if ( is_wp_error( $prepared_pages ) ) { WP_CLI::error( 'Failed to install pages extras: ' . $prepared_pages->get_error_message() ); return; } $install_pages = Starter_Import_Processes::get_instance()->install_pages( $prepared_pages, $images ); if ( is_wp_error( $install_pages ) ) { WP_CLI::error( 'Failed to install pages: ' . $install_pages->get_error_message() ); return; } } /** * Install theme */ private function install_theme() { $site_name = ( !empty( $this->import_selection_data['ai_data']['companyName'] ) ? $this->import_selection_data['ai_data']['companyName'] : 'Site Name' ); $color_palette = ( !empty( $this->import_selection_data['ai_data']['colorPalette'] ) ? $this->import_selection_data['ai_data']['colorPalette'] : [] ); $dark_footer = ( !empty( $this->import_selection_data['ai_data']['darkFooter'] ) ? $this->import_selection_data['ai_data']['darkFooter'] : false ); $fonts = ( !empty( $this->import_selection_data['ai_data']['fontPair'] ) ? $this->import_selection_data['ai_data']['fontPair'] : [] ); $donation_form_id = ( !empty( $this->give_form_id ) ? $this->give_form_id : '' ); $theme = Starter_Import_Processes::get_instance()->install_settings( $this->import_key, $site_name, $color_palette, $dark_footer, $fonts, $donation_form_id ); if ( is_wp_error( $theme ) ) { WP_CLI::error( 'Failed to install theme: ' . $theme->get_error_message() ); return; } } /** * Install navigation */ private function install_navigation() { $goals = ( ! empty( $this->import_selection_data['ai_data']['goals'] ) && is_array( $this->import_selection_data['ai_data']['goals'] ) ? $this->import_selection_data['ai_data']['goals'] : [] ); $navigation = Starter_Import_Processes::get_instance()->install_navigation( $this->import_key, $goals ); if ( is_wp_error( $navigation ) ) { WP_CLI::error( 'Failed to install navigation: ' . $navigation->get_error_message() ); return; } } /** * Install widgets */ private function install_widgets() { $site_name = ( !empty( $this->import_selection_data['ai_data']['companyName'] ) ? $this->import_selection_data['ai_data']['companyName'] : 'Site Name' ); $widgets = Starter_Import_Processes::get_instance()->install_widgets( $this->import_key, $site_name ); if ( is_wp_error( $widgets ) ) { WP_CLI::error( 'Failed to install widgets: ' . $widgets->get_error_message() ); return; } } }