How can I refresh the wp-admin/edit.php
page after a user clicks Update in the Quick-edit form?
-
Just add a js click handler to the link/button from within a custom plugin.– kaiserCommented Sep 14, 2012 at 18:53
-
It has to occur after the ajax call, otherwise the update will have no affect.– getWeberForStackExchangeCommented Sep 14, 2012 at 22:37
-
Then add your event handler after the ajax call happened.– kaiserCommented Sep 15, 2012 at 1:27
2 Answers
We have to intercept the Ajax end point of that action. The file wp-admin/admin-ajax.php
has all the possible hooks in the $core_actions_post
array.
The function wpse_65157_ajax_inline_save()
is a copy of the Core's, with a "force reload" script printed at the end. It has to be with Javascript, as wp_redirect()
doesn't work.
add_action( 'wp_ajax_inline-save', 'wpse_65157_ajax_inline_save' , 0 );
/**
Copy of the function wp_ajax_inline_save()
http://core.trac.wordpress.org/browser/tags/3.4.2/wp-admin/includes/ajax-actions.php#L1315
Only Modification marked at the end of the function with INTERCEPT
*/
function wpse_65157_ajax_inline_save()
{
global $wp_list_table;
check_ajax_referer( 'inlineeditnonce', '_inline_edit' );
if ( ! isset($_POST['post_ID']) || ! ( $post_ID = (int) $_POST['post_ID'] ) )
wp_die();
if ( 'page' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_ID ) )
wp_die( __( 'You are not allowed to edit this page.' ) );
} else {
if ( ! current_user_can( 'edit_post', $post_ID ) )
wp_die( __( 'You are not allowed to edit this post.' ) );
}
set_current_screen( $_POST['screen'] );
if ( $last = wp_check_post_lock( $post_ID ) ) {
$last_user = get_userdata( $last );
$last_user_name = $last_user ? $last_user->display_name : __( 'Someone' );
printf( $_POST['post_type'] == 'page' ? __( 'Saving is disabled: %s is currently editing this page.' ) : __( 'Saving is disabled: %s is currently editing this post.' ), esc_html( $last_user_name ) );
wp_die();
}
$data = &$_POST;
$post = get_post( $post_ID, ARRAY_A );
$post = add_magic_quotes($post); //since it is from db
$data['content'] = $post['post_content'];
$data['excerpt'] = $post['post_excerpt'];
// rename
$data['user_ID'] = $GLOBALS['user_ID'];
if ( isset($data['post_parent']) )
$data['parent_id'] = $data['post_parent'];
// status
if ( isset($data['keep_private']) && 'private' == $data['keep_private'] )
$data['post_status'] = 'private';
else
$data['post_status'] = $data['_status'];
if ( empty($data['comment_status']) )
$data['comment_status'] = 'closed';
if ( empty($data['ping_status']) )
$data['ping_status'] = 'closed';
// update the post
edit_post();
$wp_list_table = _get_list_table('WP_Posts_List_Table');
$mode = $_POST['post_view'];
$wp_list_table->display_rows( array( get_post( $_POST['post_ID'] ) ) );
// INTERCEPT: Check if it is our post_type, if not, do nothing
if( 'post' == $_POST['post_type'] )
{
?>
<script type="text/javascript">
document.location.reload(true);
</script>
<?php
}
// end INTERCEPT
wp_die();
}
Reference Q&A: How to enable comments for pending and draft posts?
I dug through WordPress' wp-admin/js/inline-edit-post-dev.js
and found that there aren't any hooks for executing JS code after the quick-edit update.
I decided to override the inlineEditPost.save
function from wp-admin/js/inline-edit-post-dev.js
, similar to how WordPress recommends updating form data when the quick edit form is displayed (which overrides inlineEditPost.edit
).
The full function can be found in wp-admin/js/inline-edit-post-dev.js
. I just changed the callback function in the post call to reload the page instead of hiding the quick edit form.
(function($) {
inlineEditPost.save = function(id) {
//...
// make ajax request
$.post( ajaxurl, params,
function(r) {
location.reload();
}
, 'html');
//...
}
})(jQuery);
-
If anybody has a better suggestion, please post! Commented Sep 14, 2012 at 18:40
-
Much probably the first downvote was for the same reason: modifying the core is not considered a good answer... Commented Dec 1, 2012 at 17:29