Вход Регистрация
Файл: wordpress/wp-admin/includes/misc.php
Строк: 1001
<?php
/**
 * Misc WordPress Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Returns whether the server is running Apache with the mod_rewrite module loaded.
 *
 * @since 2.0.0
 *
 * @return bool
 */
function got_mod_rewrite() {
    
$got_rewrite apache_mod_loaded('mod_rewrite'true);

    
/**
     * Filter whether Apache and mod_rewrite are present.
     *
     * This filter was previously used to force URL rewriting for other servers,
     * like nginx. Use the got_url_rewrite filter in got_url_rewrite() instead.
     *
     * @since 2.5.0
     *
     * @see got_url_rewrite()
     *
     * @param bool $got_rewrite Whether Apache and mod_rewrite are present.
     */
    
return apply_filters'got_rewrite'$got_rewrite );
}

/**
 * Returns whether the server supports URL rewriting.
 *
 * Detects Apache's mod_rewrite, IIS 7.0+ permalink support, and nginx.
 *
 * @since 3.7.0
 *
 * @return bool Whether the server supports URL rewriting.
 */
function got_url_rewrite() {
    
$got_url_rewrite = ( got_mod_rewrite() || $GLOBALS['is_nginx'] || iis7_supports_permalinks() );

    
/**
     * Filter whether URL rewriting is available.
     *
     * @since 3.7.0
     *
     * @param bool $got_url_rewrite Whether URL rewriting is available.
     */
    
return apply_filters'got_url_rewrite'$got_url_rewrite );
}

/**
 * {@internal Missing Short Description}}
 *
 * @since 1.5.0
 *
 * @param string $filename
 * @param string $marker
 * @return array An array of strings from a file (.htaccess ) from between BEGIN and END markers.
 */
function extract_from_markers$filename$marker ) {
    
$result = array ();

    if (!
file_exists$filename ) ) {
        return 
$result;
    }

    if ( 
$markerdata explode"n"implode''file$filename ) ) ));
    {
        
$state false;
        foreach ( 
$markerdata as $markerline ) {
            if (
strpos($markerline'# END ' $marker) !== false)
                
$state false;
            if ( 
$state )
                
$result[] = $markerline;
            if (
strpos($markerline'# BEGIN ' $marker) !== false)
                
$state true;
        }
    }

    return 
$result;
}

/**
 * {@internal Missing Short Description}}
 *
 * Inserts an array of strings into a file (.htaccess ), placing it between
 * BEGIN and END markers. Replaces existing marked info. Retains surrounding
 * data. Creates file if none exists.
 *
 * @since 1.5.0
 *
 * @param string $filename
 * @param string $marker
 * @param array  $insertion
 * @return bool True on write success, false on failure.
 */
function insert_with_markers$filename$marker$insertion ) {
    if (!
file_exists$filename ) || is_writeable$filename ) ) {
        if (!
file_exists$filename ) ) {
            
$markerdata '';
        } else {
            
$markerdata explode"n"implode''file$filename ) ) );
        }

        if ( !
$f = @fopen$filename'w' ) )
            return 
false;

        
$foundit false;
        if ( 
$markerdata ) {
            
$state true;
            foreach ( 
$markerdata as $n => $markerline ) {
                if (
strpos($markerline'# BEGIN ' $marker) !== false)
                    
$state false;
                if ( 
$state ) {
                    if ( 
$n count$markerdata ) )
                        
fwrite$f"{$markerline}n" );
                    else
                        
fwrite$f"{$markerline});
                }
                if (
strpos($markerline'# END ' $marker) !== false) {
                    
fwrite$f"# BEGIN {$marker}n" );
                    if ( 
is_array$insertion ))
                        foreach ( 
$insertion as $insertline )
                            
fwrite$f"{$insertline}n" );
                    
fwrite$f"# END {$marker}n" );
                    
$state true;
                    
$foundit true;
                }
            }
        }
        if (!
$foundit) {
            
fwrite$f"n# BEGIN {$marker}n" );
            foreach ( 
$insertion as $insertline )
                
fwrite$f"{$insertline}n" );
            
fwrite$f"# END {$marker}n" );
        }
        
