esc_html__( 'Number of items per page', 'simple-tags' ), 'default' => 10, 'option' => 'termcloud_per_page' ]; add_screen_option( $option, $args ); $this->terms_table = new Termcloud_List(); } /** * Method for build the page HTML manage tags * * @return void * @author WebFactory Ltd */ public function page_manage_tags() { $default_tab = ''; // Control Post data if ( isset( $_POST['term_action'] ) ) { if(!current_user_can('simple_tags')){ add_settings_error( __CLASS__, __CLASS__, esc_html__( 'Permission denied!', 'simple-tags' ), 'error' ); }else if ( ! wp_verify_nonce( sanitize_text_field($_POST['term_nonce']), 'simpletags_admin' ) ) { // Origination and intention add_settings_error( __CLASS__, __CLASS__, esc_html__( 'Security problem. Try again.', 'simple-tags' ), 'error' ); } elseif ( ! isset( SimpleTags_Admin::$taxonomy ) || ! taxonomy_exists( SimpleTags_Admin::$taxonomy ) ) { // Valid taxo ? add_settings_error( __CLASS__, __CLASS__, esc_html__( 'Missing valid taxonomy for work. Try again.', 'simple-tags' ), 'error' ); } elseif ( $_POST['term_action'] == 'renameterm' ) { $oldtag = ( isset( $_POST['renameterm_old'] ) ) ? sanitize_text_field($_POST['renameterm_old']) : ''; $newtag = ( isset( $_POST['renameterm_new'] ) ) ? sanitize_text_field($_POST['renameterm_new']) : ''; self::renameTerms( SimpleTags_Admin::$taxonomy, $oldtag, $newtag ); $default_tab = '.st-rename-terms'; } elseif ( $_POST['term_action'] == 'mergeterm' ) { $oldtag = ( isset( $_POST['renameterm_old'] ) ) ? sanitize_text_field($_POST['renameterm_old']) : ''; $newtag = ( isset( $_POST['renameterm_new'] ) ) ? sanitize_text_field($_POST['renameterm_new']) : ''; self::mergeTerms( SimpleTags_Admin::$taxonomy, $oldtag, $newtag ); $default_tab = '.st-merge-terms'; } elseif ( $_POST['term_action'] == 'removeterms' ) { $tag = ( isset( $_POST['remove_term_input'] ) ) ? sanitize_text_field($_POST['remove_term_input']) : ''; self::removeTerms( SimpleTags_Admin::$taxonomy, SimpleTags_Admin::$post_type, $tag ); $default_tab = '.st-remove-terms'; } elseif ( $_POST['term_action'] == 'deleteterm' ) { $todelete = ( isset( $_POST['deleteterm_name'] ) ) ? sanitize_text_field($_POST['deleteterm_name']) : ''; self::deleteTermsByTermList( SimpleTags_Admin::$taxonomy, $todelete ); $default_tab = '.st-delete-terms'; } elseif ( $_POST['term_action'] == 'addterm' ) { $matchtag = ( isset( $_POST['addterm_match'] ) ) ? sanitize_text_field($_POST['addterm_match']) : ''; $newtag = ( isset( $_POST['addterm_new'] ) ) ? sanitize_text_field($_POST['addterm_new']) : ''; self::addMatchTerms( SimpleTags_Admin::$taxonomy, $matchtag, $newtag ); $default_tab = '.st-add-terms'; } elseif ( $_POST['term_action'] == 'remove-rarelyterms' ) { self::removeRarelyUsed( SimpleTags_Admin::$taxonomy, (int) $_POST['number-rarely'] ); $default_tab = '.st-delete-unuused-terms'; } /* elseif ( $_POST['term_action'] == 'editslug' ) { $matchtag = (isset($_POST['tagname_match'])) ? $_POST['tagname_match'] : ''; $newslug = (isset($_POST['tagslug_new'])) ? $_POST['tagslug_new'] : ''; self::editTermSlug( SimpleTags_Admin::$taxonomy, $matchtag, $newslug ); }*/ } if($default_tab && !empty($default_tab)){ //trigger default tab click on load echo '
'; } // Default order if ( ! isset( $_GET['order'] ) ) { $_GET['order'] = 'name-asc'; } settings_errors( __CLASS__ ); ?>

' . esc_html__('Search results for “%s”', 'simple-tags') . '', esc_html($search)); } ?> terms_table->prepare_items(); ?>
terms_table->search_box(sprintf(esc_html__('Search %s ', 'simple-tags'), SimpleTags_Admin::$taxo_name), 'term'); ?>

terms_table->display(); //Display the table ?>

*/ ?>



Slug definition', 'simple-tags'); ?>



exit ! if ( empty( $old_terms ) || empty( $new_terms ) ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No new/old valid term specified!', 'simple-tags' ), 'error' ); return false; } $counter = 0; if ( count( $new_terms ) == 1 ) { // Merge // Set new tag $new_tag = sanitize_text_field($new_terms[0]); if ( empty( $new_tag ) ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No valid new term.', 'simple-tags' ), 'error' ); return false; } // Get terms ID from old terms names $terms_id = array(); foreach ( (array) $old_terms as $old_tag ) { $term = get_term_by( 'name', addslashes( sanitize_text_field($old_tag) ), $taxonomy ); $terms_id[] = (int) $term->term_id; } // Get objects from terms ID $objects_id = get_objects_in_term( $terms_id, $taxonomy, array( 'fields' => 'all_with_object_id' ) ); // No objects ? exit ! if ( ! $objects_id ) { // Delete old terms foreach ( (array) $terms_id as $term_id ) { wp_delete_term( $term_id, $taxonomy ); } add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Merge term(s) «%1$s» to «%2$s». %3$s objects edited.', 'simple-tags' ), $old, $new, $counter ), 'updated' ); return true; } // Delete old terms foreach ( (array) $terms_id as $term_id ) { wp_delete_term( $term_id, $taxonomy ); } // Set objects to new term ! (Append no replace) foreach ( (array) $objects_id as $object_id ) { wp_set_object_terms( $object_id, $new_tag, $taxonomy, true ); $counter ++; } // Test if term is also a category /* if ( is_term($new_tag, 'category') ) { // Edit the slug to use the new term self::editTermSlug( $new_tag, sanitize_title($new_tag) ); } */ // Clean cache clean_object_term_cache( $objects_id, $taxonomy ); clean_term_cache( $terms_id, $taxonomy ); if ( $counter == 0 ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No term merged.', 'simple-tags' ), 'updated' ); } else { add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Merge term(s) «%1$s» to «%2$s». %3$s objects edited.', 'simple-tags' ), $old, $new, $counter ), 'updated' ); } } else { // Error add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Error. You need to enter a single term to merge to in new term name !', 'simple-tags' ), $old ), 'error' ); } return true; } /** * Method for remove tags * * @param string $taxonomy * @param string $post_type * @param string $tag * * @return boolean * @author WebFactory Ltd */ public static function removeTerms( $taxonomy = 'post_tag', $post_type = 'posts', $new = '' ) { if ( trim( str_replace( ',', '', stripslashes( $new ) ) ) == '' ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No term specified!', 'simple-tags' ), 'error' ); return false; } // String to array $new_terms = explode( ',', $new ); // Remove empty element and trim $new_terms = array_filter( $new_terms, '_delete_empty_element' ); // If new tag are empty => exit ! if ( empty( $new_terms ) ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No valid term specified!', 'simple-tags' ), 'error' ); return false; } $counter = 0; if ( count($new_terms) > 0 ) { foreach ( (array) $new_terms as $term ) { $term = get_term_by('name', sanitize_text_field($term), $taxonomy); if( empty($term) || !is_object($term) ){ continue; } $term = $term->term_id; $args = array( 'post_type' => $post_type, // post_type 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'id', 'terms' => $term ) ) ); $posts = get_posts($args); foreach ( $posts as $post ){ $remove = wp_remove_object_terms( $post->ID, $term, $taxonomy ); if($remove){ clean_object_term_cache( $post->ID, $taxonomy ); clean_term_cache( $term, $taxonomy ); $counter ++; } } } if ( $counter == 0 ) { add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'This term is not associated with any %1$s.', 'simple-tags' ), SimpleTags_Admin::$post_type_name ), 'error' ); } else { add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Removed term(s) «%1$s» from %2$s %3$s', 'simple-tags' ), $new, $counter, SimpleTags_Admin::$post_type_name ), 'updated' ); } } else { // Error add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Error. No enough terms specified.', 'simple-tags' ), $old ), 'error' ); } return true; } /** * Method for rename tags * * @param string $taxonomy * @param string $old * @param string $new * * @return boolean * @author WebFactory Ltd */ public static function renameTerms( $taxonomy = 'post_tag', $old = '', $new = '' ) { if ( trim( str_replace( ',', '', stripslashes( $new ) ) ) == '' ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No new term specified!', 'simple-tags' ), 'error' ); return false; } // String to array $old_terms = explode( ',', $old ); $new_terms = explode( ',', $new ); // Remove empty element and trim $old_terms = array_filter($old_terms, '_delete_empty_element'); $new_terms = array_filter($new_terms, '_delete_empty_element'); // If old/new tag are empty => exit ! if ( empty( $old_terms ) || empty( $new_terms ) ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No new/old valid term specified!', 'simple-tags' ), 'error' ); return false; } $counter = 0; if ( count($old_terms) === count( $new_terms ) ) { // Rename only foreach ( (array) $old_terms as $i => $old_tag ) { $new_name = sanitize_text_field($new_terms[ $i ]); // Get term by name $term = get_term_by( 'name', sanitize_text_field($old_tag), $taxonomy ); if ( ! $term ) { continue; } // Get objects from term ID $objects_id = get_objects_in_term( $term->term_id, $taxonomy, array( 'fields' => 'all_with_object_id' ) ); // Create the new term if ( ! $term_info = term_exists( $new_name, $taxonomy ) ) { $term_info = wp_insert_term( $new_name, $taxonomy ); } // If default category, update the ID for new term... if ( 'category' == $taxonomy && $term->term_id == get_option( 'default_category' ) ) { update_option( 'default_category', $term_info['term_id'] ); clean_term_cache( $term_info['term_id'], $taxonomy ); } // Delete old term wp_delete_term( $term->term_id, $taxonomy ); // Set objects to new term ! (Append no replace) foreach ( (array) $objects_id as $object_id ) { wp_set_object_terms( $object_id, $new_name, $taxonomy, true ); } // Clean cache clean_object_term_cache( $objects_id, $taxonomy ); clean_term_cache( $term->term_id, $taxonomy ); // Increment $counter ++; } if ( $counter == 0 ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No term renamed.', 'simple-tags' ), 'updated' ); } else { add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Renamed term(s) «%1$s» to «%2$s»', 'simple-tags' ), $old, $new ), 'updated' ); } } else { // Error add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Error. No enough terms for rename.', 'simple-tags' ), $old ), 'error' ); } return true; } /** * Method for delete a list of terms * * @param string $taxonomy * @param string $delete * * @return boolean * @author WebFactory Ltd */ public static function deleteTermsByTermList( $taxonomy = 'post_tag', $delete = '' ) { if ( trim( str_replace( ',', '', stripslashes( $delete ) ) ) == '' ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No term specified!', 'simple-tags' ), 'error' ); return false; } // In array + filter $delete_terms = explode( ',', $delete ); $delete_terms = array_filter( $delete_terms, '_delete_empty_element' ); // Delete tags $counter = 0; foreach ( (array) $delete_terms as $term ) { $term = get_term_by( 'name', sanitize_text_field($term), $taxonomy ); $term_id = (int) $term->term_id; if ( $term_id != 0 ) { wp_delete_term( $term_id, $taxonomy ); clean_term_cache( $term_id, $taxonomy ); $counter ++; } } if ( $counter == 0 ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No term deleted.', 'simple-tags' ), 'updated' ); } else { add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( '%1s term(s) deleted.', 'simple-tags' ), $counter ), 'updated' ); } return true; } /** * Method for add terms for all or specified posts * * @param string $taxonomy * @param string $match * @param string $new * * @return boolean * @author WebFactory Ltd */ public static function addMatchTerms( $taxonomy = 'post_tag', $match = '', $new = '' ) { if ( trim( str_replace( ',', '', stripslashes( $new ) ) ) == '' ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No new term(s) specified!', 'simple-tags' ), 'error' ); return false; } $match_terms = explode( ',', $match ); $new_terms = explode( ',', $new ); $match_terms = array_filter( $match_terms, '_delete_empty_element' ); $new_terms = array_filter( $new_terms, '_delete_empty_element' ); $counter = 0; if ( ! empty( $match_terms ) ) { // Match and add // Get terms ID from old match names $terms_id = array(); foreach ( (array) $match_terms as $match_term ) { $term = get_term_by( 'name', sanitize_text_field($match_term), $taxonomy ); $terms_id[] = (int) $term->term_id; } // Get object ID with terms ID $objects_id = get_objects_in_term( $terms_id, $taxonomy, array( 'fields' => 'all_with_object_id' ) ); // Add new tags for specified post foreach ( (array) $objects_id as $object_id ) { wp_set_object_terms( $object_id, $new_terms, $taxonomy, true ); // Append terms $counter ++; } // Clean cache clean_object_term_cache( $objects_id, $taxonomy ); clean_term_cache( $terms_id, $taxonomy ); } else { // Add for all posts // Page or not ? $post_type_sql = "(post_status = 'publish' OR post_status = 'inherit') AND post_type = '".SimpleTags_Admin::$post_type."'"; // Get all posts ID global $wpdb; $objects_id = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE {$post_type_sql}" ); // Add new tags for all posts foreach ( (array) $objects_id as $object_id ) { wp_set_object_terms( $object_id, $new_terms, $taxonomy, true ); // Append terms clean_object_term_cache( $object_id, $taxonomy ); clean_term_cache( $new_terms, $taxonomy ); $counter ++; } // Clean cache clean_object_term_cache( $objects_id, $taxonomy ); } if ( $counter == 0 ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No term added.', 'simple-tags' ), 'updated' ); } else { add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( 'Term(s) added to %1s %2s.', 'simple-tags' ), $counter, SimpleTags_Admin::$post_type_name ), 'updated' ); } return true; } /** * Delete terms when counter if inferior to a specific number * * @param string $taxonomy * @param integer $number * * @return boolean * @author WebFactory Ltd */ public static function removeRarelyUsed( $taxonomy = 'post_tag', $number = 0 ) { global $wpdb; if ( (int) $number > 100 ) { wp_die( 'Tcheater ?' ); } // Get terms with counter inferior to... $terms_id = $wpdb->get_col( $wpdb->prepare( "SELECT term_id FROM $wpdb->term_taxonomy WHERE taxonomy = %s AND count < %d", $taxonomy, (int) $number ) ); // Delete terms $counter = 0; foreach ( (array) $terms_id as $term_id ) { if ( $term_id != 0 ) { wp_delete_term( $term_id, $taxonomy ); clean_term_cache( $term_id, $taxonomy ); $counter ++; } } if ( $counter == 0 ) { add_settings_error( __CLASS__, __CLASS__, esc_html__( 'No term deleted.', 'simple-tags' ), 'updated' ); } else { add_settings_error( __CLASS__, __CLASS__, sprintf( esc_html__( '%1s term(s) deleted.', 'simple-tags' ), $counter ), 'updated' ); } return true; } /** * Method for edit one or more terms slug * * @param string $taxonomy * @param string $names * @param string $slugs * * @return boolean * @author WebFactory Ltd */ /* public static function editTermSlug( $taxonomy = 'post_tag', $names = '', $slugs = '') { if ( trim( str_replace(',', '', stripslashes($slugs)) ) == '' ) { add_settings_error( __CLASS__, __CLASS__, esc_html__('No new slug(s) specified!', 'simple-tags'), 'error' ); return false; } $match_names = explode(',', $names); $new_slugs = explode(',', $slugs); $match_names = array_filter($match_names, '_delete_empty_element'); $new_slugs = array_filter($new_slugs, '_delete_empty_element'); if ( count($match_names) != count($new_slugs) ) { add_settings_error( __CLASS__, __CLASS__, esc_html__('Terms number and slugs number isn\'t the same!', 'simple-tags'), 'error' ); return false; } else { $counter = 0; foreach ( (array) $match_names as $i => $match_name ) { // Sanitize slug + Escape $new_slug = sanitize_title($new_slugs[$i]); // Get term by name $term = get_term_by('name', $match_name, $taxonomy); if ( !$term ) { continue; } // Increment $counter++; // Update term wp_update_term($term->term_id, $taxonomy, array('slug' => $new_slug)); // Clean cache clean_term_cache($term->term_id, $taxonomy); } } if ( $counter == 0 ) { add_settings_error( __CLASS__, __CLASS__, esc_html__('No slug edited.', 'simple-tags'), 'updated' ); } else { add_settings_error( __CLASS__, __CLASS__, sprintf(esc_html__('%s slug(s) edited.', 'simple-tags'), $counter), 'updated' ); } return true; } */ /** Singleton instance */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } }