WordPress.org

Ready to get started?Download WordPress

Forums

Duplicate Post
Bulk clone solution (4 posts)

  1. Damian
    Member
    Posted 9 months ago #

    Hi Attached in a piece of code I use for bulk clone of a post type called "class_schedule"

    You can remove that post_type check to use it everywhere. I did not made the class, just implemented it to the plugin for a client site.

    /**
     * Timersys - www.timersys.com
     * Add the option to bulk clone a set of posts. Thanks to:
     *     http://www.foxrunsoftware.net/articles/wordpress/add-custom-bulk-action/
     *	Copyright: © 2012 Justin Stern (email : justin@foxrunsoftware.net)
     *	License: GNU General Public License v3.0
     *	License URI: http://www.gnu.org/licenses/gpl-3.0.html
    */
    
    if (!class_exists('FRS_Custom_Bulk_Action')) {
    
    	class FRS_Custom_Bulk_Action {
    
    		public function __construct() {
    
    			if(is_admin()) {
    				// admin actions/filters
    				add_action('admin_footer-edit.php', array(&$this, 'custom_bulk_admin_footer'));
    				add_action('load-edit.php',         array(&$this, 'custom_bulk_action'));
    				add_action('admin_notices',         array(&$this, 'custom_bulk_admin_notices'));
    			}
    		}
    
    		/**
    		 * Step 1: add the custom Bulk Action to the select menus
    		 */
    		function custom_bulk_admin_footer() {
    			global $post_type;
    
    			if($post_type == 'class_schedule') {
    				?>
    					<script type="text/javascript">
    						jQuery(document).ready(function() {
    							jQuery('<option>').val('clone').text('<?php _e('Clone')?>').appendTo("select[name='action']");
    							jQuery('<option>').val('clone').text('<?php _e('Clone')?>').appendTo("select[name='action2']");
    						});
    					</script>
    				<?php
    	    	}
    		}
    
    		/**
    		 * Step 2: handle the custom Bulk Action
    		 *
    		 * Based on the post http://wordpress.stackexchange.com/questions/29822/custom-bulk-action
    		 */
    		function custom_bulk_action() {
    			global $typenow;
    			$post_type = $typenow;
    
    			if($post_type == 'class_schedule') {
    
    				// get the action
    				$wp_list_table = _get_list_table('WP_Posts_List_Table');  // depending on your resource type this could be WP_Users_List_Table, WP_Comments_List_Table, etc
    				$action = $wp_list_table->current_action();
    
    				$allowed_actions = array("clone");
    				if(!in_array($action, $allowed_actions)) return;
    
    				// security check
    				check_admin_referer('bulk-posts');
    
    				// make sure ids are submitted.  depending on the resource type, this may be 'media' or 'ids'
    				if(isset($_REQUEST['post'])) {
    					$post_ids = array_map('intval', $_REQUEST['post']);
    				}
    
    				if(empty($post_ids)) return;
    
    				// this is based on wp-admin/edit.php
    				$sendback = remove_query_arg( array('cloned', 'untrashed', 'deleted', 'ids'), wp_get_referer() );
    				if ( ! $sendback )
    					$sendback = admin_url( "edit.php?post_type=$post_type" );
    
    				$pagenum = $wp_list_table->get_pagenum();
    				$sendback = add_query_arg( 'paged', $pagenum, $sendback );
    
    				switch($action) {
    					case 'clone':
    
    						// if we set up user permissions/capabilities, the code might look like:
    						//if ( !current_user_can($post_type_object->cap->export_post, $post_id) )
    						//	wp_die( __('You are not allowed to export this post.') );
    
    						$exported = 0;
    						foreach( $post_ids as $post_id ) {
    
    							if ( !$this->perform_export($post_id) )
    								wp_die( __('Error Cloning post.') );
    
    							$exported++;
    						}
    
    						$sendback = add_query_arg( array('cloned' => $exported, 'ids' => join(',', $post_ids) ), $sendback );
    					break;
    
    					default: return;
    				}
    
    				$sendback = remove_query_arg( array('action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status',  'post', 'bulk_edit', 'post_view'), $sendback );
    
    				wp_redirect($sendback);
    				exit();
    			}
    		}
    
    		/**
    		 * Step 3: display an admin notice on the Posts page after exporting
    		 */
    		function custom_bulk_admin_notices() {
    			global $post_type, $pagenow;
    
    			if($pagenow == 'edit.php' && $post_type == 'class_schedule' && isset($_REQUEST['cloned']) && (int) $_REQUEST['cloned']) {
    				$message = sprintf( _n( 'Classes cloned.', '%s classes cloned.', $_REQUEST['cloned'] ), number_format_i18n( $_REQUEST['cloned'] ) );
    				echo "<div class=\"updated\"><p>{$message}</p></div>";
    			}
    		}
    
    		function perform_export($post_id) {
    			// do whatever work needs to be done
    
    			$post = get_post($post_id);
    			duplicate_post_create_duplicate($post);
    			return true;
    		}
    	}
    }
    
    new FRS_Custom_Bulk_Action();
    ?>

    http://wordpress.org/plugins/duplicate-post/

  2. WPyogi
    Volunteer Moderator
    Posted 9 months ago #

    Please repost that using the code buttons or to a pastebin - so that your code is not corrupted by the forum's parser -

    http://codex.wordpress.org/Forum_Welcome#Posting_Code

  3. Damian
    Member
    Posted 9 months ago #

    I missed the button, thanks!

  4. tsmulugeta
    Member
    Posted 1 month ago #

    I added your script to my functions.php file and it didn't do anything?! I changed class_schedule to page because I want all pages cloned. Please specify how your script is supposed to work.

    Thanks

Reply

You must log in to post.

About this Plugin

About this Topic

Tags

No tags yet.