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__ );
?>
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;
}
}