diff --git a/assets/js/src/simple-page-ordering.js b/assets/js/src/simple-page-ordering.js index 2ed5368..8311af1 100644 --- a/assets/js/src/simple-page-ordering.js +++ b/assets/js/src/simple-page-ordering.js @@ -152,3 +152,19 @@ sortable_post_table.sortable({ } } }); + +jQuery( function() { + // set up click handler for order reset link + jQuery( '#simple-page-ordering-reset' ).on( 'click', function(e) { + e.preventDefault(); + var post_type = jQuery( this ).data( 'posttype' ); + if ( window.confirm( 'Are you sure you want to reset the ' + post_type + ' order?' ) ) { + jQuery.post( ajaxurl, { + action: 'reset_simple_page_ordering', + post_type: post_type, + _wpnonce: simple_page_ordering_localized_data._wpnonce, + screen_id: simple_page_ordering_localized_data.screen_id + }, function() { window.location.reload(); } ); + } + } ); +}); diff --git a/simple-page-ordering.php b/simple-page-ordering.php index 4e9675c..e29a811 100644 --- a/simple-page-ordering.php +++ b/simple-page-ordering.php @@ -55,6 +55,7 @@ public function __construct() {} public static function add_actions() { add_action( 'load-edit.php', array( __CLASS__, 'load_edit_screen' ) ); add_action( 'wp_ajax_simple_page_ordering', array( __CLASS__, 'ajax_simple_page_ordering' ) ); + add_action( 'wp_ajax_reset_simple_page_ordering', array( __CLASS__, 'ajax_reset_simple_page_ordering' ) ); add_action( 'plugins_loaded', array( __CLASS__, 'load_textdomain' ) ); add_action( 'rest_api_init', array( __CLASS__, 'rest_api_init' ) ); } @@ -139,8 +140,7 @@ public static function wp() { 'simple-page-ordering', 'simple_page_ordering_localized_data', array( - '_wpnonce' => wp_create_nonce( 'simple-page-ordering_' . $screen->id ), - 'screen_id' => (string) $screen->id, + '_wpnonce' => wp_create_nonce( 'simple-page-ordering-nonce' ), ) ); @@ -164,12 +164,18 @@ function () { * Add page ordering help to the help tab */ public static function admin_head() { - $screen = get_current_screen(); + $reset_order = sprintf( '%s', get_query_var( 'post_type' ), __( 'Reset post order', 'simple-page-ordering' ) ); + $screen = get_current_screen(); $screen->add_help_tab( array( 'id' => 'simple_page_ordering_help_tab', - 'title' => 'Simple Page Ordering', - 'content' => '
' . __( 'To reposition an item, simply drag and drop the row by "clicking and holding" it anywhere (outside of the links and form controls) and moving it to its new position.', 'simple-page-ordering' ) . '
', + 'title' => esc_html__( 'Simple Page Ordering', 'simple-page-ordering' ), + 'content' => sprintf( + '%s
%s', + esc_html__( 'To reposition an item, simply drag and drop the row by "clicking and holding" it anywhere (outside of the links and form controls) and moving it to its new position.', 'simple-page-ordering' ), + get_query_var( 'post_type' ), + esc_html__( 'Reset post order', 'simple-page-ordering' ) + ), ) ); } @@ -185,14 +191,12 @@ public static function ajax_simple_page_ordering() { die( - 1 ); } - // do we have a nonce that verifies? - if ( empty( $_POST['_wpnonce'] ) || empty( $_POST['screen_id'] ) ) { - // no nonce to verify... + $nonce = isset( $_POST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ) : ''; + + if ( ! wp_verify_nonce( $nonce, 'simple-page-ordering-nonce' ) ) { die( -1 ); } - check_admin_referer( 'simple-page-ordering_' . sanitize_key( $_POST['screen_id'] ) ); - $post_id = empty( $_POST['id'] ) ? false : (int) $_POST['id']; $previd = empty( $_POST['previd'] ) ? false : (int) $_POST['previd']; $nextid = empty( $_POST['nextid'] ) ? false : (int) $_POST['nextid']; @@ -219,6 +223,38 @@ public static function ajax_simple_page_ordering() { die( wp_json_encode( $result ) ); } + /** + * Page ordering reset ajax callback + * + * @return void + */ + public static function ajax_reset_simple_page_ordering() { + global $wpdb; + + $nonce = isset( $_POST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ) : ''; + + if ( ! wp_verify_nonce( $nonce, 'simple-page-ordering-nonce' ) ) { + die( -1 ); + } + + // check and make sure we have what we need + $post_type = isset( $_POST['post_type'] ) ? sanitize_text_field( wp_unslash( $_POST['post_type'] ) ) : ''; + + if ( empty( $post_type ) ) { + die( -1 ); + } + + // does user have the right to manage these post objects? + if ( ! self::check_edit_others_caps( $post_type ) ) { + die( -1 ); + } + + // reset the order of all posts of given post type + $wpdb->update( 'wp_posts', array( 'menu_order' => 0 ), array( 'post_type' => $post_type ), array( '%d' ), array( '%s' ) ); + + die( 0 ); + } + /** * Page ordering function * diff --git a/tests/cypress/integration/page-ordering.test.js b/tests/cypress/integration/page-ordering.test.js index b346bf1..9c36585 100644 --- a/tests/cypress/integration/page-ordering.test.js +++ b/tests/cypress/integration/page-ordering.test.js @@ -40,4 +40,15 @@ describe('Test Page Order Change', () => { firstText.should('have.text', $el.text()); }); }); + + // Reset page ordering state. + after( () => { + cy.login(); + cy.visit('/wp-admin/edit.php?post_type=page'); + + const firstRow = '.wp-list-table tbody tr:nth-child(1)'; + const secondRow = '.wp-list-table tbody tr:nth-child(2)'; + + cy.get( firstRow ).drag( secondRow ); + } ); }); diff --git a/tests/cypress/integration/reset-page-ordering.test.js b/tests/cypress/integration/reset-page-ordering.test.js new file mode 100644 index 0000000..7e50316 --- /dev/null +++ b/tests/cypress/integration/reset-page-ordering.test.js @@ -0,0 +1,45 @@ +describe( 'Test Reset Page Order Change', () => { + it( 'Can reset pages order', () => { + cy.login(); + cy.visit('/wp-admin/edit.php?post_type=page'); + + const firstRow = '.wp-list-table tbody tr:nth-child(1)'; + const secondRow = '.wp-list-table tbody tr:nth-child(2)'; + + // Alias titles as `firstRowText` and `secondRowText` for convenience. + cy.get( firstRow ).find( '.row-title' ).invoke( 'text' ).as( 'firstRowText' ); + cy.get( secondRow ).find( '.row-title' ).invoke( 'text' ).as( 'secondRowText' ); + + // Swap position of `Page 1` with `Page 2`. + cy.get( firstRow ).drag( secondRow ); + + // Verifies if 1st row has title `Page 2`. + cy.get( firstRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) { + expect( text ).to.eq( this.secondRowText ); + } ); + + // Verifies if 2nd row has title `Page 1`. + cy.get( secondRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) { + expect( text ).to.eq( this.firstRowText ); + } ); + + // Now reset the page order and verify original values are back. + cy.get( '#contextual-help-link' ).click(); + cy.get( '#tab-link-simple_page_ordering_help_tab' ).click(); + cy.get( '#simple-page-ordering-reset' ).click(); + cy.on( 'window:confirm', () => true ); + + // Perform a reload as Cypress won't after window:confirm. + cy.reload(); + + // Verifies if 1st row has title `Page 1`. + cy.get( firstRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) { + expect( text ).to.eq( this.firstRowText ); + } ); + + // Verifies if 2nd row has title `Page 2`. + cy.get( secondRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) { + expect( text ).to.eq( this.secondRowText ); + } ); + } ); +} );