: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$comment_list_item = ob_get_clean();
$x = new WP_Ajax_Response();
'what' => 'edit_comment',
'id' => $comment->comment_ID,
'data' => $comment_list_item,
* Handles adding a menu item via AJAX.
function wp_ajax_add_menu_item() {
check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );
if ( ! current_user_can( 'edit_theme_options' ) ) {
require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
* For performance reasons, we omit some object properties from the checklist.
* The following is a hacky way to restore them when adding non-custom items.
$menu_items_data = array();
foreach ( (array) $_POST['menu-item'] as $menu_item_data ) {
! empty( $menu_item_data['menu-item-type'] ) &&
'custom' !== $menu_item_data['menu-item-type'] &&
! empty( $menu_item_data['menu-item-object-id'] )
switch ( $menu_item_data['menu-item-type'] ) {
$_object = get_post( $menu_item_data['menu-item-object-id'] );
case 'post_type_archive':
$_object = get_post_type_object( $menu_item_data['menu-item-object'] );
$_object = get_term( $menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object'] );
$_menu_items = array_map( 'wp_setup_nav_menu_item', array( $_object ) );
$_menu_item = reset( $_menu_items );
// Restore the missing menu item properties.
$menu_item_data['menu-item-description'] = $_menu_item->description;
$menu_items_data[] = $menu_item_data;
$item_ids = wp_save_nav_menu_items( 0, $menu_items_data );
if ( is_wp_error( $item_ids ) ) {
foreach ( (array) $item_ids as $menu_item_id ) {
$menu_obj = get_post( $menu_item_id );
if ( ! empty( $menu_obj->ID ) ) {
$menu_obj = wp_setup_nav_menu_item( $menu_obj );
$menu_obj->title = empty( $menu_obj->title ) ? __( 'Menu Item' ) : $menu_obj->title;
$menu_obj->label = $menu_obj->title; // Don't show "(pending)" in ajax-added items.
$menu_items[] = $menu_obj;
/** This filter is documented in wp-admin/includes/nav-menu.php */
$walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $_POST['menu'] );
if ( ! class_exists( $walker_class_name ) ) {
if ( ! empty( $menu_items ) ) {
'walker' => new $walker_class_name(),
echo walk_nav_menu_tree( $menu_items, 0, (object) $args );
* Handles adding meta via AJAX.
function wp_ajax_add_meta() {
check_ajax_referer( 'add-meta', '_ajax_nonce-add-meta' );
$pid = (int) $_POST['post_id'];
$post = get_post( $pid );
if ( isset( $_POST['metakeyselect'] ) || isset( $_POST['metakeyinput'] ) ) {
if ( ! current_user_can( 'edit_post', $pid ) ) {
if ( isset( $_POST['metakeyselect'] ) && '#NONE#' === $_POST['metakeyselect'] && empty( $_POST['metakeyinput'] ) ) {
// If the post is an autodraft, save the post as a draft and then attempt to save the meta.
if ( 'auto-draft' === $post->post_status ) {
$post_data['action'] = 'draft'; // Warning fix.
$post_data['post_ID'] = $pid;
$post_data['post_type'] = $post->post_type;
$post_data['post_status'] = 'draft';
$post_data['post_title'] = sprintf(
/* translators: 1: Post creation date, 2: Post creation time. */
__( 'Draft created on %1$s at %2$s' ),
gmdate( __( 'F j, Y' ), $now ),
gmdate( __( 'g:i a' ), $now )
$pid = edit_post( $post_data );
if ( is_wp_error( $pid ) ) {
$x = new WP_Ajax_Response(
wp_die( __( 'Please provide a custom field value.' ) );
wp_die( __( 'Please provide a custom field value.' ) );
$meta = get_metadata_by_mid( 'post', $mid );
$pid = (int) $meta->post_id;
$meta = get_object_vars( $meta );
$x = new WP_Ajax_Response(
'data' => _list_meta_row( $meta, $c ),
'supplemental' => array( 'postid' => $pid ),
$mid = (int) key( $_POST['meta'] );
$key = wp_unslash( $_POST['meta'][ $mid ]['key'] );
$value = wp_unslash( $_POST['meta'][ $mid ]['value'] );
if ( '' === trim( $key ) ) {
wp_die( __( 'Please provide a custom field name.' ) );
$meta = get_metadata_by_mid( 'post', $mid );
wp_die( 0 ); // If meta doesn't exist.
is_protected_meta( $meta->meta_key, 'post' ) || is_protected_meta( $key, 'post' ) ||
! current_user_can( 'edit_post_meta', $meta->post_id, $meta->meta_key ) ||
! current_user_can( 'edit_post_meta', $meta->post_id, $key )
if ( $meta->meta_value !== $value || $meta->meta_key !== $key ) {
$u = update_metadata_by_mid( 'post', $mid, $value, $key );
wp_die( 0 ); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
$x = new WP_Ajax_Response(
'data' => _list_meta_row(
'supplemental' => array( 'postid' => $meta->post_id ),
* Handles adding a user via AJAX.
* @param string $action Action to perform.
function wp_ajax_add_user( $action ) {
if ( empty( $action ) ) {
check_ajax_referer( $action );
if ( ! current_user_can( 'create_users' ) ) {
} elseif ( is_wp_error( $user_id ) ) {
$x = new WP_Ajax_Response(
$user_object = get_userdata( $user_id );
$wp_list_table = _get_list_table( 'WP_Users_List_Table' );
$role = current( $user_object->roles );
$x = new WP_Ajax_Response(
'data' => $wp_list_table->single_row( $user_object, '', $role ),
/* translators: %s: The new user. */
'<a href="#user-' . $user_id . '">' . $user_object->user_login . '</a>'
* Handles closed post boxes via AJAX.
function wp_ajax_closed_postboxes() {
check_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' );
$closed = isset( $_POST['closed'] ) ? explode( ',', $_POST['closed'] ) : array();
$closed = array_filter( $closed );
$hidden = isset( $_POST['hidden'] ) ? explode( ',', $_POST['hidden'] ) : array();
$hidden = array_filter( $hidden );
$page = isset( $_POST['page'] ) ? $_POST['page'] : '';
if ( sanitize_key( $page ) !== $page ) {
$user = wp_get_current_user();
if ( is_array( $closed ) ) {
update_user_meta( $user->ID, "closedpostboxes_$page", $closed );
if ( is_array( $hidden ) ) {
// Postboxes that are always shown.
$hidden = array_diff( $hidden, array( 'submitdiv', 'linksubmitdiv', 'manage-menu', 'create-menu' ) );
update_user_meta( $user->ID, "metaboxhidden_$page", $hidden );
* Handles hidden columns via AJAX.
function wp_ajax_hidden_columns() {
check_ajax_referer( 'screen-options-nonce', 'screenoptionnonce' );
$page = isset( $_POST['page'] ) ? $_POST['page'] : '';
if ( sanitize_key( $page ) !== $page ) {
$user = wp_get_current_user();
$hidden = ! empty( $_POST['hidden'] ) ? explode( ',', $_POST['hidden'] ) : array();
update_user_meta( $user->ID, "manage{$page}columnshidden", $hidden );
* Handles updating whether to display the welcome panel via AJAX.
function wp_ajax_update_welcome_panel() {
check_ajax_referer( 'welcome-panel-nonce', 'welcomepanelnonce' );
if ( ! current_user_can( 'edit_theme_options' ) ) {
update_user_meta( get_current_user_id(), 'show_welcome_panel', empty( $_POST['visible'] ) ? 0 : 1 );
* Handles for retrieving menu meta boxes via AJAX.
function wp_ajax_menu_get_metabox() {
if ( ! current_user_can( 'edit_theme_options' ) ) {
require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
if ( isset( $_POST['item-type'] ) && 'post_type' === $_POST['item-type'] ) {
$callback = 'wp_nav_menu_item_post_type_meta_box';
$items = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
} elseif ( isset( $_POST['item-type'] ) && 'taxonomy' === $_POST['item-type'] ) {
$callback = 'wp_nav_menu_item_taxonomy_meta_box';
$items = (array) get_taxonomies( array( 'show_ui' => true ), 'object' );
if ( ! empty( $_POST['item-object'] ) && isset( $items[ $_POST['item-object'] ] ) ) {
$menus_meta_box_object = $items[ $_POST['item-object'] ];
/** This filter is documented in wp-admin/includes/nav-menu.php */
$item = apply_filters( 'nav_menu_meta_box_object', $menus_meta_box_object );
'id' => 'add-' . $item->name,
'title' => $item->labels->name,
$callback( null, $box_args );
$markup = ob_get_clean();
'replace-id' => $type . '-' . $item->name,
* Handles internal linking via AJAX.
function wp_ajax_wp_link_ajax() {
check_ajax_referer( 'internal-linking', '_ajax_linking_nonce' );
if ( isset( $_POST['search'] ) ) {
$args['s'] = wp_unslash( $_POST['search'] );
if ( isset( $_POST['term'] ) ) {
$args['s'] = wp_unslash( $_POST['term'] );
$args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1;
if ( ! class_exists( '_WP_Editors', false ) ) {
require ABSPATH . WPINC . '/class-wp-editor.php';
$results = _WP_Editors::wp_link_query( $args );
if ( ! isset( $results ) ) {
echo wp_json_encode( $results );
* Handles saving menu locations via AJAX.
function wp_ajax_menu_locations_save() {
if ( ! current_user_can( 'edit_theme_options' ) ) {
check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );
if ( ! isset( $_POST['menu-locations'] ) ) {
set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) );
* Handles saving the meta box order via AJAX.
function wp_ajax_meta_box_order() {
check_ajax_referer( 'meta-box-order' );
$order = isset( $_POST['order'] ) ? (array) $_POST['order'] : false;
$page_columns = isset( $_POST['page_columns'] ) ? $_POST['page_columns'] : 'auto';
if ( 'auto' !== $page_columns ) {
$page_columns = (int) $page_columns;
$page = isset( $_POST['page'] ) ? $_POST['page'] : '';
if ( sanitize_key( $page ) !== $page ) {
$user = wp_get_current_user();
update_user_meta( $user->ID, "meta-box-order_$page", $order );