Version Description
- Released 2015-01-19
- Added add-on support
- Make sure reordering can only be done by those with edit_pages privileges
- Added pagination for performance reasons
- Optimized queries for performance reasons
- Added warning message for those with a lot of posts
Download this release
Release Info
| Developer | ronalfy |
| Plugin | |
| Version | 2.1.0 |
| Comparing to | |
| See all releases | |
Code changes from version 2.0.2 to 2.1.0
- class-reorder.php +332 -181
- index.php +21 -12
- languages/metronet-reorder-posts.pot +21 -6
- readme.txt +29 -8
- scripts/sort.js +97 -5
class-reorder.php
CHANGED
|
@@ -21,7 +21,7 @@
|
|
| 21 |
* @author Ryan Hellyer <ryan@metronet.no>
|
| 22 |
* @since 1.0
|
| 23 |
*/
|
| 24 |
-
class MN_Reorder {
|
| 25 |
|
| 26 |
/**
|
| 27 |
* @var $post_type
|
|
@@ -29,13 +29,20 @@ class MN_Reorder {
|
|
| 29 |
* @access private
|
| 30 |
*/
|
| 31 |
private $post_type;
|
| 32 |
-
|
| 33 |
/**
|
| 34 |
-
* @var $
|
| 35 |
-
* @desc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
* @access private
|
| 37 |
*/
|
| 38 |
-
private $
|
| 39 |
|
| 40 |
/**
|
| 41 |
* @var $heading
|
|
@@ -71,7 +78,69 @@ class MN_Reorder {
|
|
| 71 |
* @access private
|
| 72 |
*/
|
| 73 |
private $menu_label;
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
/**
|
| 76 |
* Class constructor
|
| 77 |
*
|
|
@@ -94,6 +163,8 @@ class MN_Reorder {
|
|
| 94 |
'final' => '', // Initial text displayed before sorting code
|
| 95 |
'post_status' => 'publish', // Post status of posts to be reordered
|
| 96 |
'menu_label' => __( 'Reorder', 'metronet-reorder-posts' ), //Menu label for the post type
|
|
|
|
|
|
|
| 97 |
);
|
| 98 |
$args = wp_parse_args( $args, $defaults );
|
| 99 |
|
|
@@ -106,63 +177,119 @@ class MN_Reorder {
|
|
| 106 |
$this->menu_label = $args[ 'menu_label' ];
|
| 107 |
$this->post_status = $args[ 'post_status' ];
|
| 108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
// Add actions
|
| 110 |
add_action( 'wp_ajax_post_sort', array( $this, 'ajax_save_post_order' ) );
|
| 111 |
add_action( 'admin_menu', array( $this, 'enable_post_sort' ), 10, 'page' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
}
|
| 113 |
-
|
| 114 |
|
| 115 |
/**
|
| 116 |
* Saving the post oder for later use
|
| 117 |
*
|
| 118 |
-
* @author
|
| 119 |
* @since Reorder 1.0
|
| 120 |
* @access public
|
| 121 |
* @global object $wpdb The primary global database object used internally by WordPress
|
| 122 |
*/
|
| 123 |
public function ajax_save_post_order() {
|
| 124 |
global $wpdb;
|
| 125 |
-
|
|
|
|
| 126 |
// Verify nonce value, for security purposes
|
| 127 |
if ( !wp_verify_nonce( $_POST['nonce'], 'sortnonce' ) ) die( '' );
|
| 128 |
|
| 129 |
-
//Get
|
| 130 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
|
| 132 |
-
|
| 133 |
-
$this->update_posts( $post_data, 0 );
|
| 134 |
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
|
| 167 |
/**
|
| 168 |
* Print styles to admin page
|
|
@@ -173,13 +300,7 @@ class MN_Reorder {
|
|
| 173 |
* @global string $pagenow Used internally by WordPress to designate what the current page is in the admin panel
|
| 174 |
*/
|
| 175 |
public function print_styles() {
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
$pages = array( 'edit.php' );
|
| 179 |
-
|
| 180 |
-
if ( in_array( $pagenow, $pages ) )
|
| 181 |
-
wp_enqueue_style( 'reorderpages_style', REORDER_URL . '/css/admin.css' );
|
| 182 |
-
|
| 183 |
}
|
| 184 |
|
| 185 |
/**
|
|
@@ -191,19 +312,15 @@ class MN_Reorder {
|
|
| 191 |
* @global string $pagenow Used internally by WordPress to designate what the current page is in the admin panel
|
| 192 |
*/
|
| 193 |
public function print_scripts() {
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
'sortnonce' => wp_create_nonce( 'sortnonce' ),
|
| 204 |
-
'hierarchical' => is_post_type_hierarchical( $this->post_type ) ? 'true' : 'false',
|
| 205 |
-
) );
|
| 206 |
-
}
|
| 207 |
}
|
| 208 |
|
| 209 |
/**
|
|
@@ -221,171 +338,205 @@ class MN_Reorder {
|
|
| 221 |
$menu_location, // Parent slug
|
| 222 |
$this->heading, // Page title (unneeded since specified directly)
|
| 223 |
apply_filters( 'metronet_reorder_menu_label_' . $post_type, $this->menu_label , $post_type ), // Menu title
|
| 224 |
-
'
|
| 225 |
'reorder-' . $post_type, // Menu slug
|
| 226 |
array( $this, 'sort_posts' ) // Callback function
|
| 227 |
);
|
|
|
|
| 228 |
}
|
| 229 |
else {
|
| 230 |
$hook = add_posts_page(
|
| 231 |
$this->heading, // Page title (unneeded since specified directly)
|
| 232 |
apply_filters( 'metronet_reorder_menu_label_' . $post_type, $this->menu_label ), // Menu title
|
| 233 |
-
'
|
| 234 |
'reorder-posts', // Menu slug
|
| 235 |
array( $this, 'sort_posts' ) // Callback function
|
| 236 |
);
|
|
|
|
| 237 |
}
|
|
|
|
|
|
|
| 238 |
add_action( 'admin_print_styles-' . $hook, array( $this, 'print_styles' ) );
|
| 239 |
add_action( 'admin_print_scripts-' . $hook, array( $this, 'print_scripts' ) );
|
| 240 |
}
|
| 241 |
|
| 242 |
/**
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
$
|
| 253 |
-
|
|
|
|
|
|
|
|
|
|
| 254 |
?>
|
| 255 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 256 |
<?php
|
| 257 |
-
|
| 258 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
/**
|
| 260 |
-
* Post Row Output
|
| 261 |
*
|
| 262 |
-
* @author Ronald Huereca <
|
| 263 |
-
* @since Reorder 1.0
|
| 264 |
* @access private
|
| 265 |
* @param stdclass $post object to post
|
| 266 |
-
* @param array $all_children - array of children
|
| 267 |
*/
|
| 268 |
-
private function
|
| 269 |
global $post;
|
| 270 |
-
$post = $the_post;
|
| 271 |
-
$post_id = $the_post->ID;
|
| 272 |
-
|
| 273 |
setup_postdata( $post );
|
| 274 |
?>
|
| 275 |
-
<li id="list_<?php the_id(); ?>">
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
* @access private
|
| 293 |
-
* @param stdclass $post object to post
|
| 294 |
-
* @param array $children_pages - array of children
|
| 295 |
-
*/
|
| 296 |
-
private function output_row_children( $children_pages, $all_children ) {
|
| 297 |
-
foreach( $children_pages as $child ) {
|
| 298 |
-
$post_id = $child->ID;
|
| 299 |
-
if ( isset( $all_children[ $post_id ] ) && !empty( $all_children[ $post_id ] ) ) {
|
| 300 |
-
$this->output_row_hierarchical( $child, $all_children[ $post_id ], $all_children );
|
| 301 |
} else {
|
| 302 |
-
|
|
|
|
|
|
|
| 303 |
}
|
| 304 |
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 308 |
|
| 309 |
-
|
| 310 |
/**
|
| 311 |
-
* HTML output
|
| 312 |
*
|
| 313 |
-
* @author Ryan Hellyer <ryan@metronet.no>
|
| 314 |
-
* @since Reorder 1.0
|
| 315 |
* @access public
|
| 316 |
* @global string $post_type
|
| 317 |
*/
|
| 318 |
public function sort_posts() {
|
| 319 |
-
|
| 320 |
?>
|
| 321 |
-
</style>
|
| 322 |
<div class="wrap">
|
| 323 |
<h2>
|
| 324 |
<?php echo esc_html( $this->heading ); ?>
|
| 325 |
-
<img src="<?php echo esc_url( admin_url( 'images/loading.gif' ) ); ?>" id="loading-animation" />
|
| 326 |
</h2>
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
if ( is_post_type_hierarchical( $this->post_type ) ) {
|
| 331 |
-
$pages = get_pages( array(
|
| 332 |
-
'sort_column' => 'menu_order',
|
| 333 |
-
'post_type' => $this->post_type,
|
| 334 |
-
) );
|
| 335 |
-
if( $pages ) {
|
| 336 |
-
$has_posts = true;
|
| 337 |
-
echo '<ul id="post-list">';
|
| 338 |
-
//Get hiearchy of children/parents
|
| 339 |
-
$top_level_pages = array();
|
| 340 |
-
$children_pages = array();
|
| 341 |
-
foreach( $pages as $page ) {
|
| 342 |
-
if ( $page->post_parent == 0 ) {
|
| 343 |
-
//Parent page
|
| 344 |
-
$top_level_pages[] = $page;
|
| 345 |
-
} else {
|
| 346 |
-
$children_pages[ $page->post_parent ][] = $page;
|
| 347 |
-
}
|
| 348 |
-
} //end foreach
|
| 349 |
-
|
| 350 |
-
foreach( $top_level_pages as $page ) {
|
| 351 |
-
$page_id = $page->ID;
|
| 352 |
-
if ( isset( $children_pages[ $page_id ] ) && !empty( $children_pages[ $page_id ] ) ) {
|
| 353 |
-
//If page has children, output page and its children
|
| 354 |
-
$this->output_row_hierarchical( $page, $children_pages[ $page_id ], $children_pages );
|
| 355 |
-
} else {
|
| 356 |
-
$this->output_row( $page );
|
| 357 |
-
}
|
| 358 |
-
}
|
| 359 |
-
echo '</ul>';
|
| 360 |
-
}
|
| 361 |
-
} else {
|
| 362 |
-
//Output non hierarchical posts
|
| 363 |
-
$post_query = new WP_Query(
|
| 364 |
array(
|
| 365 |
-
'
|
| 366 |
-
'
|
| 367 |
-
'
|
| 368 |
-
'
|
| 369 |
-
'post_status' => $this->post_status,
|
| 370 |
)
|
| 371 |
);
|
| 372 |
-
$
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 387 |
</div><!-- .wrap -->
|
| 388 |
<?php
|
| 389 |
} //end sort_posts
|
| 390 |
|
| 391 |
-
}
|
| 21 |
* @author Ryan Hellyer <ryan@metronet.no>
|
| 22 |
* @since 1.0
|
| 23 |
*/
|
| 24 |
+
final class MN_Reorder {
|
| 25 |
|
| 26 |
/**
|
| 27 |
* @var $post_type
|
| 29 |
* @access private
|
| 30 |
*/
|
| 31 |
private $post_type;
|
| 32 |
+
|
| 33 |
/**
|
| 34 |
+
* @var $posts_per_page
|
| 35 |
+
* @desc How many posts to show
|
| 36 |
+
* @access private
|
| 37 |
+
*/
|
| 38 |
+
private $posts_per_page;
|
| 39 |
+
|
| 40 |
+
/**
|
| 41 |
+
* @var $offset
|
| 42 |
+
* @desc How many posts to offset by
|
| 43 |
* @access private
|
| 44 |
*/
|
| 45 |
+
private $offset;
|
| 46 |
|
| 47 |
/**
|
| 48 |
* @var $heading
|
| 78 |
* @access private
|
| 79 |
*/
|
| 80 |
private $menu_label;
|
| 81 |
+
|
| 82 |
+
/**
|
| 83 |
+
* @var $order
|
| 84 |
+
* @desc ASC or DESC
|
| 85 |
+
* @access private
|
| 86 |
+
*/
|
| 87 |
+
private $order;
|
| 88 |
+
|
| 89 |
+
/**
|
| 90 |
+
* @var $reorder_page
|
| 91 |
+
* @desc Where the reorder interface is being added
|
| 92 |
+
* @access private
|
| 93 |
+
*/
|
| 94 |
+
private $reorder_page = '';
|
| 95 |
+
|
| 96 |
+
/**
|
| 97 |
+
* Get method for post status
|
| 98 |
+
*
|
| 99 |
+
* @author Ronald Huereca <ronald@gmail.com>
|
| 100 |
+
* @since Reorder 2.1.0
|
| 101 |
+
* @access public
|
| 102 |
+
* @returns string $post_status Post Status of Posts
|
| 103 |
+
*/
|
| 104 |
+
public function get_post_status() {
|
| 105 |
+
return $this->post_status;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
/**
|
| 109 |
+
* Get method for post order
|
| 110 |
+
*
|
| 111 |
+
* @author Ronald Huereca <ronald@gmail.com>
|
| 112 |
+
* @since Reorder 2.1.0
|
| 113 |
+
* @access public
|
| 114 |
+
* @returns string $order Order of posts (ASC or DESC)
|
| 115 |
+
*/
|
| 116 |
+
public function get_post_order() {
|
| 117 |
+
return $this->order;
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
/**
|
| 121 |
+
* Get method for posts per page
|
| 122 |
+
*
|
| 123 |
+
* @author Ronald Huereca <ronald@gmail.com>
|
| 124 |
+
* @since Reorder 2.1.0
|
| 125 |
+
* @access public
|
| 126 |
+
* @returns int $posts_per_page How many posts to display
|
| 127 |
+
*/
|
| 128 |
+
public function get_posts_per_page() {
|
| 129 |
+
return $this->posts_per_page;
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
/**
|
| 133 |
+
* Get method for post offset used in pagination
|
| 134 |
+
*
|
| 135 |
+
* @author Ronald Huereca <ronald@gmail.com>
|
| 136 |
+
* @since Reorder 2.1.0
|
| 137 |
+
* @access public
|
| 138 |
+
* @returns int $offset Offset of posts
|
| 139 |
+
*/
|
| 140 |
+
public function get_offset() {
|
| 141 |
+
return $this->offset;
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
/**
|
| 145 |
* Class constructor
|
| 146 |
*
|
| 163 |
'final' => '', // Initial text displayed before sorting code
|
| 164 |
'post_status' => 'publish', // Post status of posts to be reordered
|
| 165 |
'menu_label' => __( 'Reorder', 'metronet-reorder-posts' ), //Menu label for the post type
|
| 166 |
+
'offset' => 48,
|
| 167 |
+
'posts_per_page' => 50
|
| 168 |
);
|
| 169 |
$args = wp_parse_args( $args, $defaults );
|
| 170 |
|
| 177 |
$this->menu_label = $args[ 'menu_label' ];
|
| 178 |
$this->post_status = $args[ 'post_status' ];
|
| 179 |
|
| 180 |
+
//Get offset and posts_per_page
|
| 181 |
+
$this->posts_per_page = absint( $args[ 'posts_per_page' ] ); //todo - filterable?
|
| 182 |
+
$this->offset = absint( $args[ 'offset' ] ); //todo - filterable?
|
| 183 |
+
if ( $this->offset > $this->posts_per_page ) {
|
| 184 |
+
$this->offset = $this->posts_per_page;
|
| 185 |
+
}
|
| 186 |
+
|
| 187 |
// Add actions
|
| 188 |
add_action( 'wp_ajax_post_sort', array( $this, 'ajax_save_post_order' ) );
|
| 189 |
add_action( 'admin_menu', array( $this, 'enable_post_sort' ), 10, 'page' );
|
| 190 |
+
add_action( 'metronet_reorder_posts_interface_' . $this->post_type, array( $this, 'output_interface' ) );
|
| 191 |
+
}
|
| 192 |
+
/**
|
| 193 |
+
* Adjust the found posts for the offset
|
| 194 |
+
*
|
| 195 |
+
* @author Ronald Huereca <ronald@gmail.com>
|
| 196 |
+
* @since Reorder 2.1.0
|
| 197 |
+
* @access public
|
| 198 |
+
* @returns int $found_posts Number of posts
|
| 199 |
+
*/
|
| 200 |
+
public function adjust_offset_pagination( $found_posts, $query ) {
|
| 201 |
+
//This sometimes will have a bug of showing an extra page, but it doesn't break anything, so leaving it for now.
|
| 202 |
+
if( $found_posts > $this->posts_per_page ) {
|
| 203 |
+
$num_pages = round($found_posts / $this->offset);
|
| 204 |
+
$found_posts = (string)round( $num_pages * $this->posts_per_page );
|
| 205 |
+
}
|
| 206 |
+
return $found_posts;
|
| 207 |
}
|
|
|
|
| 208 |
|
| 209 |
/**
|
| 210 |
* Saving the post oder for later use
|
| 211 |
*
|
| 212 |
+
* @author Ronald Huereca <ronalfy@gmail.com>
|
| 213 |
* @since Reorder 1.0
|
| 214 |
* @access public
|
| 215 |
* @global object $wpdb The primary global database object used internally by WordPress
|
| 216 |
*/
|
| 217 |
public function ajax_save_post_order() {
|
| 218 |
global $wpdb;
|
| 219 |
+
|
| 220 |
+
if ( !current_user_can( 'edit_pages' ) ) die( '' );
|
| 221 |
// Verify nonce value, for security purposes
|
| 222 |
if ( !wp_verify_nonce( $_POST['nonce'], 'sortnonce' ) ) die( '' );
|
| 223 |
|
| 224 |
+
//Get Ajax Vars
|
| 225 |
+
$post_parent = isset( $_POST[ 'post_parent' ] ) ? absint( $_POST[ 'post_parent' ] ) : 0;
|
| 226 |
+
$menu_order_start = isset( $_POST[ 'start' ] ) ? absint( $_POST[ 'start' ] ) : 0;
|
| 227 |
+
$post_id = isset( $_POST[ 'post_id' ] ) ? absint( $_POST[ 'post_id' ] ) : 0;
|
| 228 |
+
$post_menu_order = isset( $_POST[ 'menu_order' ] ) ? absint( $_POST[ 'menu_order' ] ) : 0;
|
| 229 |
+
$posts_to_exclude = isset( $_POST[ 'excluded' ] ) ? array_filter( $_POST[ 'excluded' ], 'absint' ) : array();
|
| 230 |
+
$post_type = isset( $_POST[ 'post_type' ] ) ? sanitize_text_field( $_POST[ 'post_type' ] ) : false;
|
| 231 |
|
| 232 |
+
if ( !$post_type ) die( '' );
|
|
|
|
| 233 |
|
| 234 |
+
//Performance
|
| 235 |
+
remove_action( 'pre_post_update', 'wp_save_post_revision' );
|
| 236 |
+
|
| 237 |
+
//Build Initial Return
|
| 238 |
+
$return = array();
|
| 239 |
+
$return[ 'more_posts' ] = false;
|
| 240 |
+
$return[ 'action' ] = 'post_sort';
|
| 241 |
+
$return[ 'post_parent' ] = $post_parent;
|
| 242 |
+
$return[ 'nonce' ] = sanitize_text_field( $_POST[ 'nonce' ] );
|
| 243 |
+
$return[ 'post_id'] = $post_id;
|
| 244 |
+
$return[ 'menu_order' ] = $post_menu_order;
|
| 245 |
+
$return[ 'post_type' ] = $post_type;
|
| 246 |
+
|
| 247 |
+
//Update post if passed - Should run only on beginning of first iteration
|
| 248 |
+
if( $post_id > 0 && !isset( $_POST[ 'more_posts' ] ) ) {
|
| 249 |
+
wp_update_post( array( 'ID' => $post_id, 'post_parent' => $post_parent, 'menu_order' => $post_menu_order ) );
|
| 250 |
+
$posts_to_exclude[] = $post_id;
|
| 251 |
+
}
|
| 252 |
|
| 253 |
+
//Build Query
|
| 254 |
+
$query_args = array(
|
| 255 |
+
'post_type' => $post_type,
|
| 256 |
+
'orderby' => 'menu_order title',
|
| 257 |
+
'order' => $this->order,
|
| 258 |
+
'posts_per_page' => 50,
|
| 259 |
+
'suppress_filters' => true,
|
| 260 |
+
'ignore_sticky_posts' => true,
|
| 261 |
+
'post_status' => $this->post_status,
|
| 262 |
+
'post_parent' => $post_parent,
|
| 263 |
+
'post__not_in' => $posts_to_exclude
|
| 264 |
+
);
|
| 265 |
+
$posts = new WP_Query( $query_args );
|
| 266 |
+
$start = $menu_order_start;
|
| 267 |
+
if ( $posts->have_posts() ) {
|
| 268 |
+
foreach( $posts->posts as $post ) {
|
| 269 |
+
//Increment start if matches menu_order and there is a post to change
|
| 270 |
+
if ( $start == $post_menu_order && $post_id > 0 ) {
|
| 271 |
+
$start++;
|
| 272 |
+
}
|
| 273 |
|
| 274 |
+
if ( $post_id != $post->ID ) {
|
| 275 |
+
//Update post and counts
|
| 276 |
+
wp_update_post( array( 'ID' => $post->ID, 'menu_order' => $start, 'post_parent' => $post_parent ) );
|
| 277 |
+
}
|
| 278 |
+
$posts_to_exclude[] = $post->ID;
|
| 279 |
+
$start++;
|
| 280 |
+
}
|
| 281 |
+
$return[ 'excluded' ] = $posts_to_exclude;
|
| 282 |
+
$return[ 'start' ] = $start;
|
| 283 |
+
if ( $posts->max_num_pages > 1 ) {
|
| 284 |
+
$return[ 'more_posts' ] = true;
|
| 285 |
+
} else {
|
| 286 |
+
$return[ 'more_posts' ] = false;
|
| 287 |
+
}
|
| 288 |
+
die( json_encode( $return ) );
|
| 289 |
+
} else {
|
| 290 |
+
die( json_encode( $return ) );
|
| 291 |
+
}
|
| 292 |
+
} //end ajax_save_post_order
|
| 293 |
|
| 294 |
/**
|
| 295 |
* Print styles to admin page
|
| 300 |
* @global string $pagenow Used internally by WordPress to designate what the current page is in the admin panel
|
| 301 |
*/
|
| 302 |
public function print_styles() {
|
| 303 |
+
wp_enqueue_style( 'reorderpages_style', REORDER_URL . '/css/admin.css' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 304 |
}
|
| 305 |
|
| 306 |
/**
|
| 312 |
* @global string $pagenow Used internally by WordPress to designate what the current page is in the admin panel
|
| 313 |
*/
|
| 314 |
public function print_scripts() {
|
| 315 |
+
wp_register_script( 'reorder_nested', REORDER_URL . '/scripts/jquery.mjs.nestedSortable.js', array( 'jquery-ui-sortable' ), '1.3.5', true );
|
| 316 |
+
wp_enqueue_script( 'reorder_posts', REORDER_URL . '/scripts/sort.js', array( 'reorder_nested' ) );
|
| 317 |
+
wp_localize_script( 'reorder_posts', 'reorder_posts', array(
|
| 318 |
+
'action' => 'post_sort',
|
| 319 |
+
'expand' => esc_js( __( 'Expand', 'metronet-reorder-posts' ) ),
|
| 320 |
+
'collapse' => esc_js( __( 'Collapse', 'metronet-reorder-posts' ) ),
|
| 321 |
+
'sortnonce' => wp_create_nonce( 'sortnonce' ),
|
| 322 |
+
'hierarchical' => is_post_type_hierarchical( $this->post_type ) ? 'true' : 'false',
|
| 323 |
+
) );
|
|
|
|
|
|
|
|
|
|
|
|
|
| 324 |
}
|
| 325 |
|
| 326 |
/**
|
| 338 |
$menu_location, // Parent slug
|
| 339 |
$this->heading, // Page title (unneeded since specified directly)
|
| 340 |
apply_filters( 'metronet_reorder_menu_label_' . $post_type, $this->menu_label , $post_type ), // Menu title
|
| 341 |
+
'edit_pages', // Capability
|
| 342 |
'reorder-' . $post_type, // Menu slug
|
| 343 |
array( $this, 'sort_posts' ) // Callback function
|
| 344 |
);
|
| 345 |
+
$this->reorder_page = add_query_arg( array( 'page' => 'reorder-' . $post_type ), admin_url( $menu_location ) );
|
| 346 |
}
|
| 347 |
else {
|
| 348 |
$hook = add_posts_page(
|
| 349 |
$this->heading, // Page title (unneeded since specified directly)
|
| 350 |
apply_filters( 'metronet_reorder_menu_label_' . $post_type, $this->menu_label ), // Menu title
|
| 351 |
+
'edit_pages', // Capability
|
| 352 |
'reorder-posts', // Menu slug
|
| 353 |
array( $this, 'sort_posts' ) // Callback function
|
| 354 |
);
|
| 355 |
+
$this->reorder_page = add_query_arg( array( 'page' => 'reorder-posts' ), admin_url( 'edit.php' ) );
|
| 356 |
}
|
| 357 |
+
do_action( 'metronet_reorder_posts_add_menu_' . $post_type, $hook ); //Allow other plugin authors to add scripts/styles to our menu items
|
| 358 |
+
do_action( 'metronet_reorder_menu_url_' . $post_type, $this->reorder_page );
|
| 359 |
add_action( 'admin_print_styles-' . $hook, array( $this, 'print_styles' ) );
|
| 360 |
add_action( 'admin_print_scripts-' . $hook, array( $this, 'print_scripts' ) );
|
| 361 |
}
|
| 362 |
|
| 363 |
/**
|
| 364 |
+
* Output the main Reorder Interface
|
| 365 |
+
*
|
| 366 |
+
* @author Ryan Hellyer <ryan@metronet.no> and Ronald Huereca <ronalfy@gmail.com>
|
| 367 |
+
* @since Reorder 2.1.0
|
| 368 |
+
* @access public
|
| 369 |
+
* @global string $post_type
|
| 370 |
+
*/
|
| 371 |
+
public function output_interface() {
|
| 372 |
+
echo '<br />';
|
| 373 |
+
$post_count_obj = wp_count_posts( $this->post_type );
|
| 374 |
+
$post_count = isset( $post_count_obj->{$this->post_status} ) ?absint( $post_count_obj->{$this->post_status} ) : absint( $post_count_obj[ 'publish' ] );
|
| 375 |
+
if ( $post_count >= 1000 ) {
|
| 376 |
+
printf( '<div class="error"><p>%s</p></div>', sprintf( __( 'There are over %s posts found. We do not recommend you sort these posts for performance reasons.', 'metronet_reorder_posts' ), number_format( $post_count ) ) );
|
| 377 |
+
}
|
| 378 |
?>
|
| 379 |
+
<div id="reorder-error"></div>
|
| 380 |
+
<div><img src="<?php echo esc_url( admin_url( 'images/loading.gif' ) ); ?>" id="loading-animation" /></div>
|
| 381 |
+
<div class="updated">
|
| 382 |
+
<p><strong>
|
| 383 |
+
<?php echo sprintf( __( 'Note: reordering here does not change the order on your website without some code modifications. Please see our <a target="_blank" href="%s">Wiki</a>.', 'metronet-reorder-posts' ), 'https://github.com/ronalfy/reorder-posts/wiki' ); ?>
|
| 384 |
+
</strong></p>
|
| 385 |
+
</div>
|
| 386 |
+
<?php echo esc_html( $this->initial ); ?>
|
| 387 |
<?php
|
| 388 |
+
//Output non hierarchical posts
|
| 389 |
+
$page = isset( $_GET[ 'paged' ] ) ? absint( $_GET[ 'paged' ] ) : 0;
|
| 390 |
+
if ( $page == 0 ) {
|
| 391 |
+
$offset = 0;
|
| 392 |
+
} elseif ( $page > 1 ) {
|
| 393 |
+
$offset = $this->offset * ( $page - 1 );
|
| 394 |
+
}
|
| 395 |
+
printf( '<input type="hidden" id="reorder-offset" value="%s" />', absint( $offset ) );
|
| 396 |
+
add_filter( 'found_posts', array( $this, 'adjust_offset_pagination' ), 10, 2 );
|
| 397 |
+
$post_query = new WP_Query(
|
| 398 |
+
array(
|
| 399 |
+
'post_type' => $this->post_type,
|
| 400 |
+
'posts_per_page' => $this->posts_per_page,
|
| 401 |
+
'orderby' => 'menu_order title',
|
| 402 |
+
'order' => $this->order,
|
| 403 |
+
'post_status' => $this->post_status,
|
| 404 |
+
'post_parent' => 0,
|
| 405 |
+
'offset' => $offset
|
| 406 |
+
)
|
| 407 |
+
);
|
| 408 |
+
remove_filter( 'found_posts', array( $this, 'adjust_offset_pagination' ), 10, 2 );
|
| 409 |
+
if( $post_query->have_posts() ) {
|
| 410 |
+
echo '<ul id="post-list">';
|
| 411 |
+
while( $post_query->have_posts() ) {
|
| 412 |
+
global $post;
|
| 413 |
+
$post_query->the_post();
|
| 414 |
+
$this->output_row( $post );
|
| 415 |
+
}
|
| 416 |
+
echo '</ul><!-- #post-list -->';
|
| 417 |
+
|
| 418 |
+
//Show pagination links
|
| 419 |
+
if( $post_query->max_num_pages > 1 ) {
|
| 420 |
+
echo '<div id="reorder-pagination">';
|
| 421 |
+
$current_url = add_query_arg( array( 'paged' => '%#%' ) );
|
| 422 |
+
$pagination_args = array(
|
| 423 |
+
'base' => $current_url,
|
| 424 |
+
'total' => $post_query->max_num_pages,
|
| 425 |
+
'current' => ( $page == 0 ) ? 1 : $page
|
| 426 |
+
);
|
| 427 |
+
echo paginate_links( $pagination_args );
|
| 428 |
+
echo '</div>';
|
| 429 |
+
}
|
| 430 |
+
} else {
|
| 431 |
+
echo sprintf( '<h3>%s</h3> ', esc_html__( 'There is nothing to sort at this time', 'metronet-reorder-posts' ) );
|
| 432 |
+
}
|
| 433 |
+
echo esc_html( $this->final );
|
| 434 |
+
}
|
| 435 |
/**
|
| 436 |
+
* Post Row Output
|
| 437 |
*
|
| 438 |
+
* @author Ronald Huereca <ronalfy@gmail.com>
|
| 439 |
+
* @since Reorder 2.1.0
|
| 440 |
* @access private
|
| 441 |
* @param stdclass $post object to post
|
|
|
|
| 442 |
*/
|
| 443 |
+
private function output_row( $post ) {
|
| 444 |
global $post;
|
|
|
|
|
|
|
|
|
|
| 445 |
setup_postdata( $post );
|
| 446 |
?>
|
| 447 |
+
<li id="list_<?php the_id(); ?>" data-id="<?php the_id(); ?>" data-menu-order="<?php echo absint( $post->menu_order ); ?>" data-parent="<?php echo absint( $post->post_parent ); ?>" data-post-type="<?php echo esc_attr( $post->post_type ); ?>">
|
| 448 |
+
<?php
|
| 449 |
+
//Get the children
|
| 450 |
+
$args = array(
|
| 451 |
+
'post_type' => $this->post_type,
|
| 452 |
+
'post_status' => $this->post_status,
|
| 453 |
+
'posts_per_page' => 100, /*hope there's never more than 100 children*/
|
| 454 |
+
'post_parent' => get_the_ID(),
|
| 455 |
+
'orderby' => 'menu_order',
|
| 456 |
+
'order' => $this->order,
|
| 457 |
+
);
|
| 458 |
+
$children = new WP_Query( $args );
|
| 459 |
+
//Output parent title
|
| 460 |
+
if( $children->have_posts() ) {
|
| 461 |
+
?>
|
| 462 |
+
<div><?php the_title(); ?><?php echo ( defined( 'REORDER_DEBUG' ) && REORDER_DEBUG == true ) ? ' - Menu Order:' . absint( $post->menu_order ) : ''; ?><a href='#' style="float: right"><?php esc_html_e( 'Expand', 'metronet-reorder-posts' ); ?></a></div>
|
| 463 |
+
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 464 |
} else {
|
| 465 |
+
?>
|
| 466 |
+
<div><?php the_title(); ?><?php echo ( defined( 'REORDER_DEBUG' ) && REORDER_DEBUG == true ) ? ' - Menu Order:' . absint( $post->menu_order ) : ''; ?></div>
|
| 467 |
+
<?php
|
| 468 |
}
|
| 469 |
|
| 470 |
+
if( $children->have_posts() ) {
|
| 471 |
+
echo '<ul class="children">';
|
| 472 |
+
while( $children->have_posts() ) {
|
| 473 |
+
global $post;
|
| 474 |
+
$children->the_post();
|
| 475 |
+
$this->output_row( $post );
|
| 476 |
+
}
|
| 477 |
+
echo '</ul>';
|
| 478 |
+
}
|
| 479 |
+
?>
|
| 480 |
+
</li>
|
| 481 |
+
<?php
|
| 482 |
+
} //end output_row
|
| 483 |
|
|
|
|
| 484 |
/**
|
| 485 |
+
* Initial HTML output
|
| 486 |
*
|
| 487 |
+
* @author Ryan Hellyer <ryan@metronet.no> and Ronald Huereca <ronalfy@gmail.com>
|
| 488 |
+
* @since Reorder 2.1.0
|
| 489 |
* @access public
|
| 490 |
* @global string $post_type
|
| 491 |
*/
|
| 492 |
public function sort_posts() {
|
| 493 |
+
//Dev note - Settings API not used here because there are no options to save.
|
| 494 |
?>
|
|
|
|
| 495 |
<div class="wrap">
|
| 496 |
<h2>
|
| 497 |
<?php echo esc_html( $this->heading ); ?>
|
|
|
|
| 498 |
</h2>
|
| 499 |
+
<?php
|
| 500 |
+
$tabs =
|
| 501 |
+
array(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 502 |
array(
|
| 503 |
+
'url' => $this->reorder_page /* URL to the tab */,
|
| 504 |
+
'label' => $this->heading,
|
| 505 |
+
'get' => 'main' /*$_GET variable*/,
|
| 506 |
+
'action' => 'metronet_reorder_posts_interface_' . $this->post_type /* action variable in do_action */
|
|
|
|
| 507 |
)
|
| 508 |
);
|
| 509 |
+
$tabs = apply_filters( 'metronet_reorder_posts_tabs_' . $this->post_type, (array)$tabs );
|
| 510 |
+
$tabs_count = count( $tabs );
|
| 511 |
+
|
| 512 |
+
//Output tabs
|
| 513 |
+
$tab_html = '';
|
| 514 |
+
if ( $tabs && !empty( $tabs ) ) {
|
| 515 |
+
$tab_html .= '<h2 class="nav-tab-wrapper">';
|
| 516 |
+
$active_tab = isset( $_GET[ 'tab' ] ) ? sanitize_text_field( $_GET[ 'tab' ] ) : 'main';
|
| 517 |
+
$do_action = false;
|
| 518 |
+
foreach( $tabs as $tab ) {
|
| 519 |
+
$classes = array( 'nav-tab' );
|
| 520 |
+
$tab_get = isset( $tab[ 'get' ] ) ? $tab[ 'get' ] : '';
|
| 521 |
+
if ( $active_tab == $tab_get ) {
|
| 522 |
+
$classes[] = 'nav-tab-active';
|
| 523 |
+
$do_action = isset( $tab[ 'action' ] ) ? $tab[ 'action' ] : false;
|
| 524 |
+
}
|
| 525 |
+
$tab_url = isset( $tab[ 'url' ] ) ? $tab[ 'url' ] : '';
|
| 526 |
+
$tab_label = isset( $tab[ 'label' ] ) ? $tab[ 'label' ] : '';
|
| 527 |
+
$tab_html .= sprintf( '<a href="%s" class="%s">%s</a>', esc_url( $tab_url ), esc_attr( implode( ' ', $classes ) ), esc_html( $tab[ 'label' ] ) );
|
| 528 |
+
}
|
| 529 |
+
$tab_html .= '</h2>';
|
| 530 |
+
if ( $tabs_count > 1 ) {
|
| 531 |
+
echo $tab_html;
|
| 532 |
+
}
|
| 533 |
+
if ( $do_action ) {
|
| 534 |
+
do_action( $do_action );
|
| 535 |
+
}
|
| 536 |
+
}
|
| 537 |
+
?>
|
| 538 |
</div><!-- .wrap -->
|
| 539 |
<?php
|
| 540 |
} //end sort_posts
|
| 541 |
|
| 542 |
+
}
|
index.php
CHANGED
|
@@ -2,8 +2,8 @@
|
|
| 2 |
/*
|
| 3 |
Plugin Name: Metronet Reorder Posts
|
| 4 |
Plugin URI: https://wordpress.org/plugins/metronet-reorder-posts/
|
| 5 |
-
Description:
|
| 6 |
-
Version: 2.0
|
| 7 |
Author: Ryan Hellyer, Ronald Huereca, Scott Basgaard
|
| 8 |
Author URI: https://github.com/ronalfy/reorder-posts
|
| 9 |
Text Domain: metronet-reorder-posts
|
|
@@ -50,6 +50,7 @@ require( 'class-reorder-admin.php' );
|
|
| 50 |
* @since 1.0
|
| 51 |
* @author Ryan Hellyer <ryan@metronet.no>
|
| 52 |
*/
|
|
|
|
| 53 |
define( 'REORDER_DIR', rtrim( plugin_dir_path(__FILE__), '/' ) ); // Plugin folder DIR
|
| 54 |
define( 'REORDER_URL', rtrim( plugin_dir_url(__FILE__), '/' ) ); // Plugin folder URL
|
| 55 |
define( 'REORDER_BASENAME', plugin_basename(__FILE__) ); //Plugin basename
|
|
@@ -63,6 +64,7 @@ define( 'REORDER_BASENAME', plugin_basename(__FILE__) ); //Plugin basename
|
|
| 63 |
*/
|
| 64 |
add_action( 'wp_loaded', 'mn_reorder_posts_init', 100 ); //Load low priority in init for other plugins to generate their post types
|
| 65 |
function mn_reorder_posts_init() {
|
|
|
|
| 66 |
$post_types = get_post_types( array(), 'names' );
|
| 67 |
|
| 68 |
//Get plugin options for post types and exclude as necessary
|
|
@@ -77,6 +79,7 @@ function mn_reorder_posts_init() {
|
|
| 77 |
|
| 78 |
// Add filter to allow users to control which post-types the plugin is used with via their theme
|
| 79 |
$post_types = array_unique( apply_filters( 'metronet_reorder_post_types', $post_types ) );
|
|
|
|
| 80 |
|
| 81 |
foreach ( $post_types as $post_type ) {
|
| 82 |
//Generate heading
|
|
@@ -85,16 +88,18 @@ function mn_reorder_posts_init() {
|
|
| 85 |
$heading = sprintf( __( 'Reorder %s', 'metronet-reorder-posts' ), $post_type_label );
|
| 86 |
|
| 87 |
// Instantiate new reordering
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
|
|
|
|
|
|
| 98 |
);
|
| 99 |
}
|
| 100 |
} //end mt_reorder_posts_init
|
|
@@ -105,3 +110,7 @@ function mn_reorder_init_language() {
|
|
| 105 |
load_plugin_textdomain( 'metronet-reorder-posts', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
|
| 106 |
}
|
| 107 |
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
/*
|
| 3 |
Plugin Name: Metronet Reorder Posts
|
| 4 |
Plugin URI: https://wordpress.org/plugins/metronet-reorder-posts/
|
| 5 |
+
Description: Easily reorder posts and pages in WordPress
|
| 6 |
+
Version: 2.1.0
|
| 7 |
Author: Ryan Hellyer, Ronald Huereca, Scott Basgaard
|
| 8 |
Author URI: https://github.com/ronalfy/reorder-posts
|
| 9 |
Text Domain: metronet-reorder-posts
|
| 50 |
* @since 1.0
|
| 51 |
* @author Ryan Hellyer <ryan@metronet.no>
|
| 52 |
*/
|
| 53 |
+
define( 'REORDER_ALLOW_ADDONS', true ); // Plugin folder DIR
|
| 54 |
define( 'REORDER_DIR', rtrim( plugin_dir_path(__FILE__), '/' ) ); // Plugin folder DIR
|
| 55 |
define( 'REORDER_URL', rtrim( plugin_dir_url(__FILE__), '/' ) ); // Plugin folder URL
|
| 56 |
define( 'REORDER_BASENAME', plugin_basename(__FILE__) ); //Plugin basename
|
| 64 |
*/
|
| 65 |
add_action( 'wp_loaded', 'mn_reorder_posts_init', 100 ); //Load low priority in init for other plugins to generate their post types
|
| 66 |
function mn_reorder_posts_init() {
|
| 67 |
+
global $mn_reorder_instances;
|
| 68 |
$post_types = get_post_types( array(), 'names' );
|
| 69 |
|
| 70 |
//Get plugin options for post types and exclude as necessary
|
| 79 |
|
| 80 |
// Add filter to allow users to control which post-types the plugin is used with via their theme
|
| 81 |
$post_types = array_unique( apply_filters( 'metronet_reorder_post_types', $post_types ) );
|
| 82 |
+
do_action( 'metronet_reorder_post_types_loaded', $post_types );
|
| 83 |
|
| 84 |
foreach ( $post_types as $post_type ) {
|
| 85 |
//Generate heading
|
| 88 |
$heading = sprintf( __( 'Reorder %s', 'metronet-reorder-posts' ), $post_type_label );
|
| 89 |
|
| 90 |
// Instantiate new reordering
|
| 91 |
+
$mn_reorder_args = array(
|
| 92 |
+
'post_type' => $post_type,
|
| 93 |
+
'order' => 'ASC',
|
| 94 |
+
'heading' => $heading,
|
| 95 |
+
'final' => '',
|
| 96 |
+
'initial' => '',
|
| 97 |
+
'menu_label' => __( 'Reorder', 'metronet-reorder-posts' ),
|
| 98 |
+
'post_status' => 'publish',
|
| 99 |
+
);
|
| 100 |
+
|
| 101 |
+
$mn_reorder_instances[ $post_type ] = new MN_Reorder(
|
| 102 |
+
$mn_reorder_args
|
| 103 |
);
|
| 104 |
}
|
| 105 |
} //end mt_reorder_posts_init
|
| 110 |
load_plugin_textdomain( 'metronet-reorder-posts', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
|
| 111 |
}
|
| 112 |
|
| 113 |
+
/* Global variable for storing class instances */
|
| 114 |
+
global $mn_reorder_instances;
|
| 115 |
+
$mn_reorder_instances = array();
|
| 116 |
+
|
languages/metronet-reorder-posts.pot
CHANGED
|
@@ -5,7 +5,7 @@ msgid ""
|
|
| 5 |
msgstr ""
|
| 6 |
"Project-Id-Version: Metronet Reorder Posts v1.0.0\n"
|
| 7 |
"Report-Msgid-Bugs-To: Ronald Huereca <ronalfy@gmail.com>\n"
|
| 8 |
-
"POT-Creation-Date:
|
| 9 |
"PO-Revision-Date: \n"
|
| 10 |
"Last-Translator: Ronald Huereca <ron@ronalfy.com>\n"
|
| 11 |
"Language-Team: Ronald Huereca <ronalfy@gmail.com>\n"
|
|
@@ -96,27 +96,42 @@ msgstr ""
|
|
| 96 |
msgid "Select the menu order for the post types."
|
| 97 |
msgstr ""
|
| 98 |
|
| 99 |
-
#: class-reorder.php:
|
| 100 |
msgid "Reorder"
|
| 101 |
msgstr ""
|
| 102 |
|
| 103 |
-
#: class-reorder.php:
|
| 104 |
msgid "Expand"
|
| 105 |
msgstr ""
|
| 106 |
|
| 107 |
-
#: class-reorder.php:
|
| 108 |
msgid "Collapse"
|
| 109 |
msgstr ""
|
| 110 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 111 |
#: class-reorder.php:383
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
msgid "There is nothing to sort at this time"
|
| 113 |
msgstr ""
|
| 114 |
|
| 115 |
-
#: index.php:
|
| 116 |
msgid "Posts"
|
| 117 |
msgstr ""
|
| 118 |
|
| 119 |
-
#: index.php:
|
| 120 |
#, php-format
|
| 121 |
msgid "Reorder %s"
|
| 122 |
msgstr ""
|
| 5 |
msgstr ""
|
| 6 |
"Project-Id-Version: Metronet Reorder Posts v1.0.0\n"
|
| 7 |
"Report-Msgid-Bugs-To: Ronald Huereca <ronalfy@gmail.com>\n"
|
| 8 |
+
"POT-Creation-Date: 2015-01-19 19:30-0600\n"
|
| 9 |
"PO-Revision-Date: \n"
|
| 10 |
"Last-Translator: Ronald Huereca <ron@ronalfy.com>\n"
|
| 11 |
"Language-Team: Ronald Huereca <ronalfy@gmail.com>\n"
|
| 96 |
msgid "Select the menu order for the post types."
|
| 97 |
msgstr ""
|
| 98 |
|
| 99 |
+
#: class-reorder.php:161 class-reorder.php:165 index.php:97
|
| 100 |
msgid "Reorder"
|
| 101 |
msgstr ""
|
| 102 |
|
| 103 |
+
#: class-reorder.php:319 class-reorder.php:462
|
| 104 |
msgid "Expand"
|
| 105 |
msgstr ""
|
| 106 |
|
| 107 |
+
#: class-reorder.php:320
|
| 108 |
msgid "Collapse"
|
| 109 |
msgstr ""
|
| 110 |
|
| 111 |
+
#: class-reorder.php:376
|
| 112 |
+
#, php-format
|
| 113 |
+
msgid ""
|
| 114 |
+
"There are over %s posts found. We do not recommend you sort these posts for "
|
| 115 |
+
"performance reasons."
|
| 116 |
+
msgstr ""
|
| 117 |
+
|
| 118 |
#: class-reorder.php:383
|
| 119 |
+
#, php-format
|
| 120 |
+
msgid ""
|
| 121 |
+
"Note: reordering here does not change the order on your website without "
|
| 122 |
+
"some code modifications. Please see our <a target=\"_blank\" href=\"%s"
|
| 123 |
+
"\">Wiki</a>."
|
| 124 |
+
msgstr ""
|
| 125 |
+
|
| 126 |
+
#: class-reorder.php:431
|
| 127 |
msgid "There is nothing to sort at this time"
|
| 128 |
msgstr ""
|
| 129 |
|
| 130 |
+
#: index.php:87
|
| 131 |
msgid "Posts"
|
| 132 |
msgstr ""
|
| 133 |
|
| 134 |
+
#: index.php:88
|
| 135 |
#, php-format
|
| 136 |
msgid "Reorder %s"
|
| 137 |
msgstr ""
|
readme.txt
CHANGED
|
@@ -5,17 +5,17 @@ Plugin URL: https://wordpress.org/plugins/metronet-reorder-posts/
|
|
| 5 |
Requires at Least: 3.7
|
| 6 |
Tested up to: 4.1
|
| 7 |
Tags: reorder, re-order, posts, wordpress, post-type, ajax, admin, hierarchical, menu_order, ordering
|
| 8 |
-
Stable tag: 2.0
|
| 9 |
-
License:
|
| 10 |
-
License URI: http://www.gnu.org/licenses/gpl-
|
| 11 |
|
| 12 |
-
A simple and easy way to reorder your custom post
|
| 13 |
|
| 14 |
== Description ==
|
| 15 |
|
| 16 |
-
A simple and easy way to reorder your custom post-type posts in WordPress. Adds drag and drop functionality for post ordering in the WordPress admin panel. Works with custom post-types and regular posts.
|
| 17 |
|
| 18 |
-
|
| 19 |
|
| 20 |
<h3>Features</h3>
|
| 21 |
<ul>
|
|
@@ -27,7 +27,7 @@ A settings panel is available for determining which post types to enable orderin
|
|
| 27 |
<li>Advanced settings panel for overriding the menu order of custom post type queries</li>
|
| 28 |
</ul>
|
| 29 |
|
| 30 |
-
|
| 31 |
|
| 32 |
<h3>Spread the Word</h3>
|
| 33 |
If you like this plugin, please help spread the word. Rate the plugin. Write about the plugin. Something :)
|
|
@@ -59,7 +59,17 @@ Either install the plugin via the WordPress admin panel, or ...
|
|
| 59 |
|
| 60 |
For each post type, you will see a new "Reorder" submenu. Simply navigate to "Reorder" to change the order of your post types. Changes are saved immediately, there is no need to click a save or update button.
|
| 61 |
|
| 62 |
-
By default, ordering is enabled for all post types. A settings panel is available for determining which post types to enable ordering for.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
== Frequently Asked Questions ==
|
| 65 |
|
|
@@ -106,6 +116,14 @@ This plugin requires WordPress 3.7 or above. We urge you, however, to always us
|
|
| 106 |
|
| 107 |
== Changelog ==
|
| 108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
= 2.0.2 =
|
| 110 |
* Released 2014-12-26
|
| 111 |
* Bug fix: Saving admin panel settings resulted in a variety of PHP offset error messages.
|
|
@@ -161,6 +179,9 @@ This plugin requires WordPress 3.7 or above. We urge you, however, to always us
|
|
| 161 |
|
| 162 |
== Upgrade Notice ==
|
| 163 |
|
|
|
|
|
|
|
|
|
|
| 164 |
= 2.0.2 =
|
| 165 |
Bug fixes with PHP error notices. Highly recommend you upgrade.
|
| 166 |
|
| 5 |
Requires at Least: 3.7
|
| 6 |
Tested up to: 4.1
|
| 7 |
Tags: reorder, re-order, posts, wordpress, post-type, ajax, admin, hierarchical, menu_order, ordering
|
| 8 |
+
Stable tag: 2.1.0
|
| 9 |
+
License: GPLv3 or later
|
| 10 |
+
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
| 11 |
|
| 12 |
+
A simple and easy way to reorder your custom post types in WordPress.
|
| 13 |
|
| 14 |
== Description ==
|
| 15 |
|
| 16 |
+
A simple and easy way to reorder your custom post-type posts in WordPress. Adds drag and drop functionality for post ordering in the WordPress admin panel. Works with custom post-types and regular posts.
|
| 17 |
|
| 18 |
+
We consider Reorder Posts a <strong>developer tool</strong>. If you do not know what `menu_order` or custom queries are, then this plugin is likely not for you.
|
| 19 |
|
| 20 |
<h3>Features</h3>
|
| 21 |
<ul>
|
| 27 |
<li>Advanced settings panel for overriding the menu order of custom post type queries</li>
|
| 28 |
</ul>
|
| 29 |
|
| 30 |
+
|
| 31 |
|
| 32 |
<h3>Spread the Word</h3>
|
| 33 |
If you like this plugin, please help spread the word. Rate the plugin. Write about the plugin. Something :)
|
| 59 |
|
| 60 |
For each post type, you will see a new "Reorder" submenu. Simply navigate to "Reorder" to change the order of your post types. Changes are saved immediately, there is no need to click a save or update button.
|
| 61 |
|
| 62 |
+
By default, ordering is enabled for all post types. A settings panel is available for determining which post types to enable ordering for.
|
| 63 |
+
|
| 64 |
+
Advanced customization is allowed via hooks. See the <a href="https://github.com/ronalfy/reorder-posts#plugin-filters">Plugin Filters on GitHub</a>.
|
| 65 |
+
|
| 66 |
+
This tool allows you to easily reorder post types in the back-end of WordPress. How the posts are sorted in the front-end is entirely up to you, as it should be.
|
| 67 |
+
|
| 68 |
+
We do have advanced settings under `Settings->Reorder Posts`, but these should only be used for testing purposes.
|
| 69 |
+
|
| 70 |
+
You'll want to make use of <a href="http://codex.wordpress.org/Class_Reference/WP_Query">WP_Query</a>, <a href="http://codex.wordpress.org/Template_Tags/get_posts">get_posts</a>, or <a href="http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts">pre_get_posts</a> to modify query behavior on the front-end of your site.
|
| 71 |
+
|
| 72 |
+
Examples of each are on the respective pages above. You are welcome to leave a support request if you need help with a query and we'll do our best to get back with you.
|
| 73 |
|
| 74 |
== Frequently Asked Questions ==
|
| 75 |
|
| 116 |
|
| 117 |
== Changelog ==
|
| 118 |
|
| 119 |
+
= 2.1.0 =
|
| 120 |
+
* Released 2015-01-19
|
| 121 |
+
* Added add-on support
|
| 122 |
+
* Make sure reordering can only be done by those with edit_pages privileges
|
| 123 |
+
* Added pagination for performance reasons
|
| 124 |
+
* Optimized queries for performance reasons
|
| 125 |
+
* Added warning message for those with a lot of posts
|
| 126 |
+
|
| 127 |
= 2.0.2 =
|
| 128 |
* Released 2014-12-26
|
| 129 |
* Bug fix: Saving admin panel settings resulted in a variety of PHP offset error messages.
|
| 179 |
|
| 180 |
== Upgrade Notice ==
|
| 181 |
|
| 182 |
+
= 2.1.0 =
|
| 183 |
+
Some capability fixes, pagination for post types with a lot of posts, improved query performance, and add-on capability.
|
| 184 |
+
|
| 185 |
= 2.0.2 =
|
| 186 |
Bug fixes with PHP error notices. Highly recommend you upgrade.
|
| 187 |
|
scripts/sort.js
CHANGED
|
@@ -5,6 +5,9 @@ jQuery(document).ready(function($) {
|
|
| 5 |
if ( reorder_posts.hierarchical == 'false' ) {
|
| 6 |
max_levels = 1;
|
| 7 |
}
|
|
|
|
|
|
|
|
|
|
| 8 |
postList.nestedSortable( {
|
| 9 |
forcePlaceholderSize: true,
|
| 10 |
handle: 'div',
|
|
@@ -19,13 +22,102 @@ jQuery(document).ready(function($) {
|
|
| 19 |
toleranceElement: '> div',
|
| 20 |
listType: 'ul',
|
| 21 |
update: function( event, ui ) {
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
$('#loading-animation').show();
|
| 25 |
-
$.post( ajaxurl, { action: 'post_sort', nonce: reorder_posts.sortnonce, data: order }, function( response ) {
|
| 26 |
-
$('#loading-animation').hide()
|
| 27 |
-
}, 'json' );
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
}
|
| 30 |
});
|
| 31 |
$( "#post-list a" ).toggle( function() {
|
| 5 |
if ( reorder_posts.hierarchical == 'false' ) {
|
| 6 |
max_levels = 1;
|
| 7 |
}
|
| 8 |
+
var callback = false;
|
| 9 |
+
var sort_start = {};
|
| 10 |
+
var sort_end = {};
|
| 11 |
postList.nestedSortable( {
|
| 12 |
forcePlaceholderSize: true,
|
| 13 |
handle: 'div',
|
| 22 |
toleranceElement: '> div',
|
| 23 |
listType: 'ul',
|
| 24 |
update: function( event, ui ) {
|
| 25 |
+
|
| 26 |
+
var reorder_ajax_callback = function( response ) {
|
| 27 |
+
response = jQuery.parseJSON( response );
|
| 28 |
+
if ( true == response.more_posts ) {
|
| 29 |
+
$.post( ajaxurl, response, reorder_ajax_callback );
|
| 30 |
+
} else {
|
| 31 |
+
if ( false != callback ) {
|
| 32 |
+
var callback_ajax_args = callback;
|
| 33 |
+
callback = false;
|
| 34 |
+
$.post( ajaxurl, callback_ajax_args, reorder_ajax_callback );
|
| 35 |
+
} else {
|
| 36 |
+
$('#loading-animation').hide();
|
| 37 |
+
}
|
| 38 |
+
}
|
| 39 |
+
};
|
| 40 |
+
|
| 41 |
$('#loading-animation').show();
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
+
//Get the end items where the post was placed
|
| 44 |
+
sort_end.item = ui.item;
|
| 45 |
+
sort_end.prev = ui.item.prev( ':not(".placeholder")' );
|
| 46 |
+
sort_end.next = ui.item.next( ':not(".placeholder")' );
|
| 47 |
+
|
| 48 |
+
//Get starting post parent
|
| 49 |
+
var start_post_parent = parseInt( sort_start.item.attr( 'data-parent' ) );
|
| 50 |
+
|
| 51 |
+
//Get ending post parent
|
| 52 |
+
var end_post_parent = 0;
|
| 53 |
+
if( sort_end.prev.length > 0 || sort_end.next.length > 0 ) {
|
| 54 |
+
if ( sort_end.prev.length > 0 ) {
|
| 55 |
+
end_post_parent = parseInt( sort_end.prev.attr( 'data-parent' ) );
|
| 56 |
+
} else if ( sort_end.next.length > 0 ) {
|
| 57 |
+
end_post_parent = parseInt( sort_end.next.attr( 'data-parent' ) );
|
| 58 |
+
}
|
| 59 |
+
} else if ( sort_end.prev.length == 0 && sort_end.next.length == 0 ) {
|
| 60 |
+
//We're the only child :(
|
| 61 |
+
end_post_parent = ui.item.parents( 'li:first' ).attr( 'data-id' );
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
//Update post parent in DOM
|
| 65 |
+
sort_end.item.attr( 'data-parent', end_post_parent );
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
//Find the menu order and update dom accordingly
|
| 70 |
+
var list_offset = 0;
|
| 71 |
+
if( end_post_parent == 0 ) {
|
| 72 |
+
var offset = $( '#reorder-offset' ).val();
|
| 73 |
+
|
| 74 |
+
//Get index in list order and update dom
|
| 75 |
+
list_offset = parseInt(offset) + parseInt(sort_end.item.index());
|
| 76 |
+
} else {
|
| 77 |
+
list_offset = parseInt(sort_end.item.index());
|
| 78 |
+
}
|
| 79 |
+
sort_end.item.attr( 'data-menu-order', list_offset );
|
| 80 |
+
|
| 81 |
+
//Get attributes
|
| 82 |
+
var attributes = {};
|
| 83 |
+
$.each( sort_end.item[0].attributes, function() {
|
| 84 |
+
attributes [ this.name ] = this.value;
|
| 85 |
+
} );
|
| 86 |
+
|
| 87 |
+
//Perform Ajax Call
|
| 88 |
+
var parent_ajax_args = {
|
| 89 |
+
action: reorder_posts.action,
|
| 90 |
+
post_parent: end_post_parent,
|
| 91 |
+
start: 0,
|
| 92 |
+
nonce: reorder_posts.sortnonce,
|
| 93 |
+
post_id: sort_end.item.attr( 'data-id' ),
|
| 94 |
+
menu_order: sort_end.item.attr( 'data-menu-order' ),
|
| 95 |
+
excluded: {},
|
| 96 |
+
post_type: sort_start.item.attr( 'data-post-type' ),
|
| 97 |
+
attributes: attributes
|
| 98 |
+
};
|
| 99 |
+
//Determine if we need to sort child nodes - if post_parent ids don't match and there are any remaining child nodes, we need to reorder those
|
| 100 |
+
if ( start_post_parent != end_post_parent ) {
|
| 101 |
+
//Determine if there are any remaining child nodes
|
| 102 |
+
callback = {
|
| 103 |
+
action: reorder_posts.action,
|
| 104 |
+
post_parent: start_post_parent,
|
| 105 |
+
start: 0,
|
| 106 |
+
nonce: reorder_posts.sortnonce,
|
| 107 |
+
post_id: 0,
|
| 108 |
+
menu_order: 0,
|
| 109 |
+
excluded: {},
|
| 110 |
+
post_type: sort_start.item.attr( 'data-post-type' ),
|
| 111 |
+
attributes: attributes
|
| 112 |
+
};
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
$.post( ajaxurl, parent_ajax_args, reorder_ajax_callback );
|
| 116 |
+
},
|
| 117 |
+
start: function( event, ui ) {
|
| 118 |
+
sort_start.item = ui.item;
|
| 119 |
+
sort_start.prev = ui.item.prev( ':not(".placeholder")' );
|
| 120 |
+
sort_start.next = ui.item.next( ':not(".placeholder")' );
|
| 121 |
}
|
| 122 |
});
|
| 123 |
$( "#post-list a" ).toggle( function() {
|
