Reorder Posts - Version 2.4.1

Version Description

  • Released 2019-02-16
  • Added query to reorder posts for an example
  • Option to turn off query output
Download this release

Release Info

Developer ronalfy
Plugin Icon 128x128 Reorder Posts
Version 2.4.1
Comparing to
See all releases

Code changes from version 2.4.0 to 2.4.1

Files changed (4) hide show
  1. class-reorder-admin.php +114 -85
  2. class-reorder.php +92 -67
  3. index.php +11 -12
  4. readme.txt +22 -11
class-reorder-admin.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * Reorder posts
4
- *
5
  * @package WordPress
6
  * @subpackage Metronet Reorder Posts plugin
7
  */
@@ -10,23 +10,23 @@
10
  /**
11
  * Reorder posts
12
  * Adds drag and drop editor for reordering WordPress posts
13
- *
14
  * This class is self-instantiated and should not be used directly
15
- *
16
  * @license http://www.gnu.org/licenses/gpl.html GPL
17
  * @author Ronald Huereca
18
  * @since 2.0.0
19
  */
20
  class MN_Reorder_Admin {
21
  /**
22
- * @var $instance
23
  * @desc Instance of the admin class
24
  * @access private
25
  */
26
  private static $instance = null;
27
-
28
  /**
29
- * @var $options
30
  * @desc WordPress options for access within this class
31
  * @access private
32
  */
@@ -34,10 +34,10 @@ class MN_Reorder_Admin {
34
 
35
  /**
36
  * Class constructor
37
- *
38
  * Sets definitions
39
  * Adds methods to appropriate hooks
40
- *
41
  * @author Ronald Huereca
42
  * @since Reorder 1.1
43
  * @access private
@@ -45,20 +45,20 @@ class MN_Reorder_Admin {
45
  private function __construct( ) {
46
  //Filter to hide the admin panel options
47
  if ( !apply_filters( 'metronet_reorder_post_allow_admin', true ) ) return; //Use this filter if you want to disable the admin panel settings for this plugin, including disabling the menu order overrides
48
-
49
  //Initialize actions
50
  /* Dev note: If you know what you're doing code-wise, add the menu_order in get_posts, pre_get_posts, or WP_Query, disable these filters, and/or disable the admin settings (see above). */
51
  add_filter( 'posts_orderby', array( $this, 'modify_menu_order_sql' ), 30, 2 );
52
  add_action( 'pre_get_posts', array( $this, 'modify_menu_order_pre' ), 30, 1 );
53
-
54
  //Admin Settings
55
  add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
56
  add_action( 'admin_init', array( $this, 'init_admin_settings' ) );
57
-
58
  //Plugin settings
59
  add_filter( 'plugin_action_links_' . REORDER_BASENAME , array( $this, 'add_settings_link' ) );
60
  }
61
-
62
  //Singleton
63
  public static function get_instance() {
64
  if ( null == self::$instance ) {
@@ -66,7 +66,7 @@ class MN_Reorder_Admin {
66
  }
67
  return self::$instance;
68
  } //end get_instance
69
-
70
  /**
71
  * Initialize options page
72
  *
@@ -77,11 +77,35 @@ class MN_Reorder_Admin {
77
  *
78
  * @see init
79
  *
80
- */
81
  public function add_admin_menu() {
82
  add_options_page( _x( 'Reorder Posts', 'Plugin Name - Settings Page Title', 'metronet-reorder-posts' ), _x( 'Reorder Posts', 'Plugin Name - Menu Item', 'metronet-reorder-posts' ), 'manage_options', 'metronet-reorder-posts', array( $this, 'options_page' ) );
83
  }
84
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  /**
86
  * Add post types to be overridden using menu_order
87
  *
@@ -92,9 +116,9 @@ class MN_Reorder_Admin {
92
  *
93
  * @see init_admin_settings
94
  *
95
- * @param array $args {
96
  @type string $desc Description for the setting.
97
-
98
  }
99
  */
100
  public function add_settings_field_menu_order( $args = array() ) {
@@ -102,30 +126,30 @@ class MN_Reorder_Admin {
102
  $settings = $this->get_plugin_options();
103
  $settings_menu_order = isset( $settings[ 'menu_order' ] ) ? $settings[ 'menu_order' ] : array();
104
  $post_types = get_post_types( array(), 'object' );
105
-
106
  //Foreach loop to show de awesome post types
107
  foreach( $post_types as $post_type_name => $post_type ) {
108
-
109
  //Determine whether to show this post type (show_ui = true)
110
  $show_ui = (bool)isset( $post_type->show_ui ) ? $post_type->show_ui : false;
111
  if ( !$show_ui || 'attachment' === $post_type_name ) continue;
112
-
113
  //Get post type labels for checkbox
114
  $post_type_value = isset( $settings_post_types[ $post_type_name ] ) ? $settings_post_types[ $post_type_name ] : 'on';
115
  $post_type_label = isset( $post_type->label ) ? $post_type->label : $post_type_name;
116
  printf( '<div id="metronet-reorder-posts-%s">', esc_attr( $post_type_name ) );
117
  printf( '<h3>%s</h3>', esc_html( $post_type_label ) );
118
-
119
  //Get menu order arguments
120
  $menu_orderby = isset( $settings_menu_order[ $post_type_name ][ 'orderby' ] ) ? $settings_menu_order[ $post_type_name ][ 'orderby' ] : 'none';
121
-
122
  //Output Menu Order Arguments
123
  printf( '<p>%s</p>', esc_html__( 'Sort by:', 'metronet-reorder-posts' ) );
124
  printf( '<select name="metronet-reorder-posts[menu_order][%1$s][orderby]">', esc_attr( $post_type_name ) );
125
  printf( '<option value="none" %s>%s</option>', selected( 'none', $menu_orderby, false ), esc_html__( 'None', 'metronet-reorder-posts' ) );
126
  printf( '<option value="menu_order" %s>%s</option>', selected( 'menu_order', $menu_orderby, false ), esc_html__( 'Menu Order', 'metronet-reorder-posts' ) );
127
  echo '</select>';
128
-
129
  //Get order arguments
130
  $menu_order = isset( $settings_menu_order[ $post_type_name ][ 'order' ] ) ? $settings_menu_order[ $post_type_name ][ 'order' ] : 'DESC'; //DESC is WP_Query default
131
  //Output Menu Order Arguments
@@ -134,12 +158,12 @@ class MN_Reorder_Admin {
134
  printf( '<option value="ASC" %s>%s</option>', selected( 'ASC', $menu_order, false ), esc_html__( 'ASC', 'metronet-reorder-posts' ) );
135
  printf( '<option value="DESC" %s>%s</option>', selected( 'DESC', $menu_order, false ), esc_html__( 'DESC', 'metronet-reorder-posts' ) );
136
  echo '</select>';
137
-
138
  //Output closing div
139
  echo '</div>';
140
  }
141
  }
142
-
143
  /**
144
  * Add post types to be reordered using the plugin
145
  *
@@ -150,9 +174,9 @@ class MN_Reorder_Admin {
150
  *
151
  * @see init_admin_settings
152
  *
153
- * @param array $args {
154
  @type string $desc Description for the setting.
155
-
156
  }
157
  */
158
  public function add_settings_field_post_types( $args = array() ) {
@@ -160,29 +184,29 @@ class MN_Reorder_Admin {
160
  $settings = $this->get_plugin_options();
161
  $settings_post_types = isset( $settings[ 'post_types' ] ) ? $settings[ 'post_types' ] : array();
162
  $post_types = get_post_types( array(), 'object' );
163
-
164
  //Foreach loop to show de awesome post types
165
  foreach( $post_types as $post_type_name => $post_type ) {
166
-
167
  //Determine whether to show this post type (show_ui = true)
168
  $show_ui = (bool)isset( $post_type->show_ui ) ? $post_type->show_ui : false;
169
  if ( !$show_ui || 'attachment' === $post_type_name ) continue;
170
-
171
  //Get post type labels for checkbox
172
  $post_type_value = isset( $settings_post_types[ $post_type_name ] ) ? $settings_post_types[ $post_type_name ] : 'on';
173
  $post_type_label = isset( $post_type->label ) ? $post_type->label : $post_type_name;
174
  $checked = '';
175
  if ( $post_type_value === 'on' ) {
176
  $checked = checked( true, true, false );
177
- }
178
-
179
  //Output post type option
180
  printf( '<div><input type="hidden" name="metronet-reorder-posts[post_types][%1$s]" value="off" /> <input type="checkbox" name="metronet-reorder-posts[post_types][%1$s]" id="post_type_%1$s" value="on" %2$s /><label for="post_type_%1$s">&nbsp;%3$s</label></div>', esc_attr( $post_type_name ), $checked, esc_html( $post_type_label ) );
181
  }
182
  }
183
-
184
  public function add_settings_heading_menu_order() {
185
- printf( '<p>%s</p>', esc_html__( 'These are advanced options and you should only use these if you know what you are doing. These can overwrite the menu orders of custom queries (using get_posts or WP_Query), custom post type archives, and even the order your blog posts display.', 'metronet-reorder-posts' ) );
186
  }
187
  /**
188
  * Add a settings link to the plugin's options.
@@ -197,12 +221,12 @@ class MN_Reorder_Admin {
197
  * @param array $links Array of plugin options
198
  * @return array $links Array of plugin options
199
  */
200
- public function add_settings_link( $links ) {
201
- $settings_link = sprintf( '<a href="%s">%s</a>', esc_url( admin_url( 'options-general.php?page=metronet-reorder-posts' ) ), _x( 'Settings', 'Plugin settings link on the plugins page', 'metronet-reorder-posts' ) );
202
- array_unshift($links, $settings_link);
203
- return $links;
204
  }
205
-
206
  /**
207
  * Initialize and return plugin options.
208
  *
@@ -217,15 +241,16 @@ class MN_Reorder_Admin {
217
  */
218
  public function get_plugin_options() {
219
  if ( false === $this->options ) {
220
- $settings = get_option( 'metronet-reorder-posts' );
221
  } else {
222
  $settings = $this->options;
223
  }
224
-
225
  if ( false === $settings || !is_array( $settings ) ) {
226
  $defaults = array(
227
  'post_types' => array(),
228
  'menu_order' => array(),
 
229
  );
230
  update_option( 'metronet-reorder-posts', $defaults );
231
  return $defaults;
@@ -233,9 +258,9 @@ class MN_Reorder_Admin {
233
  $this->options = $settings;
234
  return $settings;
235
  }
236
-
237
  /**
238
- * Initialize options
239
  *
240
  * Initialize page settings, fields, and sections and their callbacks
241
  *
@@ -247,102 +272,106 @@ class MN_Reorder_Admin {
247
  */
248
  public function init_admin_settings() {
249
  register_setting( 'metronet-reorder-posts', 'metronet-reorder-posts', array( $this, 'sanitization' ) );
250
-
251
  add_settings_section( 'mn-reorder-post-types', _x( 'Enable Post Types', 'plugin settings heading' , 'metronet-reorder-posts' ), '__return_empty_string', 'metronet-reorder-posts' );
252
-
253
  add_settings_section( 'mn-reorder-menu-order', _x( 'Advanced', 'plugin settings heading' , 'metronet-reorder-posts' ), array( $this, 'add_settings_heading_menu_order' ), 'metronet-reorder-posts' );
254
-
 
 
255
  add_settings_field( 'mn-post-types', __( 'Post Types', 'metronet-reorder-posts' ), array( $this, 'add_settings_field_post_types' ), 'metronet-reorder-posts', 'mn-reorder-post-types', array( 'desc' => __( 'Select the post types you would like this plugin enabled for.', 'metronet-reorder-posts' ) ) );
256
-
257
  add_settings_field( 'mn-menu-order', __( 'Select the menu order arguments.', 'metronet-reorder-posts' ), array( $this, 'add_settings_field_menu_order' ), 'metronet-reorder-posts', 'mn-reorder-menu-order', array( 'desc' => __( 'Select the menu order for the post types.', 'metronet-reorder-posts' ) ) );
258
-
 
 
259
  }
260
-
261
  //Used for get_posts calls
262
  public function modify_menu_order_pre( $query ) {
263
  if( $query->is_main_query() || is_admin() || is_feed() ) return;
264
-
265
  if ( !apply_filters( 'metronet_reorder_allow_menu_order', true ) ) return; //Return false to disable this completely
266
-
267
  //Get main plugin options
268
  $plugin_options = $this->get_plugin_options();
269
  if ( !isset( $plugin_options[ 'menu_order' ] ) || !is_array( $plugin_options[ 'menu_order' ] ) || empty( $plugin_options[ 'menu_order' ] ) ) return;
270
  $menu_order = $plugin_options[ 'menu_order' ];
271
-
272
  //Get main post type
273
  $main_query = $query->query;
274
  $post_type = false;
275
  if( isset( $main_query[ 'post_type' ] ) ) {
276
  //Typically set on post type archives or custom WP_Query or get_posts instances
277
- $post_type = $main_query[ 'post_type' ];
278
  }
279
  if ( !$post_type || is_array( $post_type ) ) return;
280
-
281
  //See if suppress filters is on (using get_posts) (if it's not, use modify_menu_order_sql for that)
282
  if ( !isset( $main_query[ 'suppress_filters' ] ) ) return;
283
-
284
  if ( !apply_filters( 'metronet_reorder_allow_menu_order_' . $post_type, true ) ) return; //Return false to disable this for each individual post type as opposed to using a global filter above
285
-
286
  //See if we're modifying the menu_order
287
  $menu_order_orderby = isset( $menu_order[ $post_type ][ 'orderby' ] ) ? $menu_order[ $post_type ][ 'orderby' ] : 'none';
288
  $menu_order_order = isset( $menu_order[ $post_type ][ 'order' ] ) ? $menu_order[ $post_type ][ 'order' ] : 'DESC';
289
-
290
  //Return if post type is not be ordered
291
  if ( $menu_order_orderby === 'none' ) return;
292
-
293
  //Return of $menu_order_order is invalid
294
  if ( $menu_order_order !== 'ASC' && $menu_order_order !== 'DESC' ) return;
295
-
296
  //Overwrite the orderby clause
297
  $query->set( 'orderby', 'menu_order' );
298
  $query->set( 'order', $menu_order_order );
299
  }
300
-
301
  //Used on homepage archives, post type archives, or custom WP_Query calls
302
  public function modify_menu_order_sql( $sql_orderby, $query ) {
303
  if ( is_admin() || is_404() || is_feed() ) return $sql_orderby;
304
-
305
  if ( !apply_filters( 'metronet_reorder_allow_menu_order', true ) ) return $sql_orderby; //Return false to disable this completely
306
-
307
  //Get main plugin options
308
  $plugin_options = $this->get_plugin_options();
309
  if ( !isset( $plugin_options[ 'menu_order' ] ) || !is_array( $plugin_options[ 'menu_order' ] ) || empty( $plugin_options[ 'menu_order' ] ) ) return $sql_orderby;
310
-
311
  $menu_order = $plugin_options[ 'menu_order' ];
312
-
313
  $main_query = $query->query;
314
-
315
  //Get main post type - Try to get post_type first, if not, see if we're on the main page showing blog posts
316
  $post_type = false;
317
  if( isset( $main_query[ 'post_type' ] ) ) {
318
  //Typically set on post type archives or custom WP_Query or get_posts instances
319
- $post_type = $main_query[ 'post_type' ];
320
  } elseif ( is_home() ) {
321
  $post_type = 'post';
322
- }
323
  if ( !$post_type || is_array( $post_type ) ) return $sql_orderby;
324
-
325
  if ( !apply_filters( 'metronet_reorder_allow_menu_order_' . $post_type, true ) ) return $sql_orderby; //Return false to disable this for each individual post type as opposed to using a global filter above
326
-
327
  //See if we're modifying the menu_order
328
  $menu_order_orderby = isset( $menu_order[ $post_type ][ 'orderby' ] ) ? $menu_order[ $post_type ][ 'orderby' ] : 'none';
329
  $menu_order_order = isset( $menu_order[ $post_type ][ 'order' ] ) ? $menu_order[ $post_type ][ 'order' ] : 'DESC';
330
-
331
  //Return if post type is not be ordered
332
  if ( $menu_order_orderby === 'none' ) return $sql_orderby;
333
-
334
  //Return of $menu_order_order is invalid
335
  if ( $menu_order_order !== 'ASC' && $menu_order_order !== 'DESC' ) return $sql_orderby;
336
-
337
  //Overwrite the orderby clause
338
  global $wpdb;
339
  $sql_orderby = sprintf( '%s.menu_order %s', $wpdb->posts, $menu_order_order ); //for devs: no sanitization required as tablename is from $wpdb and $menu_order_order is set to match only ASC or DESC.
340
 
341
- //Return
342
- return $sql_orderby;
343
-
344
  }
345
-
346
  /**
347
  * Output options page HTML.
348
  *
@@ -366,7 +395,7 @@ class MN_Reorder_Admin {
366
  </div>
367
  <?php
368
  }
369
-
370
  /**
371
  * Sanitize options before they are saved.
372
  *
@@ -379,7 +408,7 @@ class MN_Reorder_Admin {
379
  *
380
  * @param array $input {
381
  @type array $post_types
382
- @type array $menu_order
383
  }
384
  * @return array Sanitized array of options
385
  */
@@ -389,12 +418,12 @@ class MN_Reorder_Admin {
389
  if ( !empty( $post_types ) ) {
390
  foreach( $post_types as $post_type_name => &$value ) {
391
  if ( $value !== 'on' ) {
392
- $value == 'off';
393
  }
394
- }
395
  $input[ 'post_types' ] = $post_types;
396
  }
397
-
398
  //Get menu order options
399
  $menu_order = $input[ 'menu_order' ];
400
  if ( !empty( $menu_order ) ) {
@@ -403,18 +432,18 @@ class MN_Reorder_Admin {
403
  if ( $orderby !== 'menu_order' ) {
404
  $menu_order[ $post_type_name ][ 'orderby' ] == 'none';
405
  }
406
-
407
  $order = isset( $menu_order[ $post_type_name ][ 'order' ] ) ? $menu_order[ $post_type_name ] : 'DESC';
408
  if ( $orderby !== 'ASC' ) {
409
- $menu_order[ $post_type_name ][ 'order' ] == 'DESC';
410
  }
411
  }
412
  $input[ 'menu_order' ] = $menu_order;
413
-
414
  }
415
  return $input;
416
  }
417
-
418
  } //end class Reorder_Admin
419
 
420
  add_action( 'init', 'mn_reorder_admin_instantiate', 15 );
1
  <?php
2
  /**
3
  * Reorder posts
4
+ *
5
  * @package WordPress
6
  * @subpackage Metronet Reorder Posts plugin
7
  */
10
  /**
11
  * Reorder posts
12
  * Adds drag and drop editor for reordering WordPress posts
13
+ *
14
  * This class is self-instantiated and should not be used directly
15
+ *
16
  * @license http://www.gnu.org/licenses/gpl.html GPL
17
  * @author Ronald Huereca
18
  * @since 2.0.0
19
  */
20
  class MN_Reorder_Admin {
21
  /**
22
+ * @var $instance
23
  * @desc Instance of the admin class
24
  * @access private
25
  */
26
  private static $instance = null;
27
+
28
  /**
29
+ * @var $options
30
  * @desc WordPress options for access within this class
31
  * @access private
32
  */
34
 
35
  /**
36
  * Class constructor
37
+ *
38
  * Sets definitions
39
  * Adds methods to appropriate hooks
40
+ *
41
  * @author Ronald Huereca
42
  * @since Reorder 1.1
43
  * @access private
45
  private function __construct( ) {
46
  //Filter to hide the admin panel options
47
  if ( !apply_filters( 'metronet_reorder_post_allow_admin', true ) ) return; //Use this filter if you want to disable the admin panel settings for this plugin, including disabling the menu order overrides
48
+
49
  //Initialize actions
50
  /* Dev note: If you know what you're doing code-wise, add the menu_order in get_posts, pre_get_posts, or WP_Query, disable these filters, and/or disable the admin settings (see above). */
51
  add_filter( 'posts_orderby', array( $this, 'modify_menu_order_sql' ), 30, 2 );
52
  add_action( 'pre_get_posts', array( $this, 'modify_menu_order_pre' ), 30, 1 );
53
+
54
  //Admin Settings
55
  add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
56
  add_action( 'admin_init', array( $this, 'init_admin_settings' ) );
57
+
58
  //Plugin settings
59
  add_filter( 'plugin_action_links_' . REORDER_BASENAME , array( $this, 'add_settings_link' ) );
60
  }
61
+
62
  //Singleton
63
  public static function get_instance() {
64
  if ( null == self::$instance ) {
66
  }
67
  return self::$instance;
68
  } //end get_instance
69
+
70
  /**
71
  * Initialize options page
72
  *
77
  *
78
  * @see init
79
  *
80
+ */
81
  public function add_admin_menu() {
82
  add_options_page( _x( 'Reorder Posts', 'Plugin Name - Settings Page Title', 'metronet-reorder-posts' ), _x( 'Reorder Posts', 'Plugin Name - Menu Item', 'metronet-reorder-posts' ), 'manage_options', 'metronet-reorder-posts', array( $this, 'options_page' ) );
83
  }
84
+
85
+ /**
86
+ * Add query output
87
+ *
88
+ * Add query output
89
+ *
90
+ * @since 1.0.0
91
+ * @access public
92
+ *
93
+ * @see init_admin_settings
94
+ *
95
+ * @param array $args {
96
+ @type string $desc Description for the setting.
97
+
98
+ }
99
+ */
100
+ public function add_settings_reorder_query( $args = array() ) {
101
+ //Get options/defaults
102
+ $settings = $this->get_plugin_options();
103
+ $settings_query = isset( $settings[ 'show_query' ] ) ? $settings[ 'show_query' ] : 'on';
104
+
105
+ printf( '<p><input type="radio" name="metronet-reorder-posts[show_query]" value="on" id="reorder_show_query_yes" %s />&nbsp;<label for="reorder_show_query_yes">%s</label></p>', checked( 'on', $settings_query, false ), esc_html__( 'Yes', 'metronet-reorder-posts' ) );
106
+ printf( '<p><input type="radio" name="metronet-reorder-posts[show_query]" value="off" id="reorder_show_query_no" %s />&nbsp;<label for="reorder_show_query_no">%s</label></p>', checked( 'off', $settings_query, false ), esc_html__( 'No', 'metronet-reorder-posts' ) );
107
+ }
108
+
109
  /**
110
  * Add post types to be overridden using menu_order
111
  *
116
  *
117
  * @see init_admin_settings
118
  *
119
+ * @param array $args {
120
  @type string $desc Description for the setting.
121
+
122
  }
123
  */
124
  public function add_settings_field_menu_order( $args = array() ) {
126
  $settings = $this->get_plugin_options();
127
  $settings_menu_order = isset( $settings[ 'menu_order' ] ) ? $settings[ 'menu_order' ] : array();
128
  $post_types = get_post_types( array(), 'object' );
129
+
130
  //Foreach loop to show de awesome post types
131
  foreach( $post_types as $post_type_name => $post_type ) {
132
+
133
  //Determine whether to show this post type (show_ui = true)
134
  $show_ui = (bool)isset( $post_type->show_ui ) ? $post_type->show_ui : false;
135
  if ( !$show_ui || 'attachment' === $post_type_name ) continue;
136
+
137
  //Get post type labels for checkbox
138
  $post_type_value = isset( $settings_post_types[ $post_type_name ] ) ? $settings_post_types[ $post_type_name ] : 'on';
139
  $post_type_label = isset( $post_type->label ) ? $post_type->label : $post_type_name;
140
  printf( '<div id="metronet-reorder-posts-%s">', esc_attr( $post_type_name ) );
141
  printf( '<h3>%s</h3>', esc_html( $post_type_label ) );
142
+
143
  //Get menu order arguments
144
  $menu_orderby = isset( $settings_menu_order[ $post_type_name ][ 'orderby' ] ) ? $settings_menu_order[ $post_type_name ][ 'orderby' ] : 'none';
145
+
146
  //Output Menu Order Arguments
147
  printf( '<p>%s</p>', esc_html__( 'Sort by:', 'metronet-reorder-posts' ) );
148
  printf( '<select name="metronet-reorder-posts[menu_order][%1$s][orderby]">', esc_attr( $post_type_name ) );
149
  printf( '<option value="none" %s>%s</option>', selected( 'none', $menu_orderby, false ), esc_html__( 'None', 'metronet-reorder-posts' ) );
150
  printf( '<option value="menu_order" %s>%s</option>', selected( 'menu_order', $menu_orderby, false ), esc_html__( 'Menu Order', 'metronet-reorder-posts' ) );
151
  echo '</select>';
152
+
153
  //Get order arguments
154
  $menu_order = isset( $settings_menu_order[ $post_type_name ][ 'order' ] ) ? $settings_menu_order[ $post_type_name ][ 'order' ] : 'DESC'; //DESC is WP_Query default
155
  //Output Menu Order Arguments
158
  printf( '<option value="ASC" %s>%s</option>', selected( 'ASC', $menu_order, false ), esc_html__( 'ASC', 'metronet-reorder-posts' ) );
159
  printf( '<option value="DESC" %s>%s</option>', selected( 'DESC', $menu_order, false ), esc_html__( 'DESC', 'metronet-reorder-posts' ) );
160
  echo '</select>';
161
+
162
  //Output closing div
163
  echo '</div>';
164
  }
165
  }
166
+
167
  /**
168
  * Add post types to be reordered using the plugin
169
  *
174
  *
175
  * @see init_admin_settings
176
  *
177
+ * @param array $args {
178
  @type string $desc Description for the setting.
179
+
180
  }
181
  */
182
  public function add_settings_field_post_types( $args = array() ) {
184
  $settings = $this->get_plugin_options();
185
  $settings_post_types = isset( $settings[ 'post_types' ] ) ? $settings[ 'post_types' ] : array();
186
  $post_types = get_post_types( array(), 'object' );
187
+
188
  //Foreach loop to show de awesome post types
189
  foreach( $post_types as $post_type_name => $post_type ) {
190
+
191
  //Determine whether to show this post type (show_ui = true)
192
  $show_ui = (bool)isset( $post_type->show_ui ) ? $post_type->show_ui : false;
193
  if ( !$show_ui || 'attachment' === $post_type_name ) continue;
194
+
195
  //Get post type labels for checkbox
196
  $post_type_value = isset( $settings_post_types[ $post_type_name ] ) ? $settings_post_types[ $post_type_name ] : 'on';
197
  $post_type_label = isset( $post_type->label ) ? $post_type->label : $post_type_name;
198
  $checked = '';
199
  if ( $post_type_value === 'on' ) {
200
  $checked = checked( true, true, false );
201
+ }
202
+
203
  //Output post type option
204
  printf( '<div><input type="hidden" name="metronet-reorder-posts[post_types][%1$s]" value="off" /> <input type="checkbox" name="metronet-reorder-posts[post_types][%1$s]" id="post_type_%1$s" value="on" %2$s /><label for="post_type_%1$s">&nbsp;%3$s</label></div>', esc_attr( $post_type_name ), $checked, esc_html( $post_type_label ) );
205
  }
206
  }
207
+
208
  public function add_settings_heading_menu_order() {
209
+ printf( '<p>%s</p>', esc_html__( 'These are advanced options and you should only use these if you know what you are doing. These can overwrite the menu orders of custom queries (using get_posts or WP_Query), custom post type archives, and even the order your blog posts display.', 'metronet-reorder-posts' ) );
210
  }
211
  /**
212
  * Add a settings link to the plugin's options.
221
  * @param array $links Array of plugin options
222
  * @return array $links Array of plugin options
223
  */
224
+ public function add_settings_link( $links ) {
225
+ $settings_link = sprintf( '<a href="%s">%s</a>', esc_url( admin_url( 'options-general.php?page=metronet-reorder-posts' ) ), _x( 'Settings', 'Plugin settings link on the plugins page', 'metronet-reorder-posts' ) );
226
+ array_unshift($links, $settings_link);
227
+ return $links;
228
  }
229
+
230
  /**
231
  * Initialize and return plugin options.
232
  *
241
  */
242
  public function get_plugin_options() {
243
  if ( false === $this->options ) {
244
+ $settings = get_option( 'metronet-reorder-posts' );
245
  } else {
246
  $settings = $this->options;
247
  }
248
+
249
  if ( false === $settings || !is_array( $settings ) ) {
250
  $defaults = array(
251
  'post_types' => array(),
252
  'menu_order' => array(),
253
+ 'show_query' => 'on'
254
  );
255
  update_option( 'metronet-reorder-posts', $defaults );
256
  return $defaults;
258
  $this->options = $settings;
259
  return $settings;
260
  }
261
+
262
  /**
263
+ * Initialize options
264
  *
265
  * Initialize page settings, fields, and sections and their callbacks
266
  *
272
  */
273
  public function init_admin_settings() {
274
  register_setting( 'metronet-reorder-posts', 'metronet-reorder-posts', array( $this, 'sanitization' ) );
275
+
276
  add_settings_section( 'mn-reorder-post-types', _x( 'Enable Post Types', 'plugin settings heading' , 'metronet-reorder-posts' ), '__return_empty_string', 'metronet-reorder-posts' );
277
+
278
  add_settings_section( 'mn-reorder-menu-order', _x( 'Advanced', 'plugin settings heading' , 'metronet-reorder-posts' ), array( $this, 'add_settings_heading_menu_order' ), 'metronet-reorder-posts' );
279
+
280
+ add_settings_section( 'mn-reorder-query', _x( 'Reorder Posts', 'plugin settings heading' , 'metronet-reorder-posts' ), '__return_empty_string', 'metronet-reorder-posts' );
281
+
282
  add_settings_field( 'mn-post-types', __( 'Post Types', 'metronet-reorder-posts' ), array( $this, 'add_settings_field_post_types' ), 'metronet-reorder-posts', 'mn-reorder-post-types', array( 'desc' => __( 'Select the post types you would like this plugin enabled for.', 'metronet-reorder-posts' ) ) );
283
+
284
  add_settings_field( 'mn-menu-order', __( 'Select the menu order arguments.', 'metronet-reorder-posts' ), array( $this, 'add_settings_field_menu_order' ), 'metronet-reorder-posts', 'mn-reorder-menu-order', array( 'desc' => __( 'Select the menu order for the post types.', 'metronet-reorder-posts' ) ) );
285
+
286
+ add_settings_field( 'mn-reorder-query', __( 'Show Posts Query', 'metronet-reorder-posts' ), array( $this, 'add_settings_reorder_query' ), 'metronet-reorder-posts', 'mn-reorder-query', array( 'desc' => __( 'Show a helpful sample query for Reorder posts.', 'metronet-reorder-posts' ) ) );
287
+
288
  }
289
+
290
  //Used for get_posts calls
291
  public function modify_menu_order_pre( $query ) {
292
  if( $query->is_main_query() || is_admin() || is_feed() ) return;
293
+
294
  if ( !apply_filters( 'metronet_reorder_allow_menu_order', true ) ) return; //Return false to disable this completely
295
+
296
  //Get main plugin options
297
  $plugin_options = $this->get_plugin_options();
298
  if ( !isset( $plugin_options[ 'menu_order' ] ) || !is_array( $plugin_options[ 'menu_order' ] ) || empty( $plugin_options[ 'menu_order' ] ) ) return;
299
  $menu_order = $plugin_options[ 'menu_order' ];
300
+
301
  //Get main post type
302
  $main_query = $query->query;
303
  $post_type = false;
304
  if( isset( $main_query[ 'post_type' ] ) ) {
305
  //Typically set on post type archives or custom WP_Query or get_posts instances
306
+ $post_type = $main_query[ 'post_type' ];
307
  }
308
  if ( !$post_type || is_array( $post_type ) ) return;
309
+
310
  //See if suppress filters is on (using get_posts) (if it's not, use modify_menu_order_sql for that)
311
  if ( !isset( $main_query[ 'suppress_filters' ] ) ) return;
312
+
313
  if ( !apply_filters( 'metronet_reorder_allow_menu_order_' . $post_type, true ) ) return; //Return false to disable this for each individual post type as opposed to using a global filter above
314
+
315
  //See if we're modifying the menu_order
316
  $menu_order_orderby = isset( $menu_order[ $post_type ][ 'orderby' ] ) ? $menu_order[ $post_type ][ 'orderby' ] : 'none';
317
  $menu_order_order = isset( $menu_order[ $post_type ][ 'order' ] ) ? $menu_order[ $post_type ][ 'order' ] : 'DESC';
318
+
319
  //Return if post type is not be ordered
320
  if ( $menu_order_orderby === 'none' ) return;
321
+
322
  //Return of $menu_order_order is invalid
323
  if ( $menu_order_order !== 'ASC' && $menu_order_order !== 'DESC' ) return;
324
+
325
  //Overwrite the orderby clause
326
  $query->set( 'orderby', 'menu_order' );
327
  $query->set( 'order', $menu_order_order );
328
  }
329
+
330
  //Used on homepage archives, post type archives, or custom WP_Query calls
331
  public function modify_menu_order_sql( $sql_orderby, $query ) {
332
  if ( is_admin() || is_404() || is_feed() ) return $sql_orderby;
333
+
334
  if ( !apply_filters( 'metronet_reorder_allow_menu_order', true ) ) return $sql_orderby; //Return false to disable this completely
335
+
336
  //Get main plugin options
337
  $plugin_options = $this->get_plugin_options();
338
  if ( !isset( $plugin_options[ 'menu_order' ] ) || !is_array( $plugin_options[ 'menu_order' ] ) || empty( $plugin_options[ 'menu_order' ] ) ) return $sql_orderby;
339
+
340
  $menu_order = $plugin_options[ 'menu_order' ];
341
+
342
  $main_query = $query->query;
343
+
344
  //Get main post type - Try to get post_type first, if not, see if we're on the main page showing blog posts
345
  $post_type = false;
346
  if( isset( $main_query[ 'post_type' ] ) ) {
347
  //Typically set on post type archives or custom WP_Query or get_posts instances
348
+ $post_type = $main_query[ 'post_type' ];
349
  } elseif ( is_home() ) {
350
  $post_type = 'post';
351
+ }
352
  if ( !$post_type || is_array( $post_type ) ) return $sql_orderby;
353
+
354
  if ( !apply_filters( 'metronet_reorder_allow_menu_order_' . $post_type, true ) ) return $sql_orderby; //Return false to disable this for each individual post type as opposed to using a global filter above
355
+
356
  //See if we're modifying the menu_order
357
  $menu_order_orderby = isset( $menu_order[ $post_type ][ 'orderby' ] ) ? $menu_order[ $post_type ][ 'orderby' ] : 'none';
358
  $menu_order_order = isset( $menu_order[ $post_type ][ 'order' ] ) ? $menu_order[ $post_type ][ 'order' ] : 'DESC';
359
+
360
  //Return if post type is not be ordered
361
  if ( $menu_order_orderby === 'none' ) return $sql_orderby;
362
+
363
  //Return of $menu_order_order is invalid
364
  if ( $menu_order_order !== 'ASC' && $menu_order_order !== 'DESC' ) return $sql_orderby;
365
+
366
  //Overwrite the orderby clause
367
  global $wpdb;
368
  $sql_orderby = sprintf( '%s.menu_order %s', $wpdb->posts, $menu_order_order ); //for devs: no sanitization required as tablename is from $wpdb and $menu_order_order is set to match only ASC or DESC.
369
 
370
+ //Return
371
+ return $sql_orderby;
372
+
373
  }
374
+
375
  /**
376
  * Output options page HTML.
377
  *
395
  </div>
396
  <?php
397
  }
398
+
399
  /**
400
  * Sanitize options before they are saved.
401
  *
408
  *
409
  * @param array $input {
410
  @type array $post_types
411
+ @type array $menu_order
412
  }
413
  * @return array Sanitized array of options
414
  */
418
  if ( !empty( $post_types ) ) {
419
  foreach( $post_types as $post_type_name => &$value ) {
420
  if ( $value !== 'on' ) {
421
+ $value == 'off';
422
  }
423
+ }
424
  $input[ 'post_types' ] = $post_types;
425
  }
426
+
427
  //Get menu order options
428
  $menu_order = $input[ 'menu_order' ];
429
  if ( !empty( $menu_order ) ) {
432
  if ( $orderby !== 'menu_order' ) {
433
  $menu_order[ $post_type_name ][ 'orderby' ] == 'none';
434
  }
435
+
436
  $order = isset( $menu_order[ $post_type_name ][ 'order' ] ) ? $menu_order[ $post_type_name ] : 'DESC';
437
  if ( $orderby !== 'ASC' ) {
438
+ $menu_order[ $post_type_name ][ 'order' ] == 'DESC';
439
  }
440
  }
441
  $input[ 'menu_order' ] = $menu_order;
442
+
443
  }
444
  return $input;
445
  }
446
+
447
  } //end class Reorder_Admin
448
 
449
  add_action( 'init', 'mn_reorder_admin_instantiate', 15 );
class-reorder.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * Reorder posts
4
- *
5
  * @package WordPress
6
  * @subpackage Metronet Reorder Posts plugin
7
  */
@@ -10,12 +10,12 @@
10
  /**
11
  * Reorder posts
12
  * Adds drag and drop editor for reordering WordPress posts
13
- *
14
  * Based on work by Scott Basgaard and Ronald Huereca
15
- *
16
  * To use this class, simply instantiate it using an argument to set the post type as follows:
17
  * new MN_Reorder( array( 'post_type' => 'post', 'order'=> 'ASC' ) );
18
- *
19
  * @copyright Copyright (c), Metronet
20
  * @license http://www.gnu.org/licenses/gpl.html GPL
21
  * @author Ryan Hellyer <ryan@metronet.no>
@@ -24,42 +24,42 @@
24
  final class MN_Reorder {
25
 
26
  /**
27
- * @var $post_type
28
  * @desc Post type to be reordered
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
49
  * @desc Admin page heading
50
  * @access private
51
  */
52
  private $heading;
53
 
54
  /**
55
- * @var $initial
56
  * @desc HTML outputted at end of admin page
57
  * @access private
58
  */
59
  private $initial;
60
 
61
  /**
62
- * @var $final
63
  * @desc HTML outputted at end of admin page
64
  * @access private
65
  */
@@ -73,26 +73,26 @@ final class MN_Reorder {
73
  private $post_status;
74
 
75
  /**
76
- * @var $menu_label
77
  * @desc Admin page menu label
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
  *
@@ -102,9 +102,9 @@ final class MN_Reorder {
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
  *
@@ -114,9 +114,9 @@ final class MN_Reorder {
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
  *
@@ -126,9 +126,9 @@ final class MN_Reorder {
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
  *
@@ -138,22 +138,22 @@ final class MN_Reorder {
138
  * @returns int $offset Offset of posts
139
  */
140
  public function get_offset() {
141
- return $this->offset;
142
  }
143
-
144
  /**
145
  * Class constructor
146
- *
147
  * Sets definitions
148
  * Adds methods to appropriate hooks
149
- *
150
  * @author Ryan Hellyer <ryan@metronet.no>
151
  * @since Reorder 1.0
152
  * @access public
153
  * @param array $args If not set, then uses $defaults instead
154
  */
155
  public function __construct( $args = array() ) {
156
-
157
  // Get posts per page
158
  $user_id = get_current_user_id();
159
  $posts_per_page = get_user_meta( $user_id, 'reorder_items_per_page', true );
@@ -161,7 +161,7 @@ final class MN_Reorder {
161
  $posts_per_page = 50;
162
  }
163
  $offset = $posts_per_page - 2;
164
-
165
  // Parse arguments
166
  $defaults = array(
167
  'post_type' => 'post', // Setting the post type to be reordered
@@ -175,7 +175,7 @@ final class MN_Reorder {
175
  'posts_per_page' => $posts_per_page
176
  );
177
  $args = wp_parse_args( $args, $defaults );
178
-
179
  // Set variables
180
  $this->post_type = $args[ 'post_type' ];
181
  $this->order = $args[ 'order' ];;
@@ -184,14 +184,14 @@ final class MN_Reorder {
184
  $this->final = $args[ 'final' ];
185
  $this->menu_label = $args[ 'menu_label' ];
186
  $this->post_status = $args[ 'post_status' ];
187
-
188
  //Get offset and posts_per_page
189
  $this->posts_per_page = absint( $args[ 'posts_per_page' ] ); //todo - filterable?
190
  $this->offset = absint( $args[ 'offset' ] ); //todo - filterable?
191
  if ( $this->offset > $this->posts_per_page ) {
192
- $this->offset = $this->posts_per_page;
193
  }
194
-
195
  // Add actions
196
  add_filter( 'set-screen-option', array( $this, 'add_screen_option_save' ), 10, 3 );
197
  add_action( 'wp_ajax_post_sort', array( $this, 'ajax_save_post_order' ) );
@@ -225,11 +225,11 @@ final class MN_Reorder {
225
  */
226
  public function ajax_save_post_order() {
227
  global $wpdb;
228
-
229
  if ( !current_user_can( 'edit_pages' ) ) die( '' );
230
  // Verify nonce value, for security purposes
231
  if ( !wp_verify_nonce( $_POST['nonce'], 'sortnonce' ) ) die( '' );
232
-
233
  //Get Ajax Vars
234
  $post_parent = isset( $_POST[ 'post_parent' ] ) ? absint( $_POST[ 'post_parent' ] ) : 0;
235
  $menu_order_start = isset( $_POST[ 'start' ] ) ? absint( $_POST[ 'start' ] ) : 0;
@@ -237,13 +237,13 @@ final class MN_Reorder {
237
  $post_menu_order = isset( $_POST[ 'menu_order' ] ) ? absint( $_POST[ 'menu_order' ] ) : 0;
238
  $posts_to_exclude = isset( $_POST[ 'excluded' ] ) ? array_filter( $_POST[ 'excluded' ], 'absint' ) : array();
239
  $post_type = isset( $_POST[ 'post_type' ] ) ? sanitize_text_field( $_POST[ 'post_type' ] ) : false;
240
-
241
  if ( !$post_type ) die( '' );
242
-
243
  //Performance
244
  remove_action( 'pre_post_update', 'wp_save_post_revision' );
245
-
246
- //Build Initial Return
247
  $return = array();
248
  $return[ 'more_posts' ] = false;
249
  $return[ 'action' ] = 'post_sort';
@@ -252,7 +252,7 @@ final class MN_Reorder {
252
  $return[ 'post_id'] = $post_id;
253
  $return[ 'menu_order' ] = $post_menu_order;
254
  $return[ 'post_type' ] = $post_type;
255
-
256
  //Update post if passed - Should run only on beginning of first iteration
257
  if( $post_id > 0 && !isset( $_POST[ 'more_posts' ] ) ) {
258
  $wpdb->update(
@@ -262,7 +262,7 @@ final class MN_Reorder {
262
  clean_post_cache( $post_id );
263
  $posts_to_exclude[] = $post_id;
264
  }
265
-
266
  //Build Query
267
  $query_args = array(
268
  'post_type' => $post_type,
@@ -278,15 +278,15 @@ final class MN_Reorder {
278
  'update_post_meta_cache' => false
279
  );
280
  $posts = new WP_Query( $query_args );
281
-
282
  $start = $menu_order_start;
283
  if ( $posts->have_posts() ) {
284
  foreach( $posts->posts as $post ) {
285
  //Increment start if matches menu_order and there is a post to change
286
  if ( $start == $post_menu_order && $post_id > 0 ) {
287
- $start++;
288
  }
289
-
290
  if ( $post_id != $post->ID ) {
291
  //Update post and counts
292
  $wpdb->update(
@@ -302,9 +302,9 @@ final class MN_Reorder {
302
  $return[ 'excluded' ] = $posts_to_exclude;
303
  $return[ 'start' ] = $start;
304
  if ( $posts->max_num_pages > 1 ) {
305
- $return[ 'more_posts' ] = true;
306
  } else {
307
- $return[ 'more_posts' ] = false;
308
  }
309
  die( json_encode( $return ) );
310
  } else {
@@ -335,7 +335,7 @@ final class MN_Reorder {
335
  public function print_scripts() {
336
  wp_enqueue_script( 'jquery-ui-touch-punch', REORDER_URL . '/scripts/jquery.ui.touch-punch.js', array( 'jquery-ui-sortable' ), '0.2.3', true );
337
  wp_register_script( 'reorder_nested', REORDER_URL . '/scripts/jquery.mjs.nestedSortable.js', array( 'jquery-ui-touch-punch' ), '2.0.0', true );
338
-
339
  wp_enqueue_script( 'reorder_posts', REORDER_URL . '/scripts/sort.js', array( 'reorder_nested' ), '20160813', true );
340
  wp_localize_script( 'reorder_posts', 'reorder_posts', array(
341
  'action' => 'post_sort',
@@ -383,7 +383,7 @@ final class MN_Reorder {
383
  add_action( 'admin_print_styles-' . $hook, array( $this, 'print_styles' ) );
384
  add_action( 'admin_print_scripts-' . $hook, array( $this, 'print_scripts' ) );
385
  }
386
-
387
  /**
388
  * Add screen option for setting items per page
389
  *
@@ -400,7 +400,7 @@ final class MN_Reorder {
400
 
401
  add_screen_option( 'per_page', $args );
402
  }
403
-
404
  /**
405
  * Saves the screen options setting
406
  *
@@ -410,10 +410,10 @@ final class MN_Reorder {
410
  */
411
  public function add_screen_option_save( $status, $option, $value ) {
412
  if ( 'reorder_items_per_page' == $option ) return $value;
413
-
414
  return $status;
415
  }
416
-
417
  /**
418
  * Output the main Reorder Interface
419
  *
@@ -437,7 +437,7 @@ final class MN_Reorder {
437
  //Output non hierarchical posts
438
  $page = isset( $_GET[ 'paged' ] ) ? absint( $_GET[ 'paged' ] ) : 0;
439
  if ( $page == 0 || $page == 1 ) {
440
- $offset = 0;
441
  } elseif ( $page > 1 ) {
442
  $offset = $this->offset * ( $page - 1 );
443
  }
@@ -460,10 +460,10 @@ final class MN_Reorder {
460
  while( $post_query->have_posts() ) {
461
  global $post;
462
  $post_query->the_post();
463
- $this->output_row( $post );
464
  }
465
  echo '</ul><!-- #post-list -->';
466
-
467
  //Show pagination links
468
  if( $post_query->max_num_pages > 1 ) {
469
  echo '<div id="reorder-pagination">';
@@ -477,10 +477,35 @@ final class MN_Reorder {
477
  echo '</div>';
478
  }
479
  } else {
480
- echo sprintf( '<h3>%s</h3> ', esc_html__( 'There is nothing to sort at this time', 'metronet-reorder-posts' ) );
481
  }
482
- echo esc_html( $this->final );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
483
  }
 
484
  /**
485
  * Post Row Output
486
  *
@@ -521,7 +546,7 @@ final class MN_Reorder {
521
  ?>
522
  <div class="row">
523
  <?php
524
- $is_hierarchical = true;
525
  if( is_post_type_hierarchical( $post->post_type ) ) {
526
  ?>
527
  <div class="row-action">
@@ -537,7 +562,7 @@ final class MN_Reorder {
537
  </div><!-- .row -->
538
  <?php
539
  }
540
-
541
  if( $children->have_posts() ) {
542
  echo '<ul class="children">';
543
  while( $children->have_posts() ) {
@@ -546,12 +571,12 @@ final class MN_Reorder {
546
  $this->output_row( $post );
547
  }
548
  echo '</ul>';
549
- }
550
  ?>
551
  </li>
552
  <?php
553
  } //end output_row
554
-
555
  /**
556
  * Initial HTML output
557
  *
@@ -568,7 +593,7 @@ final class MN_Reorder {
568
  <?php echo esc_html( $this->heading ); ?>
569
  </h2>
570
  <?php
571
- $tabs =
572
  array(
573
  array(
574
  'url' => $this->reorder_page /* URL to the tab */,
@@ -579,7 +604,7 @@ final class MN_Reorder {
579
  );
580
  $tabs = apply_filters( 'metronet_reorder_posts_tabs_' . $this->post_type, (array)$tabs );
581
  $tabs_count = count( $tabs );
582
-
583
  //Output tabs
584
  $tab_html = '';
585
  if ( $tabs && !empty( $tabs ) ) {
@@ -594,17 +619,17 @@ final class MN_Reorder {
594
  $do_action = isset( $tab[ 'action' ] ) ? $tab[ 'action' ] : false;
595
  }
596
  $tab_url = isset( $tab[ 'url' ] ) ? $tab[ 'url' ] : '';
597
- $tab_label = isset( $tab[ 'label' ] ) ? $tab[ 'label' ] : '';
598
  $tab_html .= sprintf( '<a href="%s" class="%s">%s</a>', esc_url( $tab_url ), esc_attr( implode( ' ', $classes ) ), esc_html( $tab[ 'label' ] ) );
599
  }
600
  $tab_html .= '</h2>';
601
  if ( $tabs_count > 1 ) {
602
- echo $tab_html;
603
  }
604
  if ( $do_action ) {
605
- do_action( $do_action );
606
  }
607
- }
608
  ?>
609
  </div><!-- .wrap -->
610
  <?php
1
  <?php
2
  /**
3
  * Reorder posts
4
+ *
5
  * @package WordPress
6
  * @subpackage Metronet Reorder Posts plugin
7
  */
10
  /**
11
  * Reorder posts
12
  * Adds drag and drop editor for reordering WordPress posts
13
+ *
14
  * Based on work by Scott Basgaard and Ronald Huereca
15
+ *
16
  * To use this class, simply instantiate it using an argument to set the post type as follows:
17
  * new MN_Reorder( array( 'post_type' => 'post', 'order'=> 'ASC' ) );
18
+ *
19
  * @copyright Copyright (c), Metronet
20
  * @license http://www.gnu.org/licenses/gpl.html GPL
21
  * @author Ryan Hellyer <ryan@metronet.no>
24
  final class MN_Reorder {
25
 
26
  /**
27
+ * @var $post_type
28
  * @desc Post type to be reordered
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
49
  * @desc Admin page heading
50
  * @access private
51
  */
52
  private $heading;
53
 
54
  /**
55
+ * @var $initial
56
  * @desc HTML outputted at end of admin page
57
  * @access private
58
  */
59
  private $initial;
60
 
61
  /**
62
+ * @var $final
63
  * @desc HTML outputted at end of admin page
64
  * @access private
65
  */
73
  private $post_status;
74
 
75
  /**
76
+ * @var $menu_label
77
  * @desc Admin page menu label
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
  *
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
  *
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
  *
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
  *
138
  * @returns int $offset Offset of posts
139
  */
140
  public function get_offset() {
141
+ return $this->offset;
142
  }
143
+
144
  /**
145
  * Class constructor
146
+ *
147
  * Sets definitions
148
  * Adds methods to appropriate hooks
149
+ *
150
  * @author Ryan Hellyer <ryan@metronet.no>
151
  * @since Reorder 1.0
152
  * @access public
153
  * @param array $args If not set, then uses $defaults instead
154
  */
155
  public function __construct( $args = array() ) {
156
+
157
  // Get posts per page
158
  $user_id = get_current_user_id();
159
  $posts_per_page = get_user_meta( $user_id, 'reorder_items_per_page', true );
161
  $posts_per_page = 50;
162
  }
163
  $offset = $posts_per_page - 2;
164
+
165
  // Parse arguments
166
  $defaults = array(
167
  'post_type' => 'post', // Setting the post type to be reordered
175
  'posts_per_page' => $posts_per_page
176
  );
177
  $args = wp_parse_args( $args, $defaults );
178
+
179
  // Set variables
180
  $this->post_type = $args[ 'post_type' ];
181
  $this->order = $args[ 'order' ];;
184
  $this->final = $args[ 'final' ];
185
  $this->menu_label = $args[ 'menu_label' ];
186
  $this->post_status = $args[ 'post_status' ];
187
+
188
  //Get offset and posts_per_page
189
  $this->posts_per_page = absint( $args[ 'posts_per_page' ] ); //todo - filterable?
190
  $this->offset = absint( $args[ 'offset' ] ); //todo - filterable?
191
  if ( $this->offset > $this->posts_per_page ) {
192
+ $this->offset = $this->posts_per_page;
193
  }
194
+
195
  // Add actions
196
  add_filter( 'set-screen-option', array( $this, 'add_screen_option_save' ), 10, 3 );
197
  add_action( 'wp_ajax_post_sort', array( $this, 'ajax_save_post_order' ) );
225
  */
226
  public function ajax_save_post_order() {
227
  global $wpdb;
228
+
229
  if ( !current_user_can( 'edit_pages' ) ) die( '' );
230
  // Verify nonce value, for security purposes
231
  if ( !wp_verify_nonce( $_POST['nonce'], 'sortnonce' ) ) die( '' );
232
+
233
  //Get Ajax Vars
234
  $post_parent = isset( $_POST[ 'post_parent' ] ) ? absint( $_POST[ 'post_parent' ] ) : 0;
235
  $menu_order_start = isset( $_POST[ 'start' ] ) ? absint( $_POST[ 'start' ] ) : 0;
237
  $post_menu_order = isset( $_POST[ 'menu_order' ] ) ? absint( $_POST[ 'menu_order' ] ) : 0;
238
  $posts_to_exclude = isset( $_POST[ 'excluded' ] ) ? array_filter( $_POST[ 'excluded' ], 'absint' ) : array();
239
  $post_type = isset( $_POST[ 'post_type' ] ) ? sanitize_text_field( $_POST[ 'post_type' ] ) : false;
240
+
241
  if ( !$post_type ) die( '' );
242
+
243
  //Performance
244
  remove_action( 'pre_post_update', 'wp_save_post_revision' );
245
+
246
+ //Build Initial Return
247
  $return = array();
248
  $return[ 'more_posts' ] = false;
249
  $return[ 'action' ] = 'post_sort';
252
  $return[ 'post_id'] = $post_id;
253
  $return[ 'menu_order' ] = $post_menu_order;
254
  $return[ 'post_type' ] = $post_type;
255
+
256
  //Update post if passed - Should run only on beginning of first iteration
257
  if( $post_id > 0 && !isset( $_POST[ 'more_posts' ] ) ) {
258
  $wpdb->update(
262
  clean_post_cache( $post_id );
263
  $posts_to_exclude[] = $post_id;
264
  }
265
+
266
  //Build Query
267
  $query_args = array(
268
  'post_type' => $post_type,
278
  'update_post_meta_cache' => false
279
  );
280
  $posts = new WP_Query( $query_args );
281
+
282
  $start = $menu_order_start;
283
  if ( $posts->have_posts() ) {
284
  foreach( $posts->posts as $post ) {
285
  //Increment start if matches menu_order and there is a post to change
286
  if ( $start == $post_menu_order && $post_id > 0 ) {
287
+ $start++;
288
  }
289
+
290
  if ( $post_id != $post->ID ) {
291
  //Update post and counts
292
  $wpdb->update(
302
  $return[ 'excluded' ] = $posts_to_exclude;
303
  $return[ 'start' ] = $start;
304
  if ( $posts->max_num_pages > 1 ) {
305
+ $return[ 'more_posts' ] = true;
306
  } else {
307
+ $return[ 'more_posts' ] = false;
308
  }
309
  die( json_encode( $return ) );
310
  } else {
335
  public function print_scripts() {
336
  wp_enqueue_script( 'jquery-ui-touch-punch', REORDER_URL . '/scripts/jquery.ui.touch-punch.js', array( 'jquery-ui-sortable' ), '0.2.3', true );
337
  wp_register_script( 'reorder_nested', REORDER_URL . '/scripts/jquery.mjs.nestedSortable.js', array( 'jquery-ui-touch-punch' ), '2.0.0', true );
338
+
339
  wp_enqueue_script( 'reorder_posts', REORDER_URL . '/scripts/sort.js', array( 'reorder_nested' ), '20160813', true );
340
  wp_localize_script( 'reorder_posts', 'reorder_posts', array(
341
  'action' => 'post_sort',
383
  add_action( 'admin_print_styles-' . $hook, array( $this, 'print_styles' ) );
384
  add_action( 'admin_print_scripts-' . $hook, array( $this, 'print_scripts' ) );
385
  }
386
+
387
  /**
388
  * Add screen option for setting items per page
389
  *
400
 
401
  add_screen_option( 'per_page', $args );
402
  }
403
+
404
  /**
405
  * Saves the screen options setting
406
  *
410
  */
411
  public function add_screen_option_save( $status, $option, $value ) {
412
  if ( 'reorder_items_per_page' == $option ) return $value;
413
+
414
  return $status;
415
  }
416
+
417
  /**
418
  * Output the main Reorder Interface
419
  *
437
  //Output non hierarchical posts
438
  $page = isset( $_GET[ 'paged' ] ) ? absint( $_GET[ 'paged' ] ) : 0;
439
  if ( $page == 0 || $page == 1 ) {
440
+ $offset = 0;
441
  } elseif ( $page > 1 ) {
442
  $offset = $this->offset * ( $page - 1 );
443
  }
460
  while( $post_query->have_posts() ) {
461
  global $post;
462
  $post_query->the_post();
463
+ $this->output_row( $post );
464
  }
465
  echo '</ul><!-- #post-list -->';
466
+
467
  //Show pagination links
468
  if( $post_query->max_num_pages > 1 ) {
469
  echo '<div id="reorder-pagination">';
477
  echo '</div>';
478
  }
479
  } else {
480
+ echo sprintf( '<h3>%s</h3> ', esc_html__( 'There is nothing to sort at this time', 'metronet-reorder-posts' ) );
481
  }
482
+ echo esc_html( $this->final );
483
+ $options = get_option( 'metronet-reorder-posts' );
484
+
485
+ if ( ! isset( $options[ 'show_query' ] ) || 'on' === $options[ 'show_query' ] ):
486
+ printf( '<h3>%s</h3>', esc_html__( 'Reorder Posts Query', 'metronet-reorder-posts' ) );
487
+ printf( '<p>%s</p>', esc_html__( 'You will need custom code to reorder posts. Here are some example query arguments for getting your content.', 'metronet-reorder-posts' ) );
488
+ $query = "
489
+ \$query = array(
490
+ 'orderby' => 'menu_order',
491
+ 'order' => 'ASC',
492
+ 'post_status' => 'publish',
493
+ 'post_type' => '{$this->post_type}',
494
+ 'posts_per_page' => {$this->posts_per_page}
495
+ );
496
+ \$posts = get_posts( \$query );
497
+ if( ! empty( \$posts ) ) {
498
+ echo '<ul>';
499
+ foreach( \$posts as \$post ) {
500
+ printf( '<li><a href=\"%s\">%s</a></li>', esc_url( get_permalink( \$post->ID ) ), esc_html( \$post->post_title ) );
501
+ }
502
+ echo '</ul>';
503
+ }
504
+ ";
505
+ printf( '<blockquote><pre><code>%s</code></pre></blockquote>', esc_html( print_r( $query, true ) ) );
506
+ endif;
507
  }
508
+
509
  /**
510
  * Post Row Output
511
  *
546
  ?>
547
  <div class="row">
548
  <?php
549
+ $is_hierarchical = true;
550
  if( is_post_type_hierarchical( $post->post_type ) ) {
551
  ?>
552
  <div class="row-action">
562
  </div><!-- .row -->
563
  <?php
564
  }
565
+
566
  if( $children->have_posts() ) {
567
  echo '<ul class="children">';
568
  while( $children->have_posts() ) {
571
  $this->output_row( $post );
572
  }
573
  echo '</ul>';
574
+ }
575
  ?>
576
  </li>
577
  <?php
578
  } //end output_row
579
+
580
  /**
581
  * Initial HTML output
582
  *
593
  <?php echo esc_html( $this->heading ); ?>
594
  </h2>
595
  <?php
596
+ $tabs =
597
  array(
598
  array(
599
  'url' => $this->reorder_page /* URL to the tab */,
604
  );
605
  $tabs = apply_filters( 'metronet_reorder_posts_tabs_' . $this->post_type, (array)$tabs );
606
  $tabs_count = count( $tabs );
607
+
608
  //Output tabs
609
  $tab_html = '';
610
  if ( $tabs && !empty( $tabs ) ) {
619
  $do_action = isset( $tab[ 'action' ] ) ? $tab[ 'action' ] : false;
620
  }
621
  $tab_url = isset( $tab[ 'url' ] ) ? $tab[ 'url' ] : '';
622
+ $tab_label = isset( $tab[ 'label' ] ) ? $tab[ 'label' ] : '';
623
  $tab_html .= sprintf( '<a href="%s" class="%s">%s</a>', esc_url( $tab_url ), esc_attr( implode( ' ', $classes ) ), esc_html( $tab[ 'label' ] ) );
624
  }
625
  $tab_html .= '</h2>';
626
  if ( $tabs_count > 1 ) {
627
+ echo $tab_html;
628
  }
629
  if ( $do_action ) {
630
+ do_action( $do_action );
631
  }
632
+ }
633
  ?>
634
  </div><!-- .wrap -->
635
  <?php
index.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Reorder Posts
4
  Plugin URI: https://wordpress.org/plugins/metronet-reorder-posts/
5
  Description: Easily reorder posts and pages in WordPress
6
- Version: 2.4.0
7
  Author: Ryan Hellyer, Ronald Huereca, Scott Basgaard
8
  Author URI: https://github.com/ronalfy/reorder-posts
9
  Text Domain: metronet-reorder-posts
@@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28
 
29
  /**
30
  * Do not continue processing since file was called directly
31
- *
32
  * @since 1.0
33
  * @author Ryan Hellyer <ryan@metronet.no>
34
  */
@@ -37,7 +37,7 @@ if ( !defined( 'ABSPATH' ) )
37
 
38
  /**
39
  * Load classes
40
- *
41
  * @since 1.0
42
  * @author Ryan Hellyer <ryan@metronet.no>
43
  */
@@ -46,7 +46,7 @@ require( 'class-reorder-admin.php' );
46
 
47
  /**
48
  * Define constants
49
- *
50
  * @since 1.0
51
  * @author Ryan Hellyer <ryan@metronet.no>
52
  */
@@ -58,7 +58,7 @@ define( 'REORDER_BASENAME', plugin_basename(__FILE__) ); //Plugin basename
58
  /**
59
  * Instantiate admin panel
60
  * Iterate through each specified post type and instantiate it's organiser
61
- *
62
  * @since 1.0
63
  * @author Ryan Hellyer <ryan@metronet.no>
64
  */
@@ -66,27 +66,27 @@ add_action( 'wp_loaded', 'mn_reorder_posts_init', 100 ); //Load low priority in
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
71
  $plugin_options = get_option( 'metronet-reorder-posts', false );
72
  if ( $plugin_options && isset( $plugin_options[ 'post_types' ] ) && is_array( $plugin_options[ 'post_types' ] ) ) {
73
  foreach( $plugin_options[ 'post_types' ] as $post_type => $value ) {
74
  if( $value === 'off' ) {
75
- unset( $post_types[ $post_type ] );
76
  }
77
  }
78
  }
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
86
  $post_type_object = get_post_type_object( $post_type );
87
  $post_type_label = isset( $post_type_object->label ) ? $post_type_object->label : __( 'Posts', 'metronet-reorder-posts' );
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,
@@ -97,7 +97,7 @@ function mn_reorder_posts_init() {
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
  );
@@ -113,4 +113,3 @@ function mn_reorder_init_language() {
113
  /* Global variable for storing class instances */
114
  global $mn_reorder_instances;
115
  $mn_reorder_instances = array();
116
-
3
  Plugin Name: Reorder Posts
4
  Plugin URI: https://wordpress.org/plugins/metronet-reorder-posts/
5
  Description: Easily reorder posts and pages in WordPress
6
+ Version: 2.4.1
7
  Author: Ryan Hellyer, Ronald Huereca, Scott Basgaard
8
  Author URI: https://github.com/ronalfy/reorder-posts
9
  Text Domain: metronet-reorder-posts
28
 
29
  /**
30
  * Do not continue processing since file was called directly
31
+ *
32
  * @since 1.0
33
  * @author Ryan Hellyer <ryan@metronet.no>
34
  */
37
 
38
  /**
39
  * Load classes
40
+ *
41
  * @since 1.0
42
  * @author Ryan Hellyer <ryan@metronet.no>
43
  */
46
 
47
  /**
48
  * Define constants
49
+ *
50
  * @since 1.0
51
  * @author Ryan Hellyer <ryan@metronet.no>
52
  */
58
  /**
59
  * Instantiate admin panel
60
  * Iterate through each specified post type and instantiate it's organiser
61
+ *
62
  * @since 1.0
63
  * @author Ryan Hellyer <ryan@metronet.no>
64
  */
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
71
  $plugin_options = get_option( 'metronet-reorder-posts', false );
72
  if ( $plugin_options && isset( $plugin_options[ 'post_types' ] ) && is_array( $plugin_options[ 'post_types' ] ) ) {
73
  foreach( $plugin_options[ 'post_types' ] as $post_type => $value ) {
74
  if( $value === 'off' ) {
75
+ unset( $post_types[ $post_type ] );
76
  }
77
  }
78
  }
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
86
  $post_type_object = get_post_type_object( $post_type );
87
  $post_type_label = isset( $post_type_object->label ) ? $post_type_object->label : __( 'Posts', 'metronet-reorder-posts' );
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,
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
  );
113
  /* Global variable for storing class instances */
114
  global $mn_reorder_instances;
115
  $mn_reorder_instances = array();
 
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: ryanhellyer, ronalfy, scottbasgaard
3
  Author URI: https://github.com/ronalfy/reorder-posts
4
  Plugin URL: https://wordpress.org/plugins/metronet-reorder-posts/
5
  Requires at Least: 3.7
6
- Tested up to: 4.9
7
- Tags: reorder, re-order, posts, wordpress, post-type, ajax, admin, hierarchical, menu_order, ordering
8
- Stable tag: 2.4.0
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
@@ -13,7 +13,7 @@ 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
 
@@ -35,11 +35,13 @@ We consider Reorder Posts a <strong>developer tool</strong>. If you do not know
35
  <li><a href="https://wordpress.org/plugins/reorder-terms/">Reorder Terms</a></li>
36
  </ul>
37
 
 
 
38
  <h3>Spread the Word</h3>
39
  If you like this plugin, please help spread the word. Rate the plugin. Write about the plugin. Something :)
40
 
41
  <h3>Translations</h3>
42
-
43
  <ul>
44
  <li>German</li>
45
  </ul>
@@ -59,14 +61,14 @@ The plugin is now independently developed by <a href="https://geek.hellyer.kiwi/
59
 
60
  == Installation ==
61
 
62
- Either install the plugin via the WordPress admin panel, or ...
63
 
64
  1. Upload `metronet-reorder-posts` to the `/wp-content/plugins/` directory.
65
  2. Activate the plugin through the 'Plugins' menu in WordPress.
66
 
67
- 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.
68
 
69
- By default, ordering is enabled for all post types. A settings panel is available for determining which post types to enable ordering for.
70
 
71
  Advanced customization is allowed via hooks. See the <a href="https://github.com/ronalfy/reorder-posts#plugin-filters">Plugin Filters on GitHub</a>.
72
 
@@ -92,7 +94,7 @@ There isn't one. The changes are saved automatically.
92
 
93
  Yes, and no. There are many ways to retrieve posts using the WordPress API, and if the code has a `menu_order` sort property, the changes should be reflected immediately.
94
 
95
- Often, however, there is no `menu_order` argument. In the plugin's settings, there is an "Advanced" section which will attempt to override the `menu_order` property. Please use this with caution.
96
 
97
  = Can I use this on a single post type? =
98
 
@@ -126,6 +128,12 @@ No, but there is an add-on for this plugin called <a href="https://wordpress.org
126
  2. Admin panel settings
127
 
128
  == Changelog ==
 
 
 
 
 
 
129
  = 2.4.0 =
130
  * Released 2016-08-14
131
  * Major CSS overhaul inspired by the Nested Pages plugin
@@ -190,10 +198,10 @@ No, but there is an add-on for this plugin called <a href="https://wordpress.org
190
  * Changed class names to be more unique.
191
 
192
  = 2.0.0 =
193
- * Released 2014-12-12
194
  * Added settings panel for enabling/disabling the Reorder plugin for post types.
195
  * Added advanced settings for overriding the menu order of post types.
196
- * Added internationalization capabilities.
197
  * Slightly adjusted the styles of the Reordering interface.
198
 
199
  = 1.0.6 =
@@ -231,6 +239,9 @@ No, but there is an add-on for this plugin called <a href="https://wordpress.org
231
 
232
  == Upgrade Notice ==
233
 
 
 
 
234
  = 2.4.0 =
235
  Major CSS overhaul inspired by the Nested Pages plugin and the plugin is now mobile friendly.
236
 
3
  Author URI: https://github.com/ronalfy/reorder-posts
4
  Plugin URL: https://wordpress.org/plugins/metronet-reorder-posts/
5
  Requires at Least: 3.7
6
+ Tested up to: 5.1
7
+ Tags: reorder, reorder posts
8
+ Stable tag: 2.4.1
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
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
 
35
  <li><a href="https://wordpress.org/plugins/reorder-terms/">Reorder Terms</a></li>
36
  </ul>
37
 
38
+
39
+
40
  <h3>Spread the Word</h3>
41
  If you like this plugin, please help spread the word. Rate the plugin. Write about the plugin. Something :)
42
 
43
  <h3>Translations</h3>
44
+
45
  <ul>
46
  <li>German</li>
47
  </ul>
61
 
62
  == Installation ==
63
 
64
+ Either install the plugin via the WordPress admin panel, or ...
65
 
66
  1. Upload `metronet-reorder-posts` to the `/wp-content/plugins/` directory.
67
  2. Activate the plugin through the 'Plugins' menu in WordPress.
68
 
69
+ 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.
70
 
71
+ By default, ordering is enabled for all post types. A settings panel is available for determining which post types to enable ordering for.
72
 
73
  Advanced customization is allowed via hooks. See the <a href="https://github.com/ronalfy/reorder-posts#plugin-filters">Plugin Filters on GitHub</a>.
74
 
94
 
95
  Yes, and no. There are many ways to retrieve posts using the WordPress API, and if the code has a `menu_order` sort property, the changes should be reflected immediately.
96
 
97
+ Often, however, there is no `menu_order` argument. In the plugin's settings, there is an "Advanced" section which will attempt to override the `menu_order` property. Please use this with caution.
98
 
99
  = Can I use this on a single post type? =
100
 
128
  2. Admin panel settings
129
 
130
  == Changelog ==
131
+
132
+ = 2.4.1 =
133
+ * Released 2019-02-16
134
+ * Added query to reorder posts for an example
135
+ * Option to turn off query output
136
+
137
  = 2.4.0 =
138
  * Released 2016-08-14
139
  * Major CSS overhaul inspired by the Nested Pages plugin
198
  * Changed class names to be more unique.
199
 
200
  = 2.0.0 =
201
+ * Released 2014-12-12
202
  * Added settings panel for enabling/disabling the Reorder plugin for post types.
203
  * Added advanced settings for overriding the menu order of post types.
204
+ * Added internationalization capabilities.
205
  * Slightly adjusted the styles of the Reordering interface.
206
 
207
  = 1.0.6 =
239
 
240
  == Upgrade Notice ==
241
 
242
+ = 2.4.1 =
243
+ Added query to reorder posts for an example. Option to turn off query output.
244
+
245
  = 2.4.0 =
246
  Major CSS overhaul inspired by the Nested Pages plugin and the plugin is now mobile friendly.
247