fclose$f );
        return 
true;
    } else {
        return 
false;
    }
}

/**
 * Updates the htaccess file with the current rules if it is writable.
 *
 * Always writes to the file if it exists and is writable to ensure that we
 * blank out old rules.
 *
 * @since 1.5.0
 */
function save_mod_rewrite_rules() {
    if ( 
is_multisite() )
        return;

    global 
$wp_rewrite;

    
$home_path get_home_path();
    
$htaccess_file $home_path.'.htaccess';

    
/*
     * If the file doesn't already exist check for write access to the directory
     * and whether we have some rules. Else check for write access to the file.
     */
    
if ((!file_exists($htaccess_file) && is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks()) || is_writable($htaccess_file)) {
        if ( 
got_mod_rewrite() ) {
            
$rules explode"n"$wp_rewrite->mod_rewrite_rules() );
            return 
insert_with_markers$htaccess_file'WordPress'$rules );
        }
    }

    return 
false;
}

/**
 * Updates the IIS web.config file with the current rules if it is writable.
 * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file.
 *
 * @since 2.8.0
 *
 * @return bool True if web.config was updated successfully
 */
function iis7_save_url_rewrite_rules(){
    if ( 
is_multisite() )
        return;

    global 
$wp_rewrite;

    
$home_path get_home_path();
    
$web_config_file $home_path 'web.config';

    
// Using win_is_writable() instead of is_writable() because of a bug in Windows PHP
    
if ( iis7_supports_permalinks() && ( ( ! file_exists($web_config_file) && win_is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks() ) || win_is_writable($web_config_file) ) ) {
        
$rule $wp_rewrite->iis7_url_rewrite_rules(false'''');
        if ( ! empty(
$rule) ) {
            return 
iis7_add_rewrite_rule($web_config_file$rule);
        } else {
            return 
iis7_delete_rewrite_rule($web_config_file);
        }
    }
    return 
false;
}

/**
 * {@internal Missing Short Description}}
 *
 * @since 1.5.0
 *
 * @param string $file
 */
function update_recently_edited$file ) {
    
$oldfiles = (array ) get_option'recently_edited' );
    if ( 
$oldfiles ) {
        
$oldfiles array_reverse$oldfiles );
        
$oldfiles[] = $file;
        
$oldfiles array_reverse$oldfiles );
        
$oldfiles array_unique$oldfiles );
        if ( 
count$oldfiles ))
            
array_pop$oldfiles );
    } else {
        
$oldfiles[] = $file;
    }
    
update_option'recently_edited'$oldfiles );
}

/**
 * If siteurl, home or page_on_front changed, flush rewrite rules.
 *
 * @since 2.1.0
 *
 * @param string $old_value
 * @param string $value
 */
function update_home_siteurl$old_value$value ) {
    if ( 
defined"WP_INSTALLING" ) )
        return;

    
// If home changed, write rewrite rules to new location.
    
flush_rewrite_rules();
}

add_action'update_option_home''update_home_siteurl'10);
add_action'update_option_siteurl''update_home_siteurl'10);
add_action'update_option_page_on_front''update_home_siteurl'10);

/**
 * Shorten an URL, to be used as link text
 *
 * @since 1.2.0
 *
 * @param string $url
 * @return string
 */
function url_shorten$url ) {
    
$short_url str_replace( array( 'http://''www.' ), ''$url );
    
$short_url untrailingslashit$short_url );
    if ( 
strlen$short_url ) > 35 )
        
$short_url substr$short_url032 ) . '&hellip;';
    return 
$short_url;
}

/**
 * Resets global variables based on $_GET and $_POST
 *
 * This function resets global variables based on the names passed
 * in the $vars array to the value of $_POST[$var] or $_GET[$var] or ''
 * if neither is defined.
 *
 * @since 2.0.0
 *
 * @param array $vars An array of globals to reset.
 */
function wp_reset_vars$vars ) {
    foreach ( 
$vars as $var ) {
        if ( empty( 
$_POST$var ] ) ) {
            if ( empty( 
$_GET$var ] ) ) {
                
$GLOBALS$var ] = '';
            } else {
                
$GLOBALS$var ] = $_GET$var ];
            }
        } else {
            
$GLOBALS$var ] = $_POST$var ];
        }
    }
}

/**
 * {@internal Missing Short Description}}
 *
 * @since 2.1.0
 *
 * @param string|WP_Error $message
 */
function show_message($message) {
    if ( 
is_wp_error($message) ){
        if ( 
$message->get_error_data() && is_string$message->get_error_data() ) )
            
$message $message->get_error_message() . ': ' $message->get_error_data();
        else
            
$message $message->get_error_message();
    }
    echo 
"<p>$message</p>n";
    
wp_ob_end_flush_all();
    
flush();
}

function 
wp_doc_link_parse$content ) {
    if ( !
is_string$content ) || empty( $content ) )
        return array();

    if ( !
function_exists('token_get_all') )
        return array();

    
$tokens token_get_all$content );
    
$count count$tokens );
    
$functions = array();
    
$ignore_functions = array();
    for ( 
$t 0$t $count 2$t++ ) {
        if ( ! 
is_array$tokens$t ] ) ) {
            continue;
        }

        if ( 
T_STRING == $tokens$t ][0] && ( '(' == $tokens$t ] || '(' == $tokens$t ] ) ) {
            
// If it's a function or class defined locally, there's not going to be any docs available
            
if ( ( isset( $tokens$t ][1] ) && in_array$tokens$t ][1], array( 'function''class' ) ) ) || ( isset( $tokens$t ][0] ) && T_OBJECT_OPERATOR == $tokens$t ][0] ) ) {
                
$ignore_functions[] = $tokens[$t][1];
            }
            
// Add this to our stack of unique references
            
$functions[] = $tokens[$t][1];
        }
    }

    
$functions array_unique$functions );
    
sort$functions );

    
/**
     * Filter the list of functions and classes to be ignored from the documentation lookup.
     *
     * @since 2.8.0
     *
     * @param array $ignore_functions Functions and classes to be ignored.
     */
    
$ignore_functions apply_filters'documentation_ignore_functions'$ignore_functions );

    
$ignore_functions array_unique$ignore_functions );

    
$out = array();
    foreach ( 
$functions as $function ) {
        if ( 
in_array$function$ignore_functions ) )
            continue;
        
$out[] = $function;
    }

    return 
$out;
}

/**
 * Saves option for number of rows when listing posts, pages, comments, etc.
 *
 * @since 2.8.0
 */
function set_screen_options() {

    if ( isset(
$_POST['wp_screen_options']) && is_array($_POST['wp_screen_options']) ) {
        
check_admin_referer'screen-options-nonce''screenoptionnonce' );

        if ( !
$user wp_get_current_user() )
            return;
        
$option $_POST['wp_screen_options']['option'];
        
$value $_POST['wp_screen_options']['value'];

        if ( 
$option != sanitize_key$option ) )
            return;

        
$map_option $option;
        
$type str_replace('edit_'''$map_option);
        
$type str_replace('_per_page'''$type);
        if ( 
in_array$typeget_taxonomies() ) )
            
$map_option 'edit_tags_per_page';
        elseif ( 
in_array$typeget_post_types() ) )
            
