* : ID for the object. * * ... * : One or more taxonomies to list. * * [--field=] * : Prints the value of a single field for each term. * * [--fields=] * : Limit the output to specific row fields. * * [--format=] * : Render output in a particular format. * --- * default: table * options: * - table * - csv * - json * - yaml * - count * - ids * --- * * ## AVAILABLE FIELDS * * These fields will be displayed by default for each term: * * * term_id * * name * * slug * * taxonomy * * These fields are optionally available: * * * term_taxonomy_id * * description * * term_group * * parent * * count * * @subcommand list */ public function list_( $args, $assoc_args ) { $defaults = [ 'format' => 'table', ]; $assoc_args = array_merge( $defaults, $assoc_args ); $object_id = array_shift( $args ); $taxonomy_names = $args; $taxonomy_args = []; $this->set_obj_id( $object_id ); foreach ( $taxonomy_names as $taxonomy ) { $this->taxonomy_exists( $taxonomy ); } if ( 'ids' === $assoc_args['format'] ) { $taxonomy_args['fields'] = 'ids'; } $items = wp_get_object_terms( $object_id, $taxonomy_names, $taxonomy_args ); $formatter = $this->get_formatter( $assoc_args ); $formatter->display_items( $items ); } /** * Remove a term from an object. * * ## OPTIONS * * * : The ID of the object. * * * : The name of the term's taxonomy. * * [...] * : The slug of the term or terms to be removed from the object. * * [--by=] * : Explicitly handle the term value as a slug or id. * --- * default: slug * options: * - slug * - id * --- * * [--all] * : Remove all terms from the object. */ public function remove( $args, $assoc_args ) { $object_id = array_shift( $args ); $taxonomy = array_shift( $args ); $terms = $args; $this->set_obj_id( $object_id ); $this->taxonomy_exists( $taxonomy ); $field = Utils\get_flag_value( $assoc_args, 'by' ); if ( $field ) { $terms = $this->prepare_terms( $field, $terms, $taxonomy ); } if ( Utils\get_flag_value( $assoc_args, 'all' ) ) { // No need to specify terms while removing all terms. if ( $terms ) { WP_CLI::error( 'No need to specify terms while removing all terms.' ); } // Remove all set categories from post. $result = wp_delete_object_term_relationships( $object_id, $taxonomy ); $message = 'Removed all terms.'; if ( 'category' === $taxonomy ) { // Set default category to post. $default_category = (int) get_option( 'default_category' ); $default_category = ( ! empty( $default_category ) ) ? $default_category : 1; $default_category = wp_set_object_terms( $object_id, [ $default_category ], $taxonomy, true ); if ( is_wp_error( $default_category ) ) { WP_CLI::error( 'Failed to set default term.' ); } $message = 'Removed all terms and set default term.'; } if ( is_wp_error( $result ) ) { WP_CLI::error( 'Failed to remove all terms.' ); } WP_CLI::success( $message ); return; } // Abort if no terms are specified. if ( ! $terms ) { WP_CLI::error( 'Please specify one or more terms, or use --all.' ); } // Remove term from post. $result = wp_remove_object_terms( $object_id, $terms, $taxonomy ); $label = count( $terms ) > 1 ? 'terms' : 'term'; if ( is_wp_error( $result ) ) { WP_CLI::error( "Failed to remove {$label}." ); } WP_CLI::success( "Removed {$label}." ); } /** * Add a term to an object. * * Append the term to the existing set of terms on the object. * * ## OPTIONS * * * : The ID of the object. * * * : The name of the taxonomy type to be added. * * ... * : The slug of the term or terms to be added. * * [--by=] * : Explicitly handle the term value as a slug or id. * --- * default: slug * options: * - slug * - id * --- */ public function add( $args, $assoc_args ) { $object_id = array_shift( $args ); $taxonomy = array_shift( $args ); $terms = $args; $this->set_obj_id( $object_id ); $this->taxonomy_exists( $taxonomy ); $field = Utils\get_flag_value( $assoc_args, 'by' ); if ( $field ) { $terms = $this->prepare_terms( $field, $terms, $taxonomy ); } $result = wp_set_object_terms( $object_id, $terms, $taxonomy, true ); $label = count( $terms ) > 1 ? 'terms' : 'term'; if ( ! is_wp_error( $result ) ) { WP_CLI::success( "Added {$label}." ); } else { WP_CLI::error( "Failed to add {$label}." ); } } /** * Set object terms. * * Replaces existing terms on the object. * * ## OPTIONS * * * : The ID of the object. * * * : The name of the taxonomy type to be updated. * * ... * : The slug of the term or terms to be updated. * * [--by=] * : Explicitly handle the term value as a slug or id. * --- * default: slug * options: * - slug * - id * --- */ public function set( $args, $assoc_args ) { $object_id = array_shift( $args ); $taxonomy = array_shift( $args ); $terms = $args; $this->set_obj_id( $object_id ); $this->taxonomy_exists( $taxonomy ); $field = Utils\get_flag_value( $assoc_args, 'by' ); if ( $field ) { $terms = $this->prepare_terms( $field, $terms, $taxonomy ); } $result = wp_set_object_terms( $object_id, $terms, $taxonomy, false ); $label = count( $terms ) > 1 ? 'terms' : 'term'; if ( ! is_wp_error( $result ) ) { WP_CLI::success( "Set {$label}." ); } else { WP_CLI::error( "Failed to set {$label}." ); } } /** * Check if taxonomy exists * * @param $taxonomy */ protected function taxonomy_exists( $taxonomy ) { $taxonomy_names = get_object_taxonomies( $this->get_object_type() ); if ( ! in_array( $taxonomy, $taxonomy_names, true ) ) { WP_CLI::error( "Invalid taxonomy {$taxonomy}." ); } } /** * Prepare terms if `--by=` flag is used * * @param array $terms * @param string $field * @param string $taxonomy */ protected function prepare_terms( $field, $terms, $taxonomy ) { if ( 'id' === $field ) { $new_terms = []; foreach ( $terms as $term_id ) { $term = get_term_by( 'term_id', $term_id, $taxonomy ); if ( $term ) { $new_terms[] = $term->slug; } } $terms = $new_terms; } return $terms; } /** * Set obj_id Class variable * * @param string $obj_id */ protected function set_obj_id( $obj_id ) { $this->obj_id = $obj_id; } /** * Get obj_id Class variable * * @return string */ protected function get_obj_id() { return $this->obj_id; } /** * Get obj_type Class variable * * @return string $obj_type */ protected function get_object_type() { return $this->obj_type; } /** * Get Formatter object based on supplied parameters. * * @param array $assoc_args Parameters passed to command. Determines formatting. * * @return WP_CLI\Formatter */ protected function get_formatter( &$assoc_args ) { return new Formatter( $assoc_args, $this->obj_fields, $this->obj_type ); } }