$map_option 'edit_per_page';
        else
            
$option str_replace('-''_'$option);

        switch ( 
$map_option ) {
            case 
'edit_per_page':
            case 
'users_per_page':
            case 
'edit_comments_per_page':
            case 
'upload_per_page':
            case 
'edit_tags_per_page':
            case 
'plugins_per_page':
            
// Network admin
            
case 'sites_network_per_page':
            case 
'users_network_per_page':
            case 
'site_users_network_per_page':
            case 
'plugins_network_per_page':
            case 
'themes_network_per_page':
            case 
'site_themes_network_per_page':
                
$value = (int) $value;
                if ( 
$value || $value 999 )
                    return;
                break;
            default:

                
/**
                 * Filter a screen option value before it is set.
                 *
                 * The filter can also be used to modify non-standard [items]_per_page
                 * settings. See the parent function for a full list of standard options.
                 *
                 * Returning false to the filter will skip saving the current option.
                 *
                 * @since 2.8.0
                 *
                 * @see set_screen_options()
                 *
                 * @param bool|int $value  Screen option value. Default false to skip.
                 * @param string   $option The option name.
                 * @param int      $value  The number of rows to use.
                 */
                
$value apply_filters'set-screen-option'false$option$value );

                if ( 
false === $value )
                    return;
                break;
        }

        
update_user_meta($user->ID$option$value);
        
wp_safe_redirectremove_query_arg( array('pagenum''apage''paged'), wp_get_referer() ) );
        exit;
    }
}

/**
 * Check if rewrite rule for WordPress already exists in the IIS 7+ configuration file
 *
 * @since 2.8.0
 *
 * @return bool
 * @param string $filename The file path to the configuration file
 */
function iis7_rewrite_rule_exists($filename) {
    if ( ! 
file_exists($filename) )
        return 
false;
    if ( ! 
class_exists('DOMDocument') )
        return 
false;

    
$doc = new DOMDocument();
    if ( 
$doc->load($filename) === false )
        return 
false;
    
$xpath = new DOMXPath($doc);
    
$rules $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,'wordpress')]');
    if ( 
$rules->length == )
        return 
false;
    else
        return 
true;
}

/**
 * Delete WordPress rewrite rule from web.config file if it exists there
 *
 * @since 2.8.0
 *
 * @param string $filename Name of the configuration file
 * @return bool
 */
function iis7_delete_rewrite_rule($filename) {
    
// If configuration file does not exist then rules also do not exist so there is nothing to delete
    
if ( ! file_exists($filename) )
        return 
true;

    if ( ! 
class_exists('DOMDocument') )
        return 
false;

    
$doc = new DOMDocument();
    
$doc->preserveWhiteSpace false;

    if ( 
$doc -> load($filename) === false )
        return 
false;
    
$xpath = new DOMXPath($doc);
    
$rules $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,'wordpress')]');
    if ( 
$rules->length ) {
        
$child $rules->item(0);
        
$parent $child->parentNode;
        
$parent->removeChild($child);
        
$doc->formatOutput true;
        
saveDomDocument($doc$filename);
    }
    return 
true;
}

/**
 * Add WordPress rewrite rule to the IIS 7+ configuration file.
 *
 * @since 2.8.0
 *
 * @param string $filename The file path to the configuration file
 * @param string $rewrite_rule The XML fragment with URL Rewrite rule
 * @return bool
 */
function iis7_add_rewrite_rule($filename$rewrite_rule) {
    if ( ! 
class_exists('DOMDocument') )
        return 
false;

    
// If configuration file does not exist then we create one.
    
if ( ! file_exists($filename) ) {
        
$fp fopen$filename'w');
        
fwrite($fp'<configuration/>');
        
fclose($fp);
    }

    
$doc = new DOMDocument();
    
$doc->preserveWhiteSpace false;

    if ( 
$doc->load($filename) === false )
        return 
false;

    
$xpath = new DOMXPath($doc);

    
// First check if the rule already exists as in that case there is no need to re-add it
    
$wordpress_rules $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,'wordpress')]');
    if ( 
$wordpress_rules->length )
        return 
true;

    
// Check the XPath to the rewrite rule and create XML nodes if they do not exist
    
$xmlnodes $xpath->query('/configuration/system.webServer/rewrite/rules');
    if ( 
$xmlnodes->length ) {
        
$rules_node $xmlnodes->item(0);
    } else {
        
$rules_node $doc->createElement('rules');

        
$xmlnodes $xpath->query('/configuration/system.webServer/rewrite');
        if ( 
$xmlnodes->length ) {
            
$rewrite_node $xmlnodes->item(0);
            
$rewrite_node->appendChild($rules_node);
        } else {
            
$rewrite_node $doc->createElement('rewrite');
            
$rewrite_node->appendChild($rules_node);

            
$xmlnodes $xpath->query('/configuration/system.webServer');
            if ( 
$xmlnodes->length ) {
                
$system_webServer_node $xmlnodes->item(0);
                
$system_webServer_node->appendChild($rewrite_node);
            } else {
                
$system_webServer_node $doc->createElement('system.webServer');
                
$system_webServer_node->appendChild($rewrite_node);

                
$xmlnodes $xpath->query('/configuration');
                if ( 
$xmlnodes->length ) {
                    
$config_node $xmlnodes->item(0);
                    
$config_node->appendChild($system_webServer_node);
                } else {
                    
$config_node $doc->createElement('configuration');
                    
$doc->appendChild($config_node);
                    
$config_node->appendChild($system_webServer_node);
                }
            }
        }
    }

    
$rule_fragment $doc->createDocumentFragment();
    
$rule_fragment->appendXML($rewrite_rule);
    
$rules_node->appendChild($rule_fragment);

    
$doc->encoding "UTF-8";
    
$doc->formatOutput true;
    
saveDomDocument($doc$filename);

    return 
true;
}

/**
 * Saves the XML document into a file
 *
 * @since 2.8.0
 *
 * @param DOMDocument $doc
 * @param string $filename
 */
function saveDomDocument($doc$filename) {
    
$config $doc->saveXML();
    
$config preg_replace("/([^r])n/""$1rn"$config);
    
$fp fopen($filename'w');
    
fwrite($fp$config);
    
fclose($fp);
}

/**
 * Display the default admin color scheme picker (Used in user-edit.php)
 *
 * @since 3.0.0
 */
function admin_color_scheme_picker$user_id ) {
    global 
$_wp_admin_css_colors;

    
ksort$_wp_admin_css_colors );

    if ( isset( 
$_wp_admin_css_colors['fresh'] ) ) {
        
// Set Default ('fresh') and Light should go first.
        
$_wp_admin_css_colors array_filterarray_merge( array( 'fresh' => '''light' => '' ), $_wp_admin_css_colors ) );
    }

    
$current_color get_user_option'admin_color'$user_id );

    if ( empty( 
$current_color ) || ! isset( $_wp_admin_css_colors$current_color ] ) ) {
        
$current_color 'fresh';
    }

    
?>
    <fieldset id="color-picker" class="scheme-list">
        <legend class="screen-reader-text"><span><?php _e'Admin Color Scheme' ); ?></span></legend>
        <?php
        wp_nonce_field
'save-color-scheme''color-nonce'false );
        foreach ( 
$_wp_admin_css_colors as $color => $color_info ) :

            
?>
            <div class="color-option <?php echo ( $color == $current_color ) ? 'selected' ''?>">
                <input name="admin_color" id="admin_color_<?php echo esc_attr$color ); ?>" type="radio" value="<?php echo esc_attr$color ); ?>" class="tog" <?php checked$color$current_color ); ?> />
                <input type="hidden" class="css_url" value="<?php echo esc_url$color_info->url ); ?>" />
                <input type="hidden" class="icon_colors" value="<?php echo esc_attrwp_json_encode( array( 'icons' => $color_info->icon_colors ) ) ); ?>" />
                <label for="admin_color_<?php echo esc_attr$color ); ?>"><?php echo esc_html$color_info->name ); ?></label>
                <table class="color-palette">
                    <tr>
                    <?php

                    
foreach ( $color_info->colors as $html_color ) {
                        
?>
                        <td style="background-color: <?php echo esc_attr$html_color ); ?>">&nbsp;</td>
                        <?php
                    
}

                    
?>
                    </tr>
                </table>
            </div>
            <?php

        
endforeach;

    
?>
    </fieldset>
    <?php
}

function 
wp_color_scheme_settings() {
    global 
$_wp_admin_css_colors;

    
$color_scheme get_user_option'admin_color' );

    
// It's possible to have a color scheme set that is no longer registered.
    
if ( empty( $_wp_admin_css_colors$color_scheme ] ) ) {
        
$color_scheme 'fresh';
    }

    if ( ! empty( 
$_wp_admin_css_colors$color_scheme ]->icon_colors ) ) {
        
$icon_colors $_wp_admin_css_colors$color_scheme ]->icon_colors;
    } elseif ( ! empty( 
$_wp_admin_css_colors['fresh']->icon_colors ) ) {
        
$icon_colors $_wp_admin_css_colors['fresh']->icon_colors;
    } else {
        
// Fall back to the default set of icon colors if the default scheme is missing.
        
$icon_colors = array( 'base' => '#999''focus' => '#00a0d2''current' => '#fff' );
    }

    echo 
'<script type="text/javascript">var _wpColorScheme = ' wp_json_encode( array( 'icons' => $icon_colors ) ) . ";</script>n";
}
add_action'admin_head''wp_color_scheme_settings' );

function 
_ipad_meta() {
    if ( 
wp_is_mobile() ) {
        
?>
        <meta name="viewport" id="viewport-meta" content="width=device-width, initial-scale=1">
        <?php
    
}
}
add_action('admin_head''_ipad_meta');

/**
 * Check lock status for posts displayed on the Posts screen
 *
 * @since 3.6.0
 */
function wp_check_locked_posts$response$data$screen_id ) {
    
$checked = array();

    if ( 
array_key_exists'wp-check-locked-posts'$data ) && is_array$data['wp-check-locked-posts'] ) ) {
        foreach ( 
$data['wp-check-locked-posts'] as $key ) {
            if ( ! 
$post_id absintsubstr$key) ) )
                continue;

            if ( ( 
$user_id wp_check_post_lock$post_id ) ) && ( $user get_userdata$user_id ) ) && current_user_can'edit_post'$post_id ) ) {
                
$send = array( 'text' => sprintf__'%s is currently editing' ), $user->display_name ) );

                if ( ( 
$avatar get_avatar$user->ID18 ) ) && preg_match"|src='([^']+)'|"$avatar$matches ) )
                    
$send['avatar_src'] = $matches[1];

                
$checked[$key] = $send;
            }
        }
    }

    if ( ! empty( 
$checked ) )
        
$response['wp-check-locked-posts'] = $checked;

    return 
$response;
}
add_filter'heartbeat_received''wp_check_locked_posts'10);

/**
 * Check lock status on the New/Edit Post screen and refresh the lock
 *
 * @since 3.6.0
 */
function wp_refresh_post_lock$response$data$screen_id ) {
    if ( 
array_key_exists'wp-refresh-post-lock'$data ) ) {
        
$received $data['wp-refresh-post-lock'];
        
$send = array();

        if ( ! 
$post_id absint$received['post_id'] ) )
            return 
$response;

        if ( ! 
current_user_can('edit_post'$post_id) )
            return 
$response;

        if ( ( 
$user_id wp_check_post_lock$post_id ) ) && ( $user get_userdata$user_id ) ) ) {
            
$error = array(
                
'text' => sprintf__'%s has taken over and is currently editing.' ), $user->display_name )
            );

            if ( 
$avatar get_avatar$user->ID64 ) ) {
                if ( 
preg_match"|src='([^']+)'|"$avatar$matches ) )
                    
$error['avatar_src'] = $matches[1];
            }

            
$send['lock_error'] = $error;
        } else {
            if ( 
$new_lock wp_set_post_lock$post_id ) )
                
$send['new_lock'] = implode':'$new_lock );
        }

        
$response['wp-refresh-post-lock'] = $send;
    }

    return 
$response;
}
add_filter'heartbeat_received''wp_refresh_post_lock'10);

/**
 * Check nonce expiration on the New/Edit Post screen and refresh if needed
 *
 * @since 3.6.0
 */
function wp_refresh_post_nonces$response$data$screen_id ) {
    if ( 
array_key_exists'wp-refresh-post-nonces'$data ) ) {
        
$received $data['wp-refresh-post-nonces'];
        
$response['wp-refresh-post-nonces'] = array( 'check' => );

        if ( ! 
$post_id absint$received['post_id'] ) )
            return 
$response;

        if ( ! 
current_user_can'edit_post'$post_id ) || empty( $received['post_nonce'] ) )
            return 
$response;

        if ( 
=== wp_verify_nonce$received['post_nonce'], 'update-post_' $post_id ) ) {
            
$response['wp-refresh-post-nonces'] = array(
                
'replace' => array(
                    
'getpermalinknonce' => wp_create_nonce('getpermalink'),
                    
'samplepermalinknonce' => wp_create_nonce('samplepermalink'),
                    
'closedpostboxesnonce' => wp_create_nonce('closedpostboxes'),
                    
'_ajax_linking_nonce' => wp_create_nonce'internal-linking' ),
                    
'_wpnonce' => wp_create_nonce'update-post_' $post_id ),
                ),
                
'heartbeatNonce' => wp_create_nonce'heartbeat-nonce' ),
            );
        }
    }

    return 
$response;
}
add_filter'heartbeat_received''wp_refresh_post_nonces'10);

/**
 * Disable suspension of Heartbeat on the Add/Edit Post screens.
 *
 * @since 3.8.0
 *
 * @param array $settings An array of Heartbeat settings.
 * @return array Filtered Heartbeat settings.
 */
function wp_heartbeat_set_suspension$settings ) {
    global 
$pagenow;

    if ( 
'post.php' === $pagenow || 'post-new.php' === $pagenow ) {
        
$settings['suspension'] = 'disable';
    }

    return 
$settings;
}
add_filter'heartbeat_settings''wp_heartbeat_set_suspension' );

/**
 * Autosave with heartbeat
 *
 * @since 3.9.0
 */
function heartbeat_autosave$response$data ) {
    if ( ! empty( 
$data['wp_autosave'] ) ) {
        
$saved wp_autosave$data['wp_autosave'] );

        if ( 
is_wp_error$saved ) ) {
            
$response['wp_autosave'] = array( 'success' => false'message' => $saved->get_error_message() );
        } elseif ( empty( 
$saved ) ) {
            
$response['wp_autosave'] = array( 'success' => false'message' => __'Error while saving.' ) );
        } else {
            
/* translators: draft saved date format, see http://php.net/date */
            
$draft_saved_date_format __'g:i:s a' );
            
/* translators: %s: date and time */
            
$response['wp_autosave'] = array( 'success' => true'message' => sprintf__'Draft saved at %s.' ), date_i18n$draft_saved_date_format ) ) );
        }
    }

    return 
$response;
}
// Run later as we have to set DOING_AUTOSAVE for back-compat
add_filter'heartbeat_received''heartbeat_autosave'500);

/**
 * Disables autocomplete on the 'post' form (Add/Edit Post screens) for WebKit browsers,
 * as they disregard the autocomplete setting on the editor textarea. That can break the editor
 * when the user navigates to it with the browser's Back button. See #28037
 *
 * @since 4.0
 */
function post_form_autocomplete_off() {
    global 
$is_safari$is_chrome;

    if ( 
$is_safari || $is_chrome ) {
        echo 
' autocomplete="off"';
    }
}
add_action'post_edit_form_tag''post_form_autocomplete_off' );

/**
 * Remove single-use URL parameters and create canonical link based on new URL.
 *
 * Remove specific query string parameters from a URL, create the canonical link,
 * put it in the admin header, and change the current URL to match.
 *
 * @since 4.2.0
 */
function wp_admin_canonical_url() {
    
$removable_query_args = array(
        
'message''settings-updated''saved',
        
'update''updated''activated',
        
'activate''deactivate''locked',
        
'deleted''trashed''untrashed',
        
'enabled''disabled''skipped',
        
'spammed''unspammed',
    );

    
/**
     * Filter the list of URL parameters to remove.
     *
     * @since 4.2.0
     *
     * @param array $removable_query_args An array of parameters to remove from the URL.
     */
    
$removable_query_args apply_filters'removable_query_args'$removable_query_args );

    if ( empty( 
$removable_query_args ) ) {
        return;
    }

    
// Ensure we're using an absolute URL.
    
$current_url  set_url_scheme'http://' $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
    
$filtered_url remove_query_arg$removable_query_args$current_url );
    
?>
    <link id="wp-admin-canonical" rel="canonical" href="<?php echo esc_url$filtered_url ); ?>" />
    <script>
        if ( window.history.replaceState ) {
            window.history.replaceState( null, null, document.getElementById( 'wp-admin-canonical' ).href + window.location.hash );
        }
    </script>
<?php
}
add_action'admin_head''wp_admin_canonical_url' );
Онлайн: 1
Реклама