D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
proc
/
self
/
root
/
home
/
vblioqus
/
karachi777.vip
/
in
/
106014
/
900508
/
Filename :
wp-admin.tar
back
Copy
update-core.php 0000644 00000132667 15151241205 0007500 0 ustar 00 <?php /** * Update Core administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; wp_enqueue_style( 'plugin-install' ); wp_enqueue_script( 'plugin-install' ); wp_enqueue_script( 'updates' ); add_thickbox(); if ( is_multisite() && ! is_network_admin() ) { wp_redirect( network_admin_url( 'update-core.php' ) ); exit; } if ( ! current_user_can( 'update_core' ) && ! current_user_can( 'update_themes' ) && ! current_user_can( 'update_plugins' ) && ! current_user_can( 'update_languages' ) ) { wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); } /** * Lists available core updates. * * @since 2.7.0 * * @global string $wp_local_package Locale code of the package. * @global wpdb $wpdb WordPress database abstraction object. * * @param object $update */ function list_core_update( $update ) { global $wp_local_package, $wpdb; static $first_pass = true; $wp_version = wp_get_wp_version(); $version_string = sprintf( '%s–%s', $update->current, get_locale() ); if ( 'en_US' === $update->locale && 'en_US' === get_locale() ) { $version_string = $update->current; } elseif ( 'en_US' === $update->locale && $update->packages->partial && $wp_version === $update->partial_version ) { $updates = get_core_updates(); if ( $updates && 1 === count( $updates ) ) { // If the only available update is a partial builds, it doesn't need a language-specific version string. $version_string = $update->current; } } elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() ) { $version_string = sprintf( '%s–%s', $update->current, $update->locale ); } $current = false; if ( ! isset( $update->response ) || 'latest' === $update->response ) { $current = true; } $message = ''; $form_action = 'update-core.php?action=do-core-upgrade'; $php_version = PHP_VERSION; $mysql_version = $wpdb->db_version(); $show_buttons = true; // Nightly build versions have two hyphens and a commit number. if ( preg_match( '/-\w+-\d+/', $update->current ) ) { // Retrieve the major version number. preg_match( '/^\d+.\d+/', $update->current, $update_major ); /* translators: %s: WordPress version. */ $submit = sprintf( __( 'Update to latest %s nightly' ), $update_major[0] ); } else { /* translators: %s: WordPress version. */ $submit = sprintf( __( 'Update to version %s' ), $version_string ); } if ( 'development' === $update->response ) { $message = __( 'You can update to the latest nightly build manually:' ); } else { if ( $current ) { /* translators: %s: WordPress version. */ $submit = sprintf( __( 'Re-install version %s' ), $version_string ); $form_action = 'update-core.php?action=do-core-reinstall'; } else { $php_compat = version_compare( $php_version, $update->php_version, '>=' ); if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) { $mysql_compat = true; } else { $mysql_compat = version_compare( $mysql_version, $update->mysql_version, '>=' ); } $version_url = sprintf( /* translators: %s: WordPress version. */ esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ), sanitize_title( $update->current ) ); $php_update_message = '</p><p>' . sprintf( /* translators: %s: URL to Update PHP page. */ __( '<a href="%s">Learn more about updating PHP</a>.' ), esc_url( wp_get_update_php_url() ) ); $annotation = wp_get_update_php_annotation(); if ( $annotation ) { $php_update_message .= '</p><p><em>' . $annotation . '</em>'; } if ( ! $mysql_compat && ! $php_compat ) { $message = sprintf( /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */ __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ), $version_url, $update->current, $update->php_version, $update->mysql_version, $php_version, $mysql_version ) . $php_update_message; } elseif ( ! $php_compat ) { $message = sprintf( /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */ __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher. You are running version %4$s.' ), $version_url, $update->current, $update->php_version, $php_version ) . $php_update_message; } elseif ( ! $mysql_compat ) { $message = sprintf( /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */ __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires MySQL version %3$s or higher. You are running version %4$s.' ), $version_url, $update->current, $update->mysql_version, $mysql_version ); } else { $message = sprintf( /* translators: 1: Installed WordPress version number, 2: URL to WordPress release notes, 3: New WordPress version number, including locale if necessary. */ __( 'You can update from WordPress %1$s to <a href="%2$s">WordPress %3$s</a> manually:' ), $wp_version, $version_url, $version_string ); } if ( ! $mysql_compat || ! $php_compat ) { $show_buttons = false; } } } echo '<p>'; echo $message; echo '</p>'; echo '<form method="post" action="' . esc_url( $form_action ) . '" name="upgrade" class="upgrade">'; wp_nonce_field( 'upgrade-core' ); echo '<p>'; echo '<input name="version" value="' . esc_attr( $update->current ) . '" type="hidden" />'; echo '<input name="locale" value="' . esc_attr( $update->locale ) . '" type="hidden" />'; if ( $show_buttons ) { if ( $first_pass ) { submit_button( $submit, $current ? '' : 'primary regular', 'upgrade', false ); $first_pass = false; } else { submit_button( $submit, '', 'upgrade', false ); } } if ( 'en_US' !== $update->locale ) { if ( ! isset( $update->dismissed ) || ! $update->dismissed ) { submit_button( __( 'Hide this update' ), '', 'dismiss', false ); } else { submit_button( __( 'Bring back this update' ), '', 'undismiss', false ); } } echo '</p>'; if ( 'en_US' !== $update->locale && ( ! isset( $wp_local_package ) || $wp_local_package !== $update->locale ) ) { echo '<p class="hint">' . __( 'This localized version contains both the translation and various other localization fixes.' ) . '</p>'; } elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() && ( ! $update->packages->partial && $wp_version === $update->partial_version ) ) { // Partial builds don't need language-specific warnings. echo '<p class="hint">' . sprintf( /* translators: %s: WordPress version. */ __( 'You are about to install WordPress %s <strong>in English (US)</strong>. There is a chance this update will break your translation. You may prefer to wait for the localized version to be released.' ), 'development' !== $update->response ? $update->current : '' ) . '</p>'; } echo '</form>'; } /** * Display dismissed updates. * * @since 2.7.0 */ function dismissed_updates() { $dismissed = get_core_updates( array( 'dismissed' => true, 'available' => false, ) ); if ( $dismissed ) { $show_text = esc_js( __( 'Show hidden updates' ) ); $hide_text = esc_js( __( 'Hide hidden updates' ) ); ?> <script type="text/javascript"> jQuery( function( $ ) { $( '#show-dismissed' ).on( 'click', function() { var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) ); if ( isExpanded ) { $( this ).text( '<?php echo $show_text; ?>' ).attr( 'aria-expanded', 'false' ); } else { $( this ).text( '<?php echo $hide_text; ?>' ).attr( 'aria-expanded', 'true' ); } $( '#dismissed-updates' ).toggle( 'fast' ); }); }); </script> <?php echo '<p class="hide-if-no-js"><button type="button" class="button" id="show-dismissed" aria-expanded="false">' . __( 'Show hidden updates' ) . '</button></p>'; echo '<ul id="dismissed-updates" class="core-updates dismissed">'; foreach ( (array) $dismissed as $update ) { echo '<li>'; list_core_update( $update ); echo '</li>'; } echo '</ul>'; } } /** * Display upgrade WordPress for downloading latest or upgrading automatically form. * * @since 2.7.0 */ function core_upgrade_preamble() { $updates = get_core_updates(); // Include an unmodified $wp_version. require ABSPATH . WPINC . '/version.php'; $is_development_version = preg_match( '/alpha|beta|RC/', $wp_version ); if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) { echo '<h2 class="response">'; _e( 'An updated version of WordPress is available.' ); echo '</h2>'; $message = sprintf( /* translators: 1: Documentation on WordPress backups, 2: Documentation on updating WordPress. */ __( '<strong>Important:</strong> Before updating, please <a href="%1$s">back up your database and files</a>. For help with updates, visit the <a href="%2$s">Updating WordPress</a> documentation page.' ), __( 'https://developer.wordpress.org/advanced-administration/security/backup/' ), __( 'https://wordpress.org/documentation/article/updating-wordpress/' ) ); wp_admin_notice( $message, array( 'type' => 'warning', 'additional_classes' => array( 'inline' ), ) ); } elseif ( $is_development_version ) { echo '<h2 class="response">' . __( 'You are using a development version of WordPress.' ) . '</h2>'; } else { echo '<h2 class="response">' . __( 'You have the latest version of WordPress.' ) . '</h2>'; } echo '<ul class="core-updates">'; foreach ( (array) $updates as $update ) { echo '<li>'; list_core_update( $update ); echo '</li>'; } echo '</ul>'; // Don't show the maintenance mode notice when we are only showing a single re-install option. if ( $updates && ( count( $updates ) > 1 || 'latest' !== $updates[0]->response ) ) { echo '<p>' . __( 'While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, this mode will be deactivated.' ) . '</p>'; } elseif ( ! $updates ) { list( $normalized_version ) = explode( '-', $wp_version ); echo '<p>' . sprintf( /* translators: 1: URL to About screen, 2: WordPress version. */ __( '<a href="%1$s">Learn more about WordPress %2$s</a>.' ), esc_url( self_admin_url( 'about.php' ) ), $normalized_version ) . '</p>'; } dismissed_updates(); } /** * Display WordPress auto-updates settings. * * @since 5.6.0 */ function core_auto_updates_settings() { if ( isset( $_GET['core-major-auto-updates-saved'] ) ) { if ( 'enabled' === $_GET['core-major-auto-updates-saved'] ) { $notice_text = __( 'Automatic updates for all WordPress versions have been enabled. Thank you!' ); wp_admin_notice( $notice_text, array( 'type' => 'success', 'dismissible' => true, ) ); } elseif ( 'disabled' === $_GET['core-major-auto-updates-saved'] ) { $notice_text = __( 'WordPress will only receive automatic security and maintenance releases from now on.' ); wp_admin_notice( $notice_text, array( 'type' => 'success', 'dismissible' => true, ) ); } } require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; $updater = new WP_Automatic_Updater(); // Defaults: $upgrade_dev = get_site_option( 'auto_update_core_dev', 'enabled' ) === 'enabled'; $upgrade_minor = get_site_option( 'auto_update_core_minor', 'enabled' ) === 'enabled'; $upgrade_major = get_site_option( 'auto_update_core_major', 'unset' ) === 'enabled'; $can_set_update_option = true; // WP_AUTO_UPDATE_CORE = true (all), 'beta', 'rc', 'development', 'branch-development', 'minor', false. if ( defined( 'WP_AUTO_UPDATE_CORE' ) ) { if ( false === WP_AUTO_UPDATE_CORE ) { // Defaults to turned off, unless a filter allows it. $upgrade_dev = false; $upgrade_minor = false; $upgrade_major = false; } elseif ( true === WP_AUTO_UPDATE_CORE || in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true ) ) { // ALL updates for core. $upgrade_dev = true; $upgrade_minor = true; $upgrade_major = true; } elseif ( 'minor' === WP_AUTO_UPDATE_CORE ) { // Only minor updates for core. $upgrade_dev = false; $upgrade_minor = true; $upgrade_major = false; } // The UI is overridden by the `WP_AUTO_UPDATE_CORE` constant. $can_set_update_option = false; } if ( $updater->is_disabled() ) { $upgrade_dev = false; $upgrade_minor = false; $upgrade_major = false; /* * The UI is overridden by the `AUTOMATIC_UPDATER_DISABLED` constant * or the `automatic_updater_disabled` filter, * or by `wp_is_file_mod_allowed( 'automatic_updater' )`. * See `WP_Automatic_Updater::is_disabled()`. */ $can_set_update_option = false; } // Is the UI overridden by a plugin using the `allow_major_auto_core_updates` filter? if ( has_filter( 'allow_major_auto_core_updates' ) ) { $can_set_update_option = false; } /** This filter is documented in wp-admin/includes/class-core-upgrader.php */ $upgrade_dev = apply_filters( 'allow_dev_auto_core_updates', $upgrade_dev ); /** This filter is documented in wp-admin/includes/class-core-upgrader.php */ $upgrade_minor = apply_filters( 'allow_minor_auto_core_updates', $upgrade_minor ); /** This filter is documented in wp-admin/includes/class-core-upgrader.php */ $upgrade_major = apply_filters( 'allow_major_auto_core_updates', $upgrade_major ); $auto_update_settings = array( 'dev' => $upgrade_dev, 'minor' => $upgrade_minor, 'major' => $upgrade_major, ); if ( $upgrade_major ) { $wp_version = wp_get_wp_version(); $updates = get_core_updates(); if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) { echo '<p>' . wp_get_auto_update_message() . '</p>'; } } $action_url = self_admin_url( 'update-core.php?action=core-major-auto-updates-settings' ); ?> <p class="auto-update-status"> <?php if ( $updater->is_vcs_checkout( ABSPATH ) ) { _e( 'This site appears to be under version control. Automatic updates are disabled.' ); } elseif ( $upgrade_major ) { _e( 'This site is automatically kept up to date with each new version of WordPress.' ); if ( $can_set_update_option ) { echo '<br />'; printf( '<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-disable">%s</a>', wp_nonce_url( add_query_arg( 'value', 'disable', $action_url ), 'core-major-auto-updates-nonce' ), __( 'Switch to automatic updates for maintenance and security releases only.' ) ); } } elseif ( $upgrade_minor ) { _e( 'This site is automatically kept up to date with maintenance and security releases of WordPress only.' ); if ( $can_set_update_option ) { echo '<br />'; printf( '<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-enable">%s</a>', wp_nonce_url( add_query_arg( 'value', 'enable', $action_url ), 'core-major-auto-updates-nonce' ), __( 'Enable automatic updates for all new versions of WordPress.' ) ); } } else { _e( 'This site will not receive automatic updates for new versions of WordPress.' ); } ?> </p> <?php /** * Fires after the major core auto-update settings. * * @since 5.6.0 * * @param array $auto_update_settings { * Array of core auto-update settings. * * @type bool $dev Whether to enable automatic updates for development versions. * @type bool $minor Whether to enable minor automatic core updates. * @type bool $major Whether to enable major automatic core updates. * } */ do_action( 'after_core_auto_updates_settings', $auto_update_settings ); } /** * Display the upgrade plugins form. * * @since 2.9.0 */ function list_plugin_updates() { $wp_version = wp_get_wp_version(); $cur_wp_version = preg_replace( '/-.*$/', '', $wp_version ); require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; $plugins = get_plugin_updates(); if ( empty( $plugins ) ) { echo '<h2>' . __( 'Plugins' ) . '</h2>'; echo '<p>' . __( 'Your plugins are all up to date.' ) . '</p>'; return; } $form_action = 'update-core.php?action=do-plugin-upgrade'; $core_updates = get_core_updates(); if ( ! isset( $core_updates[0]->response ) || 'latest' === $core_updates[0]->response || 'development' === $core_updates[0]->response || version_compare( $core_updates[0]->current, $cur_wp_version, '=' ) ) { $core_update_version = false; } else { $core_update_version = $core_updates[0]->current; } $plugins_count = count( $plugins ); ?> <h2> <?php printf( '%s <span class="count">(%d)</span>', __( 'Plugins' ), number_format_i18n( $plugins_count ) ); ?> </h2> <p><?php _e( 'The following plugins have new versions available. Check the ones you want to update and then click “Update Plugins”.' ); ?></p> <form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-plugins" class="upgrade"> <?php wp_nonce_field( 'upgrade-core' ); ?> <p><input id="upgrade-plugins" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p> <table class="widefat updates-table" id="update-plugins-table"> <thead> <tr> <td class="manage-column check-column"><input type="checkbox" id="plugins-select-all" /></td> <td class="manage-column"><label for="plugins-select-all"><?php _e( 'Select All' ); ?></label></td> </tr> </thead> <tbody class="plugins"> <?php $auto_updates = array(); if ( wp_is_auto_update_enabled_for_type( 'plugin' ) ) { $auto_updates = (array) get_site_option( 'auto_update_plugins', array() ); $auto_update_notice = ' | ' . wp_get_auto_update_message(); } foreach ( (array) $plugins as $plugin_file => $plugin_data ) { $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true ); $icon = '<span class="dashicons dashicons-admin-plugins"></span>'; $preferred_icons = array( 'svg', '2x', '1x', 'default' ); foreach ( $preferred_icons as $preferred_icon ) { if ( ! empty( $plugin_data->update->icons[ $preferred_icon ] ) ) { $icon = '<img src="' . esc_url( $plugin_data->update->icons[ $preferred_icon ] ) . '" alt="" />'; break; } } // Get plugin compat for running version of WordPress. if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $cur_wp_version, '>=' ) ) { /* translators: %s: WordPress version. */ $compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $cur_wp_version ); } else { /* translators: %s: WordPress version. */ $compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $cur_wp_version ); } // Get plugin compat for updated version of WordPress. if ( $core_update_version ) { if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $core_update_version, '>=' ) ) { /* translators: %s: WordPress version. */ $compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $core_update_version ); } else { /* translators: %s: WordPress version. */ $compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $core_update_version ); } } $requires_php = isset( $plugin_data->update->requires_php ) ? $plugin_data->update->requires_php : null; $compatible_php = is_php_version_compatible( $requires_php ); if ( ! $compatible_php && current_user_can( 'update_php' ) ) { $compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . ' '; $compat .= sprintf( /* translators: %s: URL to Update PHP page. */ __( '<a href="%s">Learn more about updating PHP</a>.' ), esc_url( wp_get_update_php_url() ) ); $annotation = wp_get_update_php_annotation(); if ( $annotation ) { $compat .= '</p><p><em>' . $annotation . '</em>'; } } // Get the upgrade notice for the new plugin version. if ( isset( $plugin_data->update->upgrade_notice ) ) { $upgrade_notice = '<br />' . strip_tags( $plugin_data->update->upgrade_notice ); } else { $upgrade_notice = ''; } $details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data->update->slug . '§ion=changelog&TB_iframe=true&width=640&height=662' ); $details = sprintf( '<a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">%3$s</a>', esc_url( $details_url ), /* translators: 1: Plugin name, 2: Version number. */ esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_data->Name, $plugin_data->update->new_version ) ), /* translators: %s: Plugin version. */ sprintf( __( 'View version %s details.' ), $plugin_data->update->new_version ) ); $checkbox_id = 'checkbox_' . md5( $plugin_file ); ?> <tr> <td class="check-column"> <?php if ( $compatible_php ) : ?> <input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $plugin_file ); ?>" /> <label for="<?php echo $checkbox_id; ?>"> <span class="screen-reader-text"> <?php /* translators: Hidden accessibility text. %s: Plugin name. */ printf( __( 'Select %s' ), $plugin_data->Name ); ?> </span> </label> <?php endif; ?> </td> <td class="plugin-title"><p> <?php echo $icon; ?> <strong><?php echo $plugin_data->Name; ?></strong> <?php printf( /* translators: 1: Plugin version, 2: New version. */ __( 'You have version %1$s installed. Update to %2$s.' ), $plugin_data->Version, $plugin_data->update->new_version ); echo ' ' . $details . $compat; if ( in_array( $plugin_file, $auto_updates, true ) ) { echo $auto_update_notice; } echo $upgrade_notice; ?> </p></td> </tr> <?php } ?> </tbody> <tfoot> <tr> <td class="manage-column check-column"><input type="checkbox" id="plugins-select-all-2" /></td> <td class="manage-column"><label for="plugins-select-all-2"><?php _e( 'Select All' ); ?></label></td> </tr> </tfoot> </table> <p><input id="upgrade-plugins-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p> </form> <?php } /** * Display the upgrade themes form. * * @since 2.9.0 */ function list_theme_updates() { $themes = get_theme_updates(); if ( empty( $themes ) ) { echo '<h2>' . __( 'Themes' ) . '</h2>'; echo '<p>' . __( 'Your themes are all up to date.' ) . '</p>'; return; } $form_action = 'update-core.php?action=do-theme-upgrade'; $themes_count = count( $themes ); ?> <h2> <?php printf( '%s <span class="count">(%d)</span>', __( 'Themes' ), number_format_i18n( $themes_count ) ); ?> </h2> <p><?php _e( 'The following themes have new versions available. Check the ones you want to update and then click “Update Themes”.' ); ?></p> <p> <?php printf( /* translators: %s: Link to documentation on child themes. */ __( '<strong>Please Note:</strong> Any customizations you have made to theme files will be lost. Please consider using <a href="%s">child themes</a> for modifications.' ), __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ) ); ?> </p> <form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-themes" class="upgrade"> <?php wp_nonce_field( 'upgrade-core' ); ?> <p><input id="upgrade-themes" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p> <table class="widefat updates-table" id="update-themes-table"> <thead> <tr> <td class="manage-column check-column"><input type="checkbox" id="themes-select-all" /></td> <td class="manage-column"><label for="themes-select-all"><?php _e( 'Select All' ); ?></label></td> </tr> </thead> <tbody class="plugins"> <?php $auto_updates = array(); if ( wp_is_auto_update_enabled_for_type( 'theme' ) ) { $auto_updates = (array) get_site_option( 'auto_update_themes', array() ); $auto_update_notice = ' | ' . wp_get_auto_update_message(); } foreach ( $themes as $stylesheet => $theme ) { $requires_wp = isset( $theme->update['requires'] ) ? $theme->update['requires'] : null; $requires_php = isset( $theme->update['requires_php'] ) ? $theme->update['requires_php'] : null; $compatible_wp = is_wp_version_compatible( $requires_wp ); $compatible_php = is_php_version_compatible( $requires_php ); $compat = ''; if ( ! $compatible_wp && ! $compatible_php ) { $compat .= '<br />' . __( 'This update does not work with your versions of WordPress and PHP.' ) . ' '; if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) { $compat .= sprintf( /* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */ __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ), esc_url( self_admin_url( 'update-core.php' ) ), esc_url( wp_get_update_php_url() ) ); $annotation = wp_get_update_php_annotation(); if ( $annotation ) { $compat .= '</p><p><em>' . $annotation . '</em>'; } } elseif ( current_user_can( 'update_core' ) ) { $compat .= sprintf( /* translators: %s: URL to WordPress Updates screen. */ __( '<a href="%s">Please update WordPress</a>.' ), esc_url( self_admin_url( 'update-core.php' ) ) ); } elseif ( current_user_can( 'update_php' ) ) { $compat .= sprintf( /* translators: %s: URL to Update PHP page. */ __( '<a href="%s">Learn more about updating PHP</a>.' ), esc_url( wp_get_update_php_url() ) ); $annotation = wp_get_update_php_annotation(); if ( $annotation ) { $compat .= '</p><p><em>' . $annotation . '</em>'; } } } elseif ( ! $compatible_wp ) { $compat .= '<br />' . __( 'This update does not work with your version of WordPress.' ) . ' '; if ( current_user_can( 'update_core' ) ) { $compat .= sprintf( /* translators: %s: URL to WordPress Updates screen. */ __( '<a href="%s">Please update WordPress</a>.' ), esc_url( self_admin_url( 'update-core.php' ) ) ); } } elseif ( ! $compatible_php ) { $compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . ' '; if ( current_user_can( 'update_php' ) ) { $compat .= sprintf( /* translators: %s: URL to Update PHP page. */ __( '<a href="%s">Learn more about updating PHP</a>.' ), esc_url( wp_get_update_php_url() ) ); $annotation = wp_get_update_php_annotation(); if ( $annotation ) { $compat .= '</p><p><em>' . $annotation . '</em>'; } } } $checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) ); ?> <tr> <td class="check-column"> <?php if ( $compatible_wp && $compatible_php ) : ?> <input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" /> <label for="<?php echo $checkbox_id; ?>"> <span class="screen-reader-text"> <?php /* translators: Hidden accessibility text. %s: Theme name. */ printf( __( 'Select %s' ), $theme->display( 'Name' ) ); ?> </span> </label> <?php endif; ?> </td> <td class="plugin-title"><p> <img src="<?php echo esc_url( $theme->get_screenshot() . '?ver=' . $theme->version ); ?>" width="85" height="64" class="updates-table-screenshot" alt="" /> <strong><?php echo $theme->display( 'Name' ); ?></strong> <?php printf( /* translators: 1: Theme version, 2: New version. */ __( 'You have version %1$s installed. Update to %2$s.' ), $theme->display( 'Version' ), $theme->update['new_version'] ); echo ' ' . $compat; if ( in_array( $stylesheet, $auto_updates, true ) ) { echo $auto_update_notice; } ?> </p></td> </tr> <?php } ?> </tbody> <tfoot> <tr> <td class="manage-column check-column"><input type="checkbox" id="themes-select-all-2" /></td> <td class="manage-column"><label for="themes-select-all-2"><?php _e( 'Select All' ); ?></label></td> </tr> </tfoot> </table> <p><input id="upgrade-themes-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p> </form> <?php } /** * Display the update translations form. * * @since 3.7.0 */ function list_translation_updates() { $updates = wp_get_translation_updates(); if ( ! $updates ) { if ( 'en_US' !== get_locale() ) { echo '<h2>' . __( 'Translations' ) . '</h2>'; echo '<p>' . __( 'Your translations are all up to date.' ) . '</p>'; } return; } $form_action = 'update-core.php?action=do-translation-upgrade'; ?> <h2><?php _e( 'Translations' ); ?></h2> <form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-translations" class="upgrade"> <p><?php _e( 'New translations are available.' ); ?></p> <?php wp_nonce_field( 'upgrade-translations' ); ?> <p><input class="button" type="submit" value="<?php esc_attr_e( 'Update Translations' ); ?>" name="upgrade" /></p> </form> <?php } /** * Upgrades WordPress core display. * * @since 2.7.0 * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param bool $reinstall */ function do_core_upgrade( $reinstall = false ) { global $wp_filesystem; require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; if ( $reinstall ) { $url = 'update-core.php?action=do-core-reinstall'; } else { $url = 'update-core.php?action=do-core-upgrade'; } $url = wp_nonce_url( $url, 'upgrade-core' ); $version = isset( $_POST['version'] ) ? $_POST['version'] : false; $locale = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US'; $update = find_core_update( $version, $locale ); if ( ! $update ) { return; } /* * Allow relaxed file ownership writes for User-initiated upgrades when the API specifies * that it's safe to do so. This only happens when there are no new files to create. */ $allow_relaxed_file_ownership = ! $reinstall && isset( $update->new_files ) && ! $update->new_files; ?> <div class="wrap"> <h1><?php _e( 'Update WordPress' ); ?></h1> <?php $credentials = request_filesystem_credentials( $url, '', false, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership ); if ( false === $credentials ) { echo '</div>'; return; } if ( ! WP_Filesystem( $credentials, ABSPATH, $allow_relaxed_file_ownership ) ) { // Failed to connect. Error and request again. request_filesystem_credentials( $url, '', true, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership ); echo '</div>'; return; } if ( $wp_filesystem->errors->has_errors() ) { foreach ( $wp_filesystem->errors->get_error_messages() as $message ) { show_message( $message ); } echo '</div>'; return; } if ( $reinstall ) { $update->response = 'reinstall'; } add_filter( 'update_feedback', 'show_message' ); $upgrader = new Core_Upgrader(); $result = $upgrader->upgrade( $update, array( 'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership, ) ); if ( is_wp_error( $result ) ) { show_message( $result ); if ( 'up_to_date' !== $result->get_error_code() && 'locked' !== $result->get_error_code() ) { show_message( __( 'Installation failed.' ) ); } echo '</div>'; return; } show_message( __( 'WordPress updated successfully.' ) ); show_message( '<span class="hide-if-no-js">' . sprintf( /* translators: 1: WordPress version, 2: URL to About screen. */ __( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href="%2$s">here</a>.' ), $result, esc_url( self_admin_url( 'about.php?updated' ) ) ) . '</span>' ); show_message( '<span class="hide-if-js">' . sprintf( /* translators: 1: WordPress version, 2: URL to About screen. */ __( 'Welcome to WordPress %1$s. <a href="%2$s">Learn more</a>.' ), $result, esc_url( self_admin_url( 'about.php?updated' ) ) ) . '</span>' ); ?> </div> <script type="text/javascript"> window.location = '<?php echo esc_url( self_admin_url( 'about.php?updated' ) ); ?>'; </script> <?php } /** * Dismiss a core update. * * @since 2.7.0 */ function do_dismiss_core_update() { $version = isset( $_POST['version'] ) ? $_POST['version'] : false; $locale = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US'; $update = find_core_update( $version, $locale ); if ( ! $update ) { return; } dismiss_core_update( $update ); wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) ); exit; } /** * Undismiss a core update. * * @since 2.7.0 */ function do_undismiss_core_update() { $version = isset( $_POST['version'] ) ? $_POST['version'] : false; $locale = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US'; $update = find_core_update( $version, $locale ); if ( ! $update ) { return; } undismiss_core_update( $version, $locale ); wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) ); exit; } $action = isset( $_GET['action'] ) ? $_GET['action'] : 'upgrade-core'; $upgrade_error = false; if ( ( 'do-theme-upgrade' === $action || ( 'do-plugin-upgrade' === $action && ! isset( $_GET['plugins'] ) ) ) && ! isset( $_POST['checked'] ) ) { $upgrade_error = ( 'do-theme-upgrade' === $action ) ? 'themes' : 'plugins'; $action = 'upgrade-core'; } $title = __( 'WordPress Updates' ); $parent_file = 'index.php'; $updates_overview = '<p>' . __( 'On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories.' ) . '</p>'; $updates_overview .= '<p>' . __( 'If an update is available, you᾿ll see a notification appear in the Toolbar and navigation menu.' ) . ' ' . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => $updates_overview, ) ); $updates_howto = '<p>' . __( '<strong>WordPress</strong> — Updating your WordPress installation is a simple one-click procedure: just <strong>click on the “Update now” button</strong> when you are notified that a new version is available.' ) . ' ' . __( 'In most cases, WordPress will automatically apply maintenance and security updates in the background for you.' ) . '</p>'; $updates_howto .= '<p>' . __( '<strong>Themes and Plugins</strong> — To update individual themes or plugins from this screen, use the checkboxes to make your selection, then <strong>click on the appropriate “Update” button</strong>. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button.' ) . '</p>'; if ( 'en_US' !== get_locale() ) { $updates_howto .= '<p>' . __( '<strong>Translations</strong> — The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can <strong>click the “Update Translations”</strong> button.' ) . '</p>'; } get_current_screen()->add_help_tab( array( 'id' => 'how-to-update', 'title' => __( 'How to Update' ), 'content' => $updates_howto, ) ); $help_sidebar_autoupdates = ''; if ( ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) || ( current_user_can( 'update_plugins' ) && wp_is_auto_update_enabled_for_type( 'plugin' ) ) ) { $help_tab_autoupdates = '<p>' . __( 'Auto-updates can be enabled or disabled for WordPress major versions and for each individual theme or plugin. Themes or plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '</p>'; $help_tab_autoupdates .= '<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'plugins-themes-auto-updates', 'title' => __( 'Auto-updates' ), 'content' => $help_tab_autoupdates, ) ); $help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>'; } $help_sidebar_rollback = ''; if ( current_user_can( 'update_themes' ) || current_user_can( 'update_plugins' ) ) { $rollback_help = '<p>' . __( 'This feature will create a temporary backup of a plugin or theme before it is upgraded. This backup is used to restore the plugin or theme back to its previous state if there is an error during the update process.' ) . '</p>'; $rollback_help .= '<p>' . __( 'On systems with fewer resources, this may lead to server timeouts or resource limits being reached. If you encounter an issue during the update process, please create a support forum topic and reference <strong>Rollback</strong> in the issue title.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'rollback-plugins-themes', 'title' => __( 'Restore Plugin or Theme' ), 'content' => $rollback_help, ) ); $help_sidebar_rollback = '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/wordpress/common-errors/">Common Errors</a>' ) . '</p>'; } get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/dashboard-updates-screen/">Documentation on Updating WordPress</a>' ) . '</p>' . $help_sidebar_autoupdates . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' . $help_sidebar_rollback ); if ( 'upgrade-core' === $action ) { // Force an update check when requested. $force_check = ! empty( $_GET['force-check'] ); wp_version_check( array(), $force_check ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php _e( 'WordPress Updates' ); ?></h1> <p><?php _e( 'Updates may take several minutes to complete. If there is no feedback after 5 minutes, or if there are errors please refer to the Help section above.' ); ?></p> <?php if ( $upgrade_error ) { if ( 'themes' === $upgrade_error ) { $theme_updates = get_theme_updates(); if ( ! empty( $theme_updates ) ) { wp_admin_notice( __( 'Please select one or more themes to update.' ), array( 'additional_classes' => array( 'error' ), ) ); } } else { $plugin_updates = get_plugin_updates(); if ( ! empty( $plugin_updates ) ) { wp_admin_notice( __( 'Please select one or more plugins to update.' ), array( 'additional_classes' => array( 'error' ), ) ); } } } $last_update_check = false; $current = get_site_transient( 'update_core' ); if ( $current && isset( $current->last_checked ) ) { $last_update_check = $current->last_checked + (int) ( (float) get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ); } echo '<h2 class="wp-current-version">'; /* translators: Current version of WordPress. */ printf( __( 'Current version: %s' ), esc_html( wp_get_wp_version() ) ); echo '</h2>'; echo '<p class="update-last-checked">'; printf( /* translators: 1: Date, 2: Time. */ __( 'Last checked on %1$s at %2$s.' ), /* translators: Last update date format. See https://www.php.net/manual/datetime.format.php */ date_i18n( __( 'F j, Y' ), $last_update_check ), /* translators: Last update time format. See https://www.php.net/manual/datetime.format.php */ date_i18n( __( 'g:i a T' ), $last_update_check ) ); echo ' <a href="' . esc_url( self_admin_url( 'update-core.php?force-check=1' ) ) . '">' . __( 'Check again.' ) . '</a>'; echo '</p>'; if ( current_user_can( 'update_core' ) ) { core_auto_updates_settings(); core_upgrade_preamble(); } if ( current_user_can( 'update_plugins' ) ) { list_plugin_updates(); } if ( current_user_can( 'update_themes' ) ) { list_theme_updates(); } if ( current_user_can( 'update_languages' ) ) { list_translation_updates(); } /** * Fires after the core, plugin, and theme update tables. * * @since 2.9.0 */ do_action( 'core_upgrade_preamble' ); echo '</div>'; wp_localize_script( 'updates', '_wpUpdatesItemCounts', array( 'totals' => wp_get_update_data(), ) ); require_once ABSPATH . 'wp-admin/admin-footer.php'; } elseif ( 'do-core-upgrade' === $action || 'do-core-reinstall' === $action ) { if ( ! current_user_can( 'update_core' ) ) { wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); } check_admin_referer( 'upgrade-core' ); // Do the (un)dismiss actions before headers, so that they can redirect. if ( isset( $_POST['dismiss'] ) ) { do_dismiss_core_update(); } elseif ( isset( $_POST['undismiss'] ) ) { do_undismiss_core_update(); } require_once ABSPATH . 'wp-admin/admin-header.php'; if ( 'do-core-reinstall' === $action ) { $reinstall = true; } else { $reinstall = false; } if ( isset( $_POST['upgrade'] ) ) { do_core_upgrade( $reinstall ); } wp_localize_script( 'updates', '_wpUpdatesItemCounts', array( 'totals' => wp_get_update_data(), ) ); require_once ABSPATH . 'wp-admin/admin-footer.php'; } elseif ( 'do-plugin-upgrade' === $action ) { if ( ! current_user_can( 'update_plugins' ) ) { wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); } check_admin_referer( 'upgrade-core' ); if ( isset( $_GET['plugins'] ) ) { $plugins = explode( ',', $_GET['plugins'] ); } elseif ( isset( $_POST['checked'] ) ) { $plugins = (array) $_POST['checked']; } else { wp_redirect( admin_url( 'update-core.php' ) ); exit; } $url = 'update.php?action=update-selected&plugins=' . urlencode( implode( ',', $plugins ) ); $url = wp_nonce_url( $url, 'bulk-update-plugins' ); // Used in the HTML title tag. $title = __( 'Update Plugins' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php _e( 'Update Plugins' ); ?></h1> <iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe> </div> <?php wp_localize_script( 'updates', '_wpUpdatesItemCounts', array( 'totals' => wp_get_update_data(), ) ); require_once ABSPATH . 'wp-admin/admin-footer.php'; } elseif ( 'do-theme-upgrade' === $action ) { if ( ! current_user_can( 'update_themes' ) ) { wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); } check_admin_referer( 'upgrade-core' ); if ( isset( $_GET['themes'] ) ) { $themes = explode( ',', $_GET['themes'] ); } elseif ( isset( $_POST['checked'] ) ) { $themes = (array) $_POST['checked']; } else { wp_redirect( admin_url( 'update-core.php' ) ); exit; } $url = 'update.php?action=update-selected-themes&themes=' . urlencode( implode( ',', $themes ) ); $url = wp_nonce_url( $url, 'bulk-update-themes' ); // Used in the HTML title tag. $title = __( 'Update Themes' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php _e( 'Update Themes' ); ?></h1> <iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe> </div> <?php wp_localize_script( 'updates', '_wpUpdatesItemCounts', array( 'totals' => wp_get_update_data(), ) ); require_once ABSPATH . 'wp-admin/admin-footer.php'; } elseif ( 'do-translation-upgrade' === $action ) { if ( ! current_user_can( 'update_languages' ) ) { wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); } check_admin_referer( 'upgrade-translations' ); require_once ABSPATH . 'wp-admin/admin-header.php'; require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; $url = 'update-core.php?action=do-translation-upgrade'; $nonce = 'upgrade-translations'; $title = __( 'Update Translations' ); $context = WP_LANG_DIR; $upgrader = new Language_Pack_Upgrader( new Language_Pack_Upgrader_Skin( compact( 'url', 'nonce', 'title', 'context' ) ) ); $result = $upgrader->bulk_upgrade(); wp_localize_script( 'updates', '_wpUpdatesItemCounts', array( 'totals' => wp_get_update_data(), ) ); require_once ABSPATH . 'wp-admin/admin-footer.php'; } elseif ( 'core-major-auto-updates-settings' === $action ) { if ( ! current_user_can( 'update_core' ) ) { wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); } $redirect_url = self_admin_url( 'update-core.php' ); if ( isset( $_GET['value'] ) ) { check_admin_referer( 'core-major-auto-updates-nonce' ); if ( 'enable' === $_GET['value'] ) { update_site_option( 'auto_update_core_major', 'enabled' ); $redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'enabled', $redirect_url ); } elseif ( 'disable' === $_GET['value'] ) { update_site_option( 'auto_update_core_major', 'disabled' ); $redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'disabled', $redirect_url ); } } wp_redirect( $redirect_url ); exit; } else { /** * Fires for each custom update action on the WordPress Updates screen. * * The dynamic portion of the hook name, `$action`, refers to the * passed update action. The hook fires in lieu of all available * default update actions. * * @since 3.2.0 */ do_action( "update-core-custom_{$action}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } moderation.php 0000644 00000000463 15151241210 0007411 0 ustar 00 <?php /** * Comment Moderation Administration Screen. * * Redirects to edit-comments.php?comment_status=moderated. * * @package WordPress * @subpackage Administration */ require_once dirname( __DIR__ ) . '/wp-load.php'; wp_redirect( admin_url( 'edit-comments.php?comment_status=moderated' ) ); exit; edit-tags.php 0000644 00000054005 15151241211 0007133 0 ustar 00 <?php /** * Edit Tags Administration Screen. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! $taxnow ) { wp_die( __( 'Invalid taxonomy.' ) ); } $tax = get_taxonomy( $taxnow ); if ( ! $tax ) { wp_die( __( 'Invalid taxonomy.' ) ); } if ( ! in_array( $tax->name, get_taxonomies( array( 'show_ui' => true ) ), true ) ) { wp_die( __( 'Sorry, you are not allowed to edit terms in this taxonomy.' ) ); } if ( ! current_user_can( $tax->cap->manage_terms ) ) { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to manage terms in this taxonomy.' ) . '</p>', 403 ); } /** * $post_type is set when the WP_Terms_List_Table instance is created. * * @global string $post_type Global post type. */ global $post_type; $wp_list_table = _get_list_table( 'WP_Terms_List_Table' ); $pagenum = $wp_list_table->get_pagenum(); $title = $tax->labels->name; if ( 'post' !== $post_type ) { $parent_file = ( 'attachment' === $post_type ) ? 'upload.php' : "edit.php?post_type=$post_type"; $submenu_file = "edit-tags.php?taxonomy=$taxonomy&post_type=$post_type"; } elseif ( 'link_category' === $tax->name ) { $parent_file = 'link-manager.php'; $submenu_file = 'edit-tags.php?taxonomy=link_category'; } else { $parent_file = 'edit.php'; $submenu_file = "edit-tags.php?taxonomy=$taxonomy"; } add_screen_option( 'per_page', array( 'default' => 20, 'option' => 'edit_' . $tax->name . '_per_page', ) ); get_current_screen()->set_screen_reader_content( array( 'heading_pagination' => $tax->labels->items_list_navigation, 'heading_list' => $tax->labels->items_list, ) ); $location = false; $referer = wp_get_referer(); if ( ! $referer ) { // For POST requests. $referer = wp_unslash( $_SERVER['REQUEST_URI'] ); } $referer = remove_query_arg( array( '_wp_http_referer', '_wpnonce', 'error', 'message', 'paged' ), $referer ); switch ( $wp_list_table->current_action() ) { case 'add-tag': check_admin_referer( 'add-tag', '_wpnonce_add-tag' ); if ( ! current_user_can( $tax->cap->edit_terms ) ) { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) . '</p>', 403 ); } $ret = wp_insert_term( $_POST['tag-name'], $taxonomy, $_POST ); if ( $ret && ! is_wp_error( $ret ) ) { $location = add_query_arg( 'message', 1, $referer ); } else { $location = add_query_arg( array( 'error' => true, 'message' => 4, ), $referer ); } break; case 'delete': if ( ! isset( $_REQUEST['tag_ID'] ) ) { break; } $tag_ID = (int) $_REQUEST['tag_ID']; check_admin_referer( 'delete-tag_' . $tag_ID ); if ( ! current_user_can( 'delete_term', $tag_ID ) ) { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to delete this item.' ) . '</p>', 403 ); } wp_delete_term( $tag_ID, $taxonomy ); $location = add_query_arg( 'message', 2, $referer ); // When deleting a term, prevent the action from redirecting back to a term that no longer exists. $location = remove_query_arg( array( 'tag_ID', 'action' ), $location ); break; case 'bulk-delete': check_admin_referer( 'bulk-tags' ); if ( ! current_user_can( $tax->cap->delete_terms ) ) { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to delete these items.' ) . '</p>', 403 ); } $tags = (array) $_REQUEST['delete_tags']; foreach ( $tags as $tag_ID ) { wp_delete_term( $tag_ID, $taxonomy ); } $location = add_query_arg( 'message', 6, $referer ); break; case 'edit': if ( ! isset( $_REQUEST['tag_ID'] ) ) { break; } $term_id = (int) $_REQUEST['tag_ID']; $term = get_term( $term_id ); if ( ! $term instanceof WP_Term ) { wp_die( __( 'You attempted to edit an item that does not exist. Perhaps it was deleted?' ) ); } wp_redirect( sanitize_url( get_edit_term_link( $term_id, $taxonomy, $post_type ) ) ); exit; case 'editedtag': $tag_ID = (int) $_POST['tag_ID']; check_admin_referer( 'update-tag_' . $tag_ID ); if ( ! current_user_can( 'edit_term', $tag_ID ) ) { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to edit this item.' ) . '</p>', 403 ); } $tag = get_term( $tag_ID, $taxonomy ); if ( ! $tag ) { wp_die( __( 'You attempted to edit an item that does not exist. Perhaps it was deleted?' ) ); } $ret = wp_update_term( $tag_ID, $taxonomy, $_POST ); if ( $ret && ! is_wp_error( $ret ) ) { $location = add_query_arg( 'message', 3, $referer ); } else { $location = add_query_arg( array( 'error' => true, 'message' => 5, ), $referer ); } break; default: if ( ! $wp_list_table->current_action() || ! isset( $_REQUEST['delete_tags'] ) ) { break; } check_admin_referer( 'bulk-tags' ); $screen = get_current_screen()->id; $tags = (array) $_REQUEST['delete_tags']; /** This action is documented in wp-admin/edit.php */ $location = apply_filters( "handle_bulk_actions-{$screen}", $location, $wp_list_table->current_action(), $tags ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores break; } if ( ! $location && ! empty( $_REQUEST['_wp_http_referer'] ) ) { $location = remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ); } if ( $location ) { if ( $pagenum > 1 ) { $location = add_query_arg( 'paged', $pagenum, $location ); // $pagenum takes care of $total_pages. } if ( 1 === $pagenum ) { $location = remove_query_arg( 'paged', $location ); } /** * Filters the taxonomy redirect destination URL. * * @since 4.6.0 * * @param string $location The destination URL. * @param WP_Taxonomy $tax The taxonomy object. */ wp_redirect( apply_filters( 'redirect_term_location', $location, $tax ) ); exit; } $wp_list_table->prepare_items(); $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); if ( $pagenum > $total_pages && $total_pages > 0 ) { wp_redirect( add_query_arg( 'paged', $total_pages ) ); exit; } wp_enqueue_script( 'admin-tags' ); if ( current_user_can( $tax->cap->edit_terms ) ) { wp_enqueue_script( 'inline-edit-tax' ); } if ( 'category' === $taxonomy || 'link_category' === $taxonomy || 'post_tag' === $taxonomy ) { $help = ''; if ( 'category' === $taxonomy ) { $help = '<p>' . sprintf( /* translators: %s: URL to Writing Settings screen. */ __( 'You can use categories to define sections of your site and group related posts. The default category is “Uncategorized” until you change it in your <a href="%s">writing settings</a>.' ), 'options-writing.php' ) . '</p>'; } elseif ( 'link_category' === $taxonomy ) { $help = '<p>' . __( 'You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts.' ) . '</p>'; } else { $help = '<p>' . __( 'You can assign keywords to your posts using <strong>tags</strong>. Unlike categories, tags have no hierarchy, meaning there is no relationship from one tag to another.' ) . '</p>'; } if ( 'link_category' === $taxonomy ) { $help .= '<p>' . __( 'You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category.' ) . '</p>'; } else { $help .= '<p>' . __( 'What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index.' ) . '</p>'; } get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => $help, ) ); if ( 'category' === $taxonomy || 'post_tag' === $taxonomy ) { if ( 'category' === $taxonomy ) { $help = '<p>' . __( 'When adding a new category on this screen, you’ll fill in the following fields:' ) . '</p>'; } else { $help = '<p>' . __( 'When adding a new tag on this screen, you’ll fill in the following fields:' ) . '</p>'; } $help .= '<ul>' . '<li>' . __( '<strong>Name</strong> — The name is how it appears on your site.' ) . '</li>'; $help .= '<li>' . __( '<strong>Slug</strong> — The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' ) . '</li>'; if ( 'category' === $taxonomy ) { $help .= '<li>' . __( '<strong>Parent</strong> — Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown.' ) . '</li>'; } $help .= '<li>' . __( '<strong>Description</strong> — The description is not prominent by default; however, some themes may display it.' ) . '</li>' . '</ul>' . '<p>' . __( 'You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'adding-terms', 'title' => 'category' === $taxonomy ? __( 'Adding Categories' ) : __( 'Adding Tags' ), 'content' => $help, ) ); } $help = '<p><strong>' . __( 'For more information:' ) . '</strong></p>'; if ( 'category' === $taxonomy ) { $help .= '<p>' . __( '<a href="https://wordpress.org/documentation/article/posts-categories-screen/">Documentation on Categories</a>' ) . '</p>'; } elseif ( 'link_category' === $taxonomy ) { $help .= '<p>' . __( '<a href="https://codex.wordpress.org/Links_Link_Categories_Screen">Documentation on Link Categories</a>' ) . '</p>'; } else { $help .= '<p>' . __( '<a href="https://wordpress.org/documentation/article/posts-tags-screen/">Documentation on Tags</a>' ) . '</p>'; } $help .= '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'; get_current_screen()->set_help_sidebar( $help ); unset( $help ); } require_once ABSPATH . 'wp-admin/admin-header.php'; // Also used by the Edit Tag form. require_once ABSPATH . 'wp-admin/includes/edit-tag-messages.php'; if ( is_plugin_active( 'wpcat2tag-importer/wpcat2tag-importer.php' ) ) { $import_link = admin_url( 'admin.php?import=wpcat2tag' ); } else { $import_link = admin_url( 'import.php' ); } ?> <div class="wrap nosubsub"> <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1> <?php if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) { echo '<span class="subtitle">'; printf( /* translators: %s: Search query. */ __( 'Search results for: %s' ), '<strong>' . esc_html( wp_unslash( $_REQUEST['s'] ) ) . '</strong>' ); echo '</span>'; } ?> <hr class="wp-header-end"> <?php $class = ( isset( $_REQUEST['error'] ) ) ? 'error' : 'updated'; if ( $message ) { wp_admin_notice( $message, array( 'id' => 'message', 'additional_classes' => array( $class ), 'dismissible' => true, ) ); $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'message', 'error' ), $_SERVER['REQUEST_URI'] ); } ?> <div id="ajax-response"></div> <form class="search-form wp-clearfix" method="get"> <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $taxonomy ); ?>" /> <input type="hidden" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" /> <?php $wp_list_table->search_box( $tax->labels->search_items, 'tag' ); ?> </form> <?php $can_edit_terms = current_user_can( $tax->cap->edit_terms ); if ( $can_edit_terms ) { ?> <div id="col-container" class="wp-clearfix"> <div id="col-left"> <div class="col-wrap"> <?php if ( 'category' === $taxonomy ) { /** * Fires before the Add Category form. * * @since 2.1.0 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead. * * @param object $arg Optional arguments cast to an object. */ do_action_deprecated( 'add_category_form_pre', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_pre_add_form' ); } elseif ( 'link_category' === $taxonomy ) { /** * Fires before the link category form. * * @since 2.3.0 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead. * * @param object $arg Optional arguments cast to an object. */ do_action_deprecated( 'add_link_category_form_pre', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_pre_add_form' ); } else { /** * Fires before the Add Tag form. * * @since 2.5.0 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead. * * @param string $taxonomy The taxonomy slug. */ do_action_deprecated( 'add_tag_form_pre', array( $taxonomy ), '3.0.0', '{$taxonomy}_pre_add_form' ); } /** * Fires before the Add Term form for all taxonomies. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `category_pre_add_form` * - `post_tag_pre_add_form` * * @since 3.0.0 * * @param string $taxonomy The taxonomy slug. */ do_action( "{$taxonomy}_pre_add_form", $taxonomy ); ?> <div class="form-wrap"> <h2><?php echo $tax->labels->add_new_item; ?></h2> <form id="addtag" method="post" action="edit-tags.php" class="validate" <?php /** * Fires inside the Add Tag form tag. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `category_term_new_form_tag` * - `post_tag_term_new_form_tag` * * @since 3.7.0 */ do_action( "{$taxonomy}_term_new_form_tag" ); ?> > <input type="hidden" name="action" value="add-tag" /> <input type="hidden" name="screen" value="<?php echo esc_attr( $current_screen->id ); ?>" /> <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $taxonomy ); ?>" /> <input type="hidden" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" /> <?php wp_nonce_field( 'add-tag', '_wpnonce_add-tag' ); ?> <div class="form-field form-required term-name-wrap"> <label for="tag-name"><?php _ex( 'Name', 'term name' ); ?></label> <input name="tag-name" id="tag-name" type="text" value="" size="40" aria-required="true" aria-describedby="name-description" /> <p id="name-description"><?php echo $tax->labels->name_field_description; ?></p> </div> <div class="form-field term-slug-wrap"> <label for="tag-slug"><?php _e( 'Slug' ); ?></label> <input name="slug" id="tag-slug" type="text" value="" size="40" aria-describedby="slug-description" /> <p id="slug-description"><?php echo $tax->labels->slug_field_description; ?></p> </div> <?php if ( is_taxonomy_hierarchical( $taxonomy ) ) : ?> <div class="form-field term-parent-wrap"> <label for="parent"><?php echo esc_html( $tax->labels->parent_item ); ?></label> <?php $dropdown_args = array( 'hide_empty' => 0, 'hide_if_empty' => false, 'taxonomy' => $taxonomy, 'name' => 'parent', 'orderby' => 'name', 'hierarchical' => true, 'show_option_none' => __( 'None' ), ); /** * Filters the taxonomy parent drop-down on the Edit Term page. * * @since 3.7.0 * @since 4.2.0 Added `$context` parameter. * * @param array $dropdown_args { * An array of taxonomy parent drop-down arguments. * * @type int|bool $hide_empty Whether to hide terms not attached to any posts. Default 0. * @type bool $hide_if_empty Whether to hide the drop-down if no terms exist. Default false. * @type string $taxonomy The taxonomy slug. * @type string $name Value of the name attribute to use for the drop-down select element. * Default 'parent'. * @type string $orderby The field to order by. Default 'name'. * @type bool $hierarchical Whether the taxonomy is hierarchical. Default true. * @type string $show_option_none Label to display if there are no terms. Default 'None'. * } * @param string $taxonomy The taxonomy slug. * @param string $context Filter context. Accepts 'new' or 'edit'. */ $dropdown_args = apply_filters( 'taxonomy_parent_dropdown_args', $dropdown_args, $taxonomy, 'new' ); $dropdown_args['aria_describedby'] = 'parent-description'; wp_dropdown_categories( $dropdown_args ); ?> <?php if ( 'category' === $taxonomy ) : ?> <p id="parent-description"><?php _e( 'Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.' ); ?></p> <?php else : ?> <p id="parent-description"><?php echo $tax->labels->parent_field_description; ?></p> <?php endif; ?> </div> <?php endif; // is_taxonomy_hierarchical() ?> <div class="form-field term-description-wrap"> <label for="tag-description"><?php _e( 'Description' ); ?></label> <textarea name="description" id="tag-description" rows="5" cols="40" aria-describedby="description-description"></textarea> <p id="description-description"><?php echo $tax->labels->desc_field_description; ?></p> </div> <?php if ( ! is_taxonomy_hierarchical( $taxonomy ) ) { /** * Fires after the Add Tag form fields for non-hierarchical taxonomies. * * @since 3.0.0 * * @param string $taxonomy The taxonomy slug. */ do_action( 'add_tag_form_fields', $taxonomy ); } /** * Fires after the Add Term form fields. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `category_add_form_fields` * - `post_tag_add_form_fields` * * @since 3.0.0 * * @param string $taxonomy The taxonomy slug. */ do_action( "{$taxonomy}_add_form_fields", $taxonomy ); ?> <p class="submit"> <?php submit_button( $tax->labels->add_new_item, 'primary', 'submit', false ); ?> <span class="spinner"></span> </p> <?php if ( 'category' === $taxonomy ) { /** * Fires at the end of the Edit Category form. * * @since 2.1.0 * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead. * * @param object $arg Optional arguments cast to an object. */ do_action_deprecated( 'edit_category_form', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_add_form' ); } elseif ( 'link_category' === $taxonomy ) { /** * Fires at the end of the Edit Link form. * * @since 2.3.0 * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead. * * @param object $arg Optional arguments cast to an object. */ do_action_deprecated( 'edit_link_category_form', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_add_form' ); } else { /** * Fires at the end of the Add Tag form. * * @since 2.7.0 * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead. * * @param string $taxonomy The taxonomy slug. */ do_action_deprecated( 'add_tag_form', array( $taxonomy ), '3.0.0', '{$taxonomy}_add_form' ); } /** * Fires at the end of the Add Term form for all taxonomies. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `category_add_form` * - `post_tag_add_form` * * @since 3.0.0 * * @param string $taxonomy The taxonomy slug. */ do_action( "{$taxonomy}_add_form", $taxonomy ); ?> </form></div> </div> </div><!-- /col-left --> <div id="col-right"> <div class="col-wrap"> <?php } ?> <?php $wp_list_table->views(); ?> <form id="posts-filter" method="post"> <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $taxonomy ); ?>" /> <input type="hidden" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" /> <?php $wp_list_table->display(); ?> </form> <?php if ( 'category' === $taxonomy ) : ?> <div class="form-wrap edit-term-notes"> <p> <?php printf( /* translators: %s: Default category. */ __( 'Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the default category %s. The default category cannot be deleted.' ), /** This filter is documented in wp-includes/category-template.php */ '<strong>' . apply_filters( 'the_category', get_cat_name( get_option( 'default_category' ) ), '', '' ) . '</strong>' ); ?> </p> <?php if ( current_user_can( 'import' ) ) : ?> <p> <?php printf( /* translators: %s: URL to Categories to Tags Converter tool. */ __( 'Categories can be selectively converted to tags using the <a href="%s">category to tag converter</a>.' ), esc_url( $import_link ) ); ?> </p> <?php endif; ?> </div> <?php elseif ( 'post_tag' === $taxonomy && current_user_can( 'import' ) ) : ?> <div class="form-wrap edit-term-notes"> <p> <?php printf( /* translators: %s: URL to Categories to Tags Converter tool. */ __( 'Tags can be selectively converted to categories using the <a href="%s">tag to category converter</a>.' ), esc_url( $import_link ) ); ?> </p> </div> <?php endif; /** * Fires after the taxonomy list table. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `after-category-table` * - `after-post_tag-table` * * @since 3.0.0 * * @param string $taxonomy The taxonomy name. */ do_action( "after-{$taxonomy}-table", $taxonomy ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores if ( $can_edit_terms ) { ?> </div> </div><!-- /col-right --> </div><!-- /col-container --> <?php } ?> </div><!-- /wrap --> <?php if ( ! wp_is_mobile() ) : ?> <script type="text/javascript"> try{document.forms.addtag['tag-name'].focus();}catch(e){} </script> <?php endif; $wp_list_table->inline_edit(); require_once ABSPATH . 'wp-admin/admin-footer.php'; erase-personal-data.php 0000644 00000016521 15151241211 0011102 0 ustar 00 <?php /** * Privacy tools, Erase Personal Data screen. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'erase_others_personal_data' ) || ! current_user_can( 'delete_users' ) ) { wp_die( __( 'Sorry, you are not allowed to erase personal data on this site.' ) ); } // Used in the HTML title tag. $title = __( 'Erase Personal Data' ); // Contextual help - choose Help on the top right of admin panel to preview this. get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'This screen is where you manage requests to erase personal data.' ) . '</p>' . '<p>' . __( 'Privacy Laws around the world require businesses and online services to delete, anonymize, or forget the data they collect about an individual. The rights those laws enshrine are sometimes called the "Right to be Forgotten".' ) . '</p>' . '<p>' . __( 'The tool associates data stored in WordPress with a supplied email address, including profile data and comments.' ) . '</p>' . '<p><strong>' . __( 'Note: As this tool only gathers data from WordPress and participating plugins, you may need to do more to comply with erasure requests. For example, you are also responsible for ensuring that data collected by or stored with the 3rd party services your organization uses gets deleted.' ) . '</strong></p>', ) ); get_current_screen()->add_help_tab( array( 'id' => 'default-data', 'title' => __( 'Default Data' ), 'content' => '<p>' . __( 'WordPress collects (but <em>never</em> publishes) a limited amount of data from logged-in users but then deletes it or anonymizes it. That data can include:' ) . '</p>' . '<p>' . __( '<strong>Profile Information</strong> — user email address, username, display name, nickname, first name, last name, description/bio, and registration date.' ) . '</p>' . '<p>' . __( '<strong>Community Events Location</strong> — The IP Address of the user which is used for the Upcoming Community Events shown in the dashboard widget.' ) . '</p>' . '<p>' . __( '<strong>Session Tokens</strong> — User login information, IP Addresses, Expiration Date, User Agent (Browser/OS), and Last Login.' ) . '</p>' . '<p>' . __( '<strong>Comments</strong> — WordPress does not delete comments. The software does anonymize (but, again, <em>never</em> publishes) the associated Email Address, IP Address, and User Agent (Browser/OS).' ) . '</p>' . '<p>' . __( '<strong>Media</strong> — A list of URLs for all media file uploads made by the user.' ) . '</p>', ) ); $privacy_policy_guide = '<p>' . sprintf( /* translators: %s: URL to Privacy Policy Guide screen. */ __( 'If you are not sure, check the plugin documentation or contact the plugin author to see if the plugin collects data and if it supports the Data Eraser tool. This information may be available in the <a href="%s">Privacy Policy Guide</a>.' ), admin_url( 'options-privacy.php?tab=policyguide' ) ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'plugin-data', 'title' => __( 'Plugin Data' ), 'content' => '<p>' . __( 'Many plugins may collect or store personal data either in the WordPress database or remotely. Any Erase Personal Data request should delete data from plugins as well.' ) . '</p>' . $privacy_policy_guide . '<p>' . __( 'If you are a plugin author, you can learn more about <a href="https://developer.wordpress.org/plugins/privacy/adding-the-personal-data-eraser-to-your-plugin/">how to add the Personal Data Eraser to a plugin</a>.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-erase-personal-data-screen/">Documentation on Erase Personal Data</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); // Handle list table actions. _wp_personal_data_handle_actions(); // Cleans up failed and expired requests before displaying the list table. _wp_personal_data_cleanup_requests(); wp_enqueue_script( 'privacy-tools' ); add_screen_option( 'per_page', array( 'default' => 20, 'option' => 'remove_personal_data_requests_per_page', ) ); $_list_table_args = array( 'plural' => 'privacy_requests', 'singular' => 'privacy_request', ); $requests_table = _get_list_table( 'WP_Privacy_Data_Removal_Requests_List_Table', $_list_table_args ); $requests_table->screen->set_screen_reader_content( array( 'heading_views' => __( 'Filter erase personal data list' ), 'heading_pagination' => __( 'Erase personal data list navigation' ), 'heading_list' => __( 'Erase personal data list' ), ) ); $requests_table->process_bulk_action(); $requests_table->prepare_items(); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap nosubsub"> <h1><?php esc_html_e( 'Erase Personal Data' ); ?></h1> <p><?php _e( 'This tool helps site owners comply with local laws and regulations by deleting or anonymizing known data for a given user.' ); ?></p> <hr class="wp-header-end" /> <?php settings_errors(); ?> <form action="<?php echo esc_url( admin_url( 'erase-personal-data.php' ) ); ?>" method="post" class="wp-privacy-request-form"> <h2><?php esc_html_e( 'Add Data Erasure Request' ); ?></h2> <div class="wp-privacy-request-form-field"> <table class="form-table"> <tr> <th scope="row"> <label for="username_or_email_for_privacy_request"><?php esc_html_e( 'Username or email address' ); ?></label> </th> <td> <input type="text" required class="regular-text ltr" id="username_or_email_for_privacy_request" name="username_or_email_for_privacy_request" /> </td> </tr> <tr> <th scope="row"> <?php _e( 'Confirmation email' ); ?> </th> <td> <label for="send_confirmation_email"> <input type="checkbox" name="send_confirmation_email" id="send_confirmation_email" value="1" checked="checked" /> <?php _e( 'Send personal data erasure confirmation email.' ); ?> </label> </td> </tr> </table> <p class="submit"> <?php submit_button( __( 'Send Request' ), 'secondary', 'submit', false ); ?> </p> </div> <?php wp_nonce_field( 'personal-data-request' ); ?> <input type="hidden" name="action" value="add_remove_personal_data_request" /> <input type="hidden" name="type_of_action" value="remove_personal_data" /> </form> <hr /> <?php $requests_table->views(); ?> <form class="search-form wp-clearfix"> <?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?> <input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" /> <input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" /> <input type="hidden" name="order" value="<?php echo isset( $_REQUEST['order'] ) ? esc_attr( sanitize_text_field( $_REQUEST['order'] ) ) : ''; ?>" /> </form> <form method="post"> <?php $requests_table->display(); $requests_table->embed_scripts(); ?> </form> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; privacy.php 0000644 00000005027 15151241212 0006730 0 ustar 00 <?php /** * Privacy administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; // Used in the HTML title tag. $title = __( 'Privacy' ); list( $display_version ) = explode( '-', get_bloginfo( 'version' ) ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap about__container"> <div class="about__header"> <div class="about__header-title"> <h1> <?php _e( 'Privacy' ); ?> </h1> </div> <div class="about__header-text"> <?php _e( 'WordPress.org takes privacy and transparency very seriously' ); ?> </div> </div> <nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>"> <a href="about.php" class="nav-tab"><?php _e( 'What’s New' ); ?></a> <a href="credits.php" class="nav-tab"><?php _e( 'Credits' ); ?></a> <a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a> <a href="privacy.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'Privacy' ); ?></a> <a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a> </nav> <div class="about__section has-2-columns is-wider-right"> <div class="column about__image"> <img class="privacy-image" src="<?php echo esc_url( admin_url( 'images/privacy.svg?ver=6.5' ) ); ?>" alt="" /> </div> <div class="column is-vertically-aligned-center"> <p><?php _e( 'From time to time, your WordPress site may send data to WordPress.org — including, but not limited to — the version you are using, and a list of installed plugins and themes.' ); ?></p> <p> <?php printf( /* translators: %s: https://wordpress.org/about/stats/ */ __( 'This data is used to provide general enhancements to WordPress, which includes helping to protect your site by finding and automatically installing new updates. It is also used to calculate statistics, such as those shown on the <a href="%s">WordPress.org stats page</a>.' ), __( 'https://wordpress.org/about/stats/' ) ); ?> </p> <p> <?php printf( /* translators: %s: https://wordpress.org/about/privacy/ */ __( 'WordPress.org takes privacy and transparency very seriously. To learn more about what data is collected, and how it is used, please visit <a href="%s">the WordPress.org Privacy Policy</a>.' ), __( 'https://wordpress.org/about/privacy/' ) ); ?> </p> </div> </div> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> ms-delete-site.php 0000644 00000010306 15151241212 0010070 0 ustar 00 <?php /** * Multisite delete site panel. * * @package WordPress * @subpackage Multisite * @since 3.0.0 */ require_once __DIR__ . '/admin.php'; if ( ! is_multisite() ) { wp_die( __( 'Multisite support is not enabled.' ) ); } if ( ! current_user_can( 'delete_site' ) ) { wp_die( __( 'Sorry, you are not allowed to delete this site.' ) ); } if ( isset( $_GET['h'] ) && '' !== $_GET['h'] && false !== get_option( 'delete_blog_hash' ) ) { if ( hash_equals( get_option( 'delete_blog_hash' ), $_GET['h'] ) ) { wpmu_delete_blog( get_current_blog_id() ); wp_die( sprintf( /* translators: %s: Network title. */ __( 'Thank you for using %s, your site has been deleted. Happy trails to you until we meet again.' ), get_network()->site_name ) ); } else { wp_die( __( 'Sorry, the link you clicked is stale. Please select another option.' ) ); } } $blog = get_site(); $user = wp_get_current_user(); // Used in the HTML title tag. $title = __( 'Delete Site' ); $parent_file = 'tools.php'; require_once ABSPATH . 'wp-admin/admin-header.php'; echo '<div class="wrap">'; echo '<h1>' . esc_html( $title ) . '</h1>'; if ( isset( $_POST['action'] ) && 'deleteblog' === $_POST['action'] && isset( $_POST['confirmdelete'] ) && '1' === $_POST['confirmdelete'] ) { check_admin_referer( 'delete-blog' ); $hash = wp_generate_password( 20, false ); update_option( 'delete_blog_hash', $hash, false ); $url_delete = esc_url( admin_url( 'ms-delete-site.php?h=' . $hash ) ); $switched_locale = switch_to_locale( get_locale() ); /* translators: Do not translate USERNAME, URL_DELETE, SITENAME, SITEURL: those are placeholders. */ $content = __( "Howdy ###USERNAME###, You recently clicked the 'Delete Site' link on your site and filled in a form on that page. If you really want to delete your site, click the link below. You will not be asked to confirm again so only click this link if you are absolutely certain: ###URL_DELETE### If you delete your site, please consider opening a new site here some time in the future! (But remember that your current site and username are gone forever.) Thank you for using the site, All at ###SITENAME### ###SITEURL###" ); /** * Filters the text for the email sent to the site admin when a request to delete a site in a Multisite network is submitted. * * @since 3.0.0 * * @param string $content The email text. */ $content = apply_filters( 'delete_site_email_content', $content ); $content = str_replace( '###USERNAME###', $user->user_login, $content ); $content = str_replace( '###URL_DELETE###', $url_delete, $content ); $content = str_replace( '###SITENAME###', get_network()->site_name, $content ); $content = str_replace( '###SITEURL###', network_home_url(), $content ); wp_mail( get_option( 'admin_email' ), sprintf( /* translators: %s: Site title. */ __( '[%s] Delete My Site' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), $content ); if ( $switched_locale ) { restore_previous_locale(); } ?> <p><?php _e( 'Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked.' ); ?></p> <?php } else { ?> <p> <?php printf( /* translators: %s: Network title. */ __( 'If you do not want to use your %s site any more, you can delete it using the form below. When you click <strong>Delete My Site Permanently</strong> you will be sent an email with a link in it. Click on this link to delete your site.' ), get_network()->site_name ); ?> </p> <p><?php _e( 'Remember, once deleted your site cannot be restored.' ); ?></p> <form method="post" name="deletedirect"> <?php wp_nonce_field( 'delete-blog' ); ?> <input type="hidden" name="action" value="deleteblog" /> <p><input id="confirmdelete" type="checkbox" name="confirmdelete" value="1" /> <label for="confirmdelete"><strong> <?php printf( /* translators: %s: Site address. */ __( "I'm sure I want to permanently delete my site, and I am aware I can never get it back or use %s again." ), $blog->domain . $blog->path ); ?> </strong></label></p> <?php submit_button( __( 'Delete My Site Permanently' ) ); ?> </form> <?php } echo '</div>'; require_once ABSPATH . 'wp-admin/admin-footer.php'; link-add.php 0000644 00000001646 15151241212 0006741 0 ustar 00 <?php /** * Add Link Administration Screen. * * @package WordPress * @subpackage Administration */ /** Load WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'manage_links' ) ) { wp_die( __( 'Sorry, you are not allowed to add links to this site.' ) ); } // Used in the HTML title tag. $title = __( 'Add Link' ); $parent_file = 'link-manager.php'; $action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : ''; $cat_id = ! empty( $_REQUEST['cat_id'] ) ? absint( $_REQUEST['cat_id'] ) : 0; $link_id = ! empty( $_REQUEST['link_id'] ) ? absint( $_REQUEST['link_id'] ) : 0; wp_enqueue_script( 'link' ); wp_enqueue_script( 'xfn' ); if ( wp_is_mobile() ) { wp_enqueue_script( 'jquery-touch-punch' ); } $link = get_default_link_to_edit(); require ABSPATH . 'wp-admin/edit-link-form.php'; require_once ABSPATH . 'wp-admin/admin-footer.php'; options-permalink.php 0000644 00000052326 15151241213 0010733 0 ustar 00 <?php /** * Permalink Settings Administration Screen. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'manage_options' ) ) { wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) ); } // Used in the HTML title tag. $title = __( 'Permalink Settings' ); $parent_file = 'options-general.php'; get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change — hence the name permalink.' ) . '</p>' . '<p>' . __( 'This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures.' ) . '</p>' . '<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>', ) ); get_current_screen()->add_help_tab( array( 'id' => 'permalink-settings', 'title' => __( 'Permalink Settings' ), 'content' => '<p>' . __( 'Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure.' ) . '</p>' . '<p>' . sprintf( /* translators: %s: Percent sign (%). */ __( 'If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by %s) will also appear in the custom structure field and your path can be further modified there.' ), '<code>%</code>' ) . '</p>' . '<p>' . sprintf( /* translators: 1: %category%, 2: %tag% */ __( 'When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %1$s or %2$s.' ), '<code>%category%</code>', '<code>%tag%</code>' ) . '</p>' . '<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>', ) ); get_current_screen()->add_help_tab( array( 'id' => 'custom-structures', 'title' => __( 'Custom Structures' ), 'content' => '<p>' . __( 'The Optional fields let you customize the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorized” category could be <code>/topics/uncategorized</code> instead of <code>/category/uncategorized</code>.' ) . '</p>' . '<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>', ) ); $help_sidebar_content = '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-permalinks-screen/">Documentation on Permalinks Settings</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/customize-permalinks/">Documentation on Using Permalinks</a>' ) . '</p>'; if ( $is_nginx ) { $help_sidebar_content .= '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/server/web-server/nginx/">Documentation on Nginx configuration</a>.' ) . '</p>'; } $help_sidebar_content .= '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'; get_current_screen()->set_help_sidebar( $help_sidebar_content ); unset( $help_sidebar_content ); $home_path = get_home_path(); $iis7_permalinks = iis7_supports_permalinks(); $permalink_structure = get_option( 'permalink_structure' ); $index_php_prefix = ''; $blog_prefix = ''; if ( ! got_url_rewrite() ) { $index_php_prefix = '/index.php'; } /* * In a subdirectory configuration of multisite, the `/blog` prefix is used by * default on the main site to avoid collisions with other sites created on that * network. If the `permalink_structure` option has been changed to remove this * base prefix, WordPress core can no longer account for the possible collision. */ if ( is_multisite() && ! is_subdomain_install() && is_main_site() && str_starts_with( $permalink_structure, '/blog/' ) ) { $blog_prefix = '/blog'; } $category_base = get_option( 'category_base' ); $tag_base = get_option( 'tag_base' ); $structure_updated = false; $htaccess_update_required = false; if ( isset( $_POST['permalink_structure'] ) || isset( $_POST['category_base'] ) ) { check_admin_referer( 'update-permalink' ); if ( isset( $_POST['permalink_structure'] ) ) { if ( isset( $_POST['selection'] ) && 'custom' !== $_POST['selection'] ) { $permalink_structure = $_POST['selection']; } else { $permalink_structure = $_POST['permalink_structure']; } if ( ! empty( $permalink_structure ) ) { $permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) ); if ( $index_php_prefix && $blog_prefix ) { $permalink_structure = $index_php_prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure ); } else { $permalink_structure = $blog_prefix . $permalink_structure; } } $permalink_structure = sanitize_option( 'permalink_structure', $permalink_structure ); $wp_rewrite->set_permalink_structure( $permalink_structure ); $structure_updated = true; } if ( isset( $_POST['category_base'] ) ) { $category_base = $_POST['category_base']; if ( ! empty( $category_base ) ) { $category_base = $blog_prefix . preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $category_base ) ); } $wp_rewrite->set_category_base( $category_base ); } if ( isset( $_POST['tag_base'] ) ) { $tag_base = $_POST['tag_base']; if ( ! empty( $tag_base ) ) { $tag_base = $blog_prefix . preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $tag_base ) ); } $wp_rewrite->set_tag_base( $tag_base ); } } if ( $iis7_permalinks ) { if ( ( ! file_exists( $home_path . 'web.config' ) && win_is_writable( $home_path ) ) || win_is_writable( $home_path . 'web.config' ) ) { $writable = true; } else { $writable = false; } } elseif ( $is_nginx || $is_caddy ) { $writable = false; } else { if ( ( ! file_exists( $home_path . '.htaccess' ) && is_writable( $home_path ) ) || is_writable( $home_path . '.htaccess' ) ) { $writable = true; } else { $writable = false; $existing_rules = array_filter( extract_from_markers( $home_path . '.htaccess', 'WordPress' ) ); $new_rules = array_filter( explode( "\n", $wp_rewrite->mod_rewrite_rules() ) ); $htaccess_update_required = ( $new_rules !== $existing_rules ); } } $using_index_permalinks = $wp_rewrite->using_index_permalinks(); if ( $structure_updated ) { $message = __( 'Permalink structure updated.' ); if ( ! is_multisite() && $permalink_structure && ! $using_index_permalinks ) { if ( $iis7_permalinks ) { if ( ! $writable ) { $message = sprintf( /* translators: %s: web.config */ __( 'You should update your %s file now.' ), '<code>web.config</code>' ); } else { $message = sprintf( /* translators: %s: web.config */ __( 'Permalink structure updated. Remove write access on %s file now!' ), '<code>web.config</code>' ); } } elseif ( ! $is_nginx && ! $is_caddy && $htaccess_update_required && ! $writable ) { $message = sprintf( /* translators: %s: .htaccess */ __( 'You should update your %s file now.' ), '<code>.htaccess</code>' ); } } if ( ! get_settings_errors() ) { add_settings_error( 'general', 'settings_updated', $message, 'success' ); } set_transient( 'settings_errors', get_settings_errors(), 30 ); // 30 seconds. wp_redirect( admin_url( 'options-permalink.php?settings-updated=true' ) ); exit; } flush_rewrite_rules(); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <form name="form" action="options-permalink.php" method="post"> <?php wp_nonce_field( 'update-permalink' ); ?> <p> <?php printf( /* translators: %s: Documentation URL. */ __( 'WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A <a href="%s">number of tags are available</a>, and here are some examples to get you started.' ), __( 'https://wordpress.org/documentation/article/customize-permalinks/' ) ); ?> </p> <?php if ( is_multisite() && ! is_subdomain_install() && is_main_site() && str_starts_with( $permalink_structure, '/blog/' ) ) { $permalink_structure = preg_replace( '|^/?blog|', '', $permalink_structure ); $category_base = preg_replace( '|^/?blog|', '', $category_base ); $tag_base = preg_replace( '|^/?blog|', '', $tag_base ); } $url_base = home_url( $blog_prefix . $index_php_prefix ); $default_structures = array( array( 'id' => 'plain', 'label' => __( 'Plain' ), 'value' => '', 'example' => home_url( '/?p=123' ), ), array( 'id' => 'day-name', 'label' => __( 'Day and name' ), 'value' => $index_php_prefix . '/%year%/%monthnum%/%day%/%postname%/', 'example' => $url_base . '/' . gmdate( 'Y/m/d' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/', ), array( 'id' => 'month-name', 'label' => __( 'Month and name' ), 'value' => $index_php_prefix . '/%year%/%monthnum%/%postname%/', 'example' => $url_base . '/' . gmdate( 'Y/m' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/', ), array( 'id' => 'numeric', 'label' => __( 'Numeric' ), 'value' => $index_php_prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/%post_id%', 'example' => $url_base . '/' . _x( 'archives', 'sample permalink base' ) . '/123', ), array( 'id' => 'post-name', 'label' => __( 'Post name' ), 'value' => $index_php_prefix . '/%postname%/', 'example' => $url_base . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/', ), ); $default_structure_values = wp_list_pluck( $default_structures, 'value' ); $available_tags = array( /* translators: %s: Permalink structure tag. */ 'year' => __( '%s (The year of the post, four digits, for example 2004.)' ), /* translators: %s: Permalink structure tag. */ 'monthnum' => __( '%s (Month of the year, for example 05.)' ), /* translators: %s: Permalink structure tag. */ 'day' => __( '%s (Day of the month, for example 28.)' ), /* translators: %s: Permalink structure tag. */ 'hour' => __( '%s (Hour of the day, for example 15.)' ), /* translators: %s: Permalink structure tag. */ 'minute' => __( '%s (Minute of the hour, for example 43.)' ), /* translators: %s: Permalink structure tag. */ 'second' => __( '%s (Second of the minute, for example 33.)' ), /* translators: %s: Permalink structure tag. */ 'post_id' => __( '%s (The unique ID of the post, for example 423.)' ), /* translators: %s: Permalink structure tag. */ 'postname' => __( '%s (The sanitized post title (slug).)' ), /* translators: %s: Permalink structure tag. */ 'category' => __( '%s (Category slug. Nested sub-categories appear as nested directories in the URL.)' ), /* translators: %s: Permalink structure tag. */ 'author' => __( '%s (A sanitized version of the author name.)' ), ); /** * Filters the list of available permalink structure tags on the Permalinks settings page. * * @since 4.9.0 * * @param string[] $available_tags An array of key => value pairs of available permalink structure tags. */ $available_tags = apply_filters( 'available_permalink_structure_tags', $available_tags ); /* translators: %s: Permalink structure tag. */ $tag_added = __( '%s added to permalink structure' ); /* translators: %s: Permalink structure tag. */ $tag_removed = __( '%s removed from permalink structure' ); /* translators: %s: Permalink structure tag. */ $tag_already_used = __( '%s (already used in permalink structure)' ); ?> <h2 class="title"><?php _e( 'Common Settings' ); ?></h2> <p> <?php printf( /* translators: %s: %postname% */ __( 'Select the permalink structure for your website. Including the %s tag makes links easy to understand, and can help your posts rank higher in search engines.' ), '<code>%postname%</code>' ); ?> </p> <table class="form-table permalink-structure" role="presentation"> <tbody> <tr> <th scope="row"><?php _e( 'Permalink structure' ); ?></th> <td> <fieldset class="structure-selection"> <legend class="screen-reader-text"> <?php /* translators: Hidden accessibility text. */ _e( 'Permalink structure' ); ?> </legend> <?php foreach ( $default_structures as $input ) : ?> <div class="row"> <input id="permalink-input-<?php echo esc_attr( $input['id'] ); ?>" name="selection" aria-describedby="permalink-<?php echo esc_attr( $input['id'] ); ?>" type="radio" value="<?php echo esc_attr( $input['value'] ); ?>" <?php checked( $input['value'], $permalink_structure ); ?> /> <div> <label for="permalink-input-<?php echo esc_attr( $input['id'] ); ?>"> <?php echo esc_html( $input['label'] ); ?> </label> <p> <code id="permalink-<?php echo esc_attr( $input['id'] ); ?>"> <?php echo esc_html( $input['example'] ); ?> </code> </p> </div> </div><!-- .row --> <?php endforeach; ?> <div class="row"> <input id="custom_selection" name="selection" type="radio" value="custom" <?php checked( ! in_array( $permalink_structure, $default_structure_values, true ) ); ?> /> <div> <label for="custom_selection"><?php _e( 'Custom Structure' ); ?></label> <p> <label for="permalink_structure" class="screen-reader-text"> <?php /* translators: Hidden accessibility text. */ _e( 'Customize permalink structure by selecting available tags' ); ?> </label> <span class="code"> <code id="permalink-custom"><?php echo esc_url( $url_base ); ?></code> <input name="permalink_structure" id="permalink_structure" type="text" value="<?php echo esc_attr( $permalink_structure ); ?>" aria-describedby="permalink-custom" class="regular-text code" /> </span> </p> <div class="available-structure-tags hide-if-no-js"> <div id="custom_selection_updated" aria-live="assertive" class="screen-reader-text"></div> <?php if ( ! empty( $available_tags ) ) : ?> <fieldset> <legend><?php _e( 'Available tags:' ); ?></legend> <ul role="list"> <?php foreach ( $available_tags as $tag => $explanation ) : ?> <li> <button type="button" class="button button-secondary" aria-label="<?php echo esc_attr( sprintf( $explanation, $tag ) ); ?>" data-added="<?php echo esc_attr( sprintf( $tag_added, $tag ) ); ?>" data-removed="<?php echo esc_attr( sprintf( $tag_removed, $tag ) ); ?>" data-used="<?php echo esc_attr( sprintf( $tag_already_used, $tag ) ); ?>"> <?php echo '%' . esc_html( $tag ) . '%'; ?> </button> </li> <?php endforeach; ?> </ul> </fieldset> <?php endif; ?> </div><!-- .available-structure-tags --> </div> </div><!-- .row --> </fieldset><!-- .structure-selection --> </td> </tr> </tbody> </table> <h2 class="title"><?php _e( 'Optional' ); ?></h2> <p> <?php printf( /* translators: %s: Placeholder that must come at the start of the URL. */ __( 'If you like, you may enter custom structures for your category and tag URLs here. For example, using <code>topics</code> as your category base would make your category links like <code>%s/topics/uncategorized/</code>. If you leave these blank the defaults will be used.' ), $url_base ); ?> </p> <table class="form-table" role="presentation"> <tr> <th> <label for="category_base"> <?php /* translators: Prefix for category permalinks. */ _e( 'Category base' ); ?> </label> </th> <td> <?php echo $blog_prefix; ?> <input name="category_base" id="category_base" type="text" value="<?php echo esc_attr( $category_base ); ?>" class="regular-text code" /> </td> </tr> <tr> <th> <label for="tag_base"><?php _e( 'Tag base' ); ?></label> </th> <td> <?php echo $blog_prefix; ?> <input name="tag_base" id="tag_base" type="text" value="<?php echo esc_attr( $tag_base ); ?>" class="regular-text code" /> </td> </tr> <?php do_settings_fields( 'permalink', 'optional' ); ?> </table> <?php do_settings_sections( 'permalink' ); ?> <?php submit_button(); ?> </form> <?php if ( ! is_multisite() ) : ?> <?php if ( $iis7_permalinks ) : if ( isset( $_POST['submit'] ) && $permalink_structure && ! $using_index_permalinks && ! $writable ) : if ( file_exists( $home_path . 'web.config' ) ) : ?> <p id="iis-description-a"> <?php printf( /* translators: 1: web.config, 2: Documentation URL, 3: Ctrl + A, 4: ⌘ + A, 5: Element code. */ __( '<strong>Error:</strong> Your %1$s file is not <a href="%2$s">writable</a>, so updating it automatically was not possible. This is the URL rewrite rule you should have in your %1$s file. Click in the field and press %3$s (or %4$s on Mac) to select all. Then insert this rule inside of the %5$s element in %1$s file.' ), '<code>web.config</code>', __( 'https://developer.wordpress.org/advanced-administration/server/file-permissions/' ), '<kbd>Ctrl + A</kbd>', '<kbd>⌘ + A</kbd>', '<code>/<configuration>/<system.webServer>/<rewrite>/<rules></code>' ); ?> </p> <form action="options-permalink.php" method="post"> <?php wp_nonce_field( 'update-permalink' ); ?> <p> <label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br /> <textarea rows="9" class="large-text readonly" name="rules" id="rules" readonly="readonly" aria-describedby="iis-description-a" ><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules() ); ?></textarea> </p> </form> <p> <?php printf( /* translators: %s: web.config */ __( 'If you temporarily make your %s file writable to generate rewrite rules automatically, do not forget to revert the permissions after the rule has been saved.' ), '<code>web.config</code>' ); ?> </p> <?php else : ?> <p id="iis-description-b"> <?php printf( /* translators: 1: Documentation URL, 2: web.config, 3: Ctrl + A, 4: ⌘ + A */ __( '<strong>Error:</strong> The root directory of your site is not <a href="%1$s">writable</a>, so creating a file automatically was not possible. This is the URL rewrite rule you should have in your %2$s file. Create a new file called %2$s in the root directory of your site. Click in the field and press %3$s (or %4$s on Mac) to select all. Then insert this code into the %2$s file.' ), __( 'https://developer.wordpress.org/advanced-administration/server/file-permissions/' ), '<code>web.config</code>', '<kbd>Ctrl + A</kbd>', '<kbd>⌘ + A</kbd>' ); ?> </p> <form action="options-permalink.php" method="post"> <?php wp_nonce_field( 'update-permalink' ); ?> <p> <label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br /> <textarea rows="18" class="large-text readonly" name="rules" id="rules" readonly="readonly" aria-describedby="iis-description-b" ><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules( true ) ); ?></textarea> </p> </form> <p> <?php printf( /* translators: %s: web.config */ __( 'If you temporarily make your site’s root directory writable to generate the %s file automatically, do not forget to revert the permissions after the file has been created.' ), '<code>web.config</code>' ); ?> </p> <?php endif; // End if 'web.config' exists. ?> <?php endif; // End if $_POST['submit'] && ! $writable. ?> <?php else : ?> <?php if ( $permalink_structure && ! $using_index_permalinks && ! $writable && $htaccess_update_required ) : ?> <p id="htaccess-description"> <?php printf( /* translators: 1: .htaccess, 2: Documentation URL, 3: Ctrl + A, 4: ⌘ + A */ __( '<strong>Error:</strong> Your %1$s file is not <a href="%2$s">writable</a>, so updating it automatically was not possible. These are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s (or %4$s on Mac) to select all.' ), '<code>.htaccess</code>', __( 'https://developer.wordpress.org/advanced-administration/server/file-permissions/' ), '<kbd>Ctrl + A</kbd>', '<kbd>⌘ + A</kbd>' ); ?> </p> <form action="options-permalink.php" method="post"> <?php wp_nonce_field( 'update-permalink' ); ?> <p> <label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br /> <textarea rows="8" class="large-text readonly" name="rules" id="rules" readonly="readonly" aria-describedby="htaccess-description" ><?php echo esc_textarea( $wp_rewrite->mod_rewrite_rules() ); ?></textarea> </p> </form> <?php endif; // End if ! $writable && $htaccess_update_required. ?> <?php endif; // End if $iis7_permalinks. ?> <?php endif; // End if ! is_multisite(). ?> </div><!-- .wrap --> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> plugin-editor.php 0000644 00000033247 15151241213 0010043 0 ustar 00 <?php /** * Edit plugin file editor administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( is_multisite() && ! is_network_admin() ) { wp_redirect( network_admin_url( 'plugin-editor.php' ) ); exit; } if ( ! current_user_can( 'edit_plugins' ) ) { wp_die( __( 'Sorry, you are not allowed to edit plugins for this site.' ) ); } // Used in the HTML title tag. $title = __( 'Edit Plugins' ); $parent_file = 'plugins.php'; $plugins = get_plugins(); if ( empty( $plugins ) ) { require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <?php wp_admin_notice( __( 'No plugins are currently available.' ), array( 'id' => 'message', 'additional_classes' => array( 'error' ), ) ); ?> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; exit; } $file = ''; $plugin = ''; if ( isset( $_REQUEST['file'] ) ) { $file = wp_unslash( $_REQUEST['file'] ); } if ( isset( $_REQUEST['plugin'] ) ) { $plugin = wp_unslash( $_REQUEST['plugin'] ); } if ( empty( $plugin ) ) { if ( $file ) { // Locate the plugin for a given plugin file being edited. $file_dirname = dirname( $file ); foreach ( array_keys( $plugins ) as $plugin_candidate ) { if ( $plugin_candidate === $file || ( '.' !== $file_dirname && dirname( $plugin_candidate ) === $file_dirname ) ) { $plugin = $plugin_candidate; break; } } // Fallback to the file as the plugin. if ( empty( $plugin ) ) { $plugin = $file; } } else { $plugin = array_keys( $plugins ); $plugin = $plugin[0]; } } $plugin_files = get_plugin_files( $plugin ); if ( empty( $file ) ) { $file = $plugin_files[0]; } $file = validate_file_to_edit( $file, $plugin_files ); $real_file = WP_PLUGIN_DIR . '/' . $file; $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_files[0] ); $plugin_name = $plugin_data['Name']; // Handle fallback editing of file when JavaScript is not available. $edit_error = null; $posted_content = null; if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) { $r = wp_edit_theme_plugin_file( wp_unslash( $_POST ) ); if ( is_wp_error( $r ) ) { $edit_error = $r; if ( check_ajax_referer( 'edit-plugin_' . $file, 'nonce', false ) && isset( $_POST['newcontent'] ) ) { $posted_content = wp_unslash( $_POST['newcontent'] ); } } else { wp_redirect( add_query_arg( array( 'a' => 1, // This means "success" for some reason. 'plugin' => $plugin, 'file' => $file, ), admin_url( 'plugin-editor.php' ) ) ); exit; } } // List of allowable extensions. $editable_extensions = wp_get_plugin_file_editable_extensions( $plugin ); if ( ! is_file( $real_file ) ) { wp_die( sprintf( '<p>%s</p>', __( 'File does not exist! Please double check the name and try again.' ) ) ); } else { // Get the extension of the file. if ( preg_match( '/\.([^.]+)$/', $real_file, $matches ) ) { $ext = strtolower( $matches[1] ); // If extension is not in the acceptable list, skip it. if ( ! in_array( $ext, $editable_extensions, true ) ) { wp_die( sprintf( '<p>%s</p>', __( 'Files of this type are not editable.' ) ) ); } } } get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'You can use the plugin file editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations.' ) . '</p>' . '<p>' . __( 'Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Do not forget to save your changes (Update File) when you are finished.' ) . '</p>' . '<p>' . __( 'The documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function.' ) . '</p>' . '<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>' . '<ul>' . '<li id="editor-keyboard-trap-help-2">' . __( 'In the editing area, the Tab key enters a tab character.' ) . '</li>' . '<li id="editor-keyboard-trap-help-3">' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '</li>' . '<li id="editor-keyboard-trap-help-4">' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '</li>' . '</ul>' . '<p>' . __( 'If you want to make changes but do not want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below.' ) . '</p>' . ( is_network_admin() ? '<p>' . __( 'Any edits to files from this screen will be reflected on all sites in the network.' ) . '</p>' : '' ), ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/plugins/editor-screen/">Documentation on Editing Plugins</a>' ) . '</p>' . '<p>' . __( '<a href="https://developer.wordpress.org/plugins/">Documentation on Writing Plugins</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); $settings = array( 'codeEditor' => wp_enqueue_code_editor( array( 'file' => $real_file ) ), ); wp_enqueue_script( 'wp-theme-plugin-editor' ); wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'jQuery( function( $ ) { wp.themePluginEditor.init( $( "#template" ), %s ); } )', wp_json_encode( $settings ) ) ); wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'wp.themePluginEditor.themeOrPlugin = "plugin";' ) ); require_once ABSPATH . 'wp-admin/admin-header.php'; update_recently_edited( WP_PLUGIN_DIR . '/' . $file ); if ( ! empty( $posted_content ) ) { $content = $posted_content; } else { $content = file_get_contents( $real_file ); } if ( str_ends_with( $real_file, '.php' ) ) { $functions = wp_doc_link_parse( $content ); if ( ! empty( $functions ) ) { $docs_select = '<select name="docs-list" id="docs-list">'; $docs_select .= '<option value="">' . esc_html__( 'Function Name…' ) . '</option>'; foreach ( $functions as $function ) { $docs_select .= '<option value="' . esc_attr( $function ) . '">' . esc_html( $function ) . '()</option>'; } $docs_select .= '</select>'; } } $content = esc_textarea( $content ); ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <?php if ( isset( $_GET['a'] ) ) : wp_admin_notice( __( 'File edited successfully.' ), array( 'additional_classes' => array( 'updated', 'is-dismissible' ), 'id' => 'message', ) ); elseif ( is_wp_error( $edit_error ) ) : $error = esc_html( $edit_error->get_error_message() ? $edit_error->get_error_message() : $edit_error->get_error_code() ); $message = '<p>' . __( 'There was an error while trying to update the file. You may need to fix something and try updating again.' ) . '</p> <pre>' . $error . '</pre>'; wp_admin_notice( $message, array( 'type' => 'error', 'id' => 'message', 'paragraph_wrap' => false, ) ); endif; ?> <div class="fileedit-sub"> <div class="alignleft"> <h2> <?php if ( is_plugin_active( $plugin ) ) { if ( is_writable( $real_file ) ) { /* translators: %s: Plugin name. */ printf( __( 'Editing %s (active)' ), '<strong>' . esc_html( $plugin_name ) . '</strong>' ); } else { /* translators: %s: Plugin name. */ printf( __( 'Browsing %s (active)' ), '<strong>' . esc_html( $plugin_name ) . '</strong>' ); } } else { if ( is_writable( $real_file ) ) { /* translators: %s: Plugin name. */ printf( __( 'Editing %s (inactive)' ), '<strong>' . esc_html( $plugin_name ) . '</strong>' ); } else { /* translators: %s: Plugin name. */ printf( __( 'Browsing %s (inactive)' ), '<strong>' . esc_html( $plugin_name ) . '</strong>' ); } } ?> </h2> <?php printf( /* translators: %s: File path. */ ' <span><strong>' . __( 'File: %s' ) . '</strong></span>', esc_html( $file ) ); ?> </div> <div class="alignright"> <form action="plugin-editor.php" method="get"> <label for="plugin" id="theme-plugin-editor-selector"><?php _e( 'Select plugin to edit:' ); ?> </label> <select name="plugin" id="plugin"> <?php foreach ( $plugins as $plugin_key => $a_plugin ) { $plugin_name = $a_plugin['Name']; if ( $plugin_key === $plugin ) { $selected = " selected='selected'"; } else { $selected = ''; } $plugin_name = esc_attr( $plugin_name ); $plugin_key = esc_attr( $plugin_key ); echo "\n\t<option value=\"$plugin_key\" $selected>$plugin_name</option>"; } ?> </select> <?php submit_button( __( 'Select' ), '', 'Submit', false ); ?> </form> </div> <br class="clear" /> </div> <div id="templateside"> <h2 id="plugin-files-label"><?php _e( 'Plugin Files' ); ?></h2> <?php $plugin_editable_files = array(); foreach ( $plugin_files as $plugin_file ) { if ( preg_match( '/\.([^.]+)$/', $plugin_file, $matches ) && in_array( $matches[1], $editable_extensions, true ) ) { $plugin_editable_files[] = $plugin_file; } } ?> <ul role="tree" aria-labelledby="plugin-files-label"> <li role="treeitem" tabindex="-1" aria-expanded="true" aria-level="1" aria-posinset="1" aria-setsize="1"> <ul role="group"> <?php wp_print_plugin_file_tree( wp_make_plugin_file_tree( $plugin_editable_files ) ); ?> </ul> </ul> </div> <form name="template" id="template" action="plugin-editor.php" method="post"> <?php wp_nonce_field( 'edit-plugin_' . $file, 'nonce' ); ?> <div> <label for="newcontent" id="theme-plugin-editor-label"><?php _e( 'Selected file content:' ); ?></label> <textarea cols="70" rows="25" name="newcontent" id="newcontent" aria-describedby="editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4"><?php echo $content; ?></textarea> <input type="hidden" name="action" value="update" /> <input type="hidden" name="file" value="<?php echo esc_attr( $file ); ?>" /> <input type="hidden" name="plugin" value="<?php echo esc_attr( $plugin ); ?>" /> </div> <?php if ( ! empty( $docs_select ) ) : ?> <div id="documentation" class="hide-if-no-js"> <label for="docs-list"><?php _e( 'Documentation:' ); ?></label> <?php echo $docs_select; ?> <input disabled id="docs-lookup" type="button" class="button" value="<?php esc_attr_e( 'Look Up' ); ?>" onclick="if ( '' !== jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&locale=<?php echo urlencode( get_user_locale() ); ?>&version=<?php echo urlencode( get_bloginfo( 'version' ) ); ?>&redirect=true'); }" /> </div> <?php endif; ?> <?php if ( is_writable( $real_file ) ) : ?> <div class="editor-notices"> <?php if ( in_array( $plugin, (array) get_option( 'active_plugins', array() ), true ) ) { wp_admin_notice( __( '<strong>Warning:</strong> Making changes to active plugins is not recommended.' ), array( 'type' => 'warning', 'additional_classes' => array( 'inline', 'active-plugin-edit-warning' ), ) ); } ?> </div> <p class="submit"> <?php submit_button( __( 'Update File' ), 'primary', 'submit', false ); ?> <span class="spinner"></span> </p> <?php else : ?> <p> <?php printf( /* translators: %s: Documentation URL. */ __( 'You need to make this file writable before you can save your changes. See <a href="%s">Changing File Permissions</a> for more information.' ), __( 'https://developer.wordpress.org/advanced-administration/server/file-permissions/' ) ); ?> </p> <?php endif; ?> <?php wp_print_file_editor_templates(); ?> </form> <br class="clear" /> </div> <?php $dismissed_pointers = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ); if ( ! in_array( 'plugin_editor_notice', $dismissed_pointers, true ) ) : // Get a back URL. $referer = wp_get_referer(); $excluded_referer_basenames = array( 'plugin-editor.php', 'wp-login.php' ); $return_url = admin_url( '/' ); if ( $referer ) { $referer_path = parse_url( $referer, PHP_URL_PATH ); if ( is_string( $referer_path ) && ! in_array( basename( $referer_path ), $excluded_referer_basenames, true ) ) { $return_url = $referer; } } ?> <div id="file-editor-warning" class="notification-dialog-wrap file-editor-warning hide-if-no-js hidden"> <div class="notification-dialog-background"></div> <div class="notification-dialog"> <div class="file-editor-warning-content"> <div class="file-editor-warning-message"> <h1><?php _e( 'Heads up!' ); ?></h1> <p><?php _e( 'You appear to be making direct edits to your plugin in the WordPress dashboard. Editing plugins directly is not recommended as it may introduce incompatibilities that break your site and your changes may be lost in future updates.' ); ?></p> <p><?php _e( 'If you absolutely have to make direct edits to this plugin, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong.' ); ?></p> </div> <p> <a class="button file-editor-warning-go-back" href="<?php echo esc_url( $return_url ); ?>"><?php _e( 'Go back' ); ?></a> <button type="button" class="file-editor-warning-dismiss button button-primary"><?php _e( 'I understand' ); ?></button> </p> </div> </div> </div> <?php endif; // Editor warning notice. require_once ABSPATH . 'wp-admin/admin-footer.php'; options-discussion.php 0000644 00000036627 15151241215 0011144 0 ustar 00 <?php /** * Discussion settings administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'manage_options' ) ) { wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) ); } // Used in the HTML title tag. $title = __( 'Discussion Settings' ); $parent_file = 'options-general.php'; add_action( 'admin_print_footer_scripts', 'options_discussion_add_js' ); get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they will not all fit here! :) Use the documentation links to get information on what each discussion setting does.' ) . '</p>' . '<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-discussion-screen/">Documentation on Discussion Settings</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <form method="post" action="options.php"> <?php settings_fields( 'discussion' ); ?> <table class="form-table indent-children" role="presentation"> <tr> <th scope="row"><?php _e( 'Default post settings' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Default post settings' ); ?> </span></legend> <label for="default_pingback_flag"> <input name="default_pingback_flag" type="checkbox" id="default_pingback_flag" value="1" <?php checked( '1', get_option( 'default_pingback_flag' ) ); ?> /> <?php _e( 'Attempt to notify any blogs linked to from the post' ); ?></label> <br /> <label for="default_ping_status"> <input name="default_ping_status" type="checkbox" id="default_ping_status" value="open" <?php checked( 'open', get_option( 'default_ping_status' ) ); ?> /> <?php _e( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new posts' ); ?></label> <br /> <label for="default_comment_status"> <input name="default_comment_status" type="checkbox" id="default_comment_status" value="open" <?php checked( 'open', get_option( 'default_comment_status' ) ); ?> /> <?php _e( 'Allow people to submit comments on new posts' ); ?></label> <br /> <p class="description"><?php _e( 'Individual posts may override these settings. Changes here will only be applied to new posts.' ); ?></p> </fieldset></td> </tr> <tr> <th scope="row"><?php _e( 'Other comment settings' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Other comment settings' ); ?> </span></legend> <label for="require_name_email"><input type="checkbox" name="require_name_email" id="require_name_email" value="1" <?php checked( '1', get_option( 'require_name_email' ) ); ?> /> <?php _e( 'Comment author must fill out name and email' ); ?></label> <br /> <label for="comment_registration"> <input name="comment_registration" type="checkbox" id="comment_registration" value="1" <?php checked( '1', get_option( 'comment_registration' ) ); ?> /> <?php _e( 'Users must be registered and logged in to comment' ); ?> <?php if ( ! get_option( 'users_can_register' ) && is_multisite() ) { echo ' ' . __( '(Signup has been disabled. Only members of this site can comment.)' ); } ?> </label> <br /> <input name="close_comments_for_old_posts" type="checkbox" id="close_comments_for_old_posts" value="1" <?php checked( '1', get_option( 'close_comments_for_old_posts' ) ); ?> /> <label for="close_comments_for_old_posts"><?php _e( 'Automatically close comments on old posts' ); ?></label> <ul> <li> <label for="close_comments_days_old"><?php _e( 'Close comments when post is how many days old' ); ?></label> <input name="close_comments_days_old" type="number" step="1" min="0" id="close_comments_days_old" value="<?php echo esc_attr( get_option( 'close_comments_days_old' ) ); ?>" class="small-text" /> </li> </ul> <input name="show_comments_cookies_opt_in" type="checkbox" id="show_comments_cookies_opt_in" value="1" <?php checked( '1', get_option( 'show_comments_cookies_opt_in' ) ); ?> /> <label for="show_comments_cookies_opt_in"><?php _e( 'Show comments cookies opt-in checkbox, allowing comment author cookies to be set' ); ?></label> <br /> <input name="thread_comments" type="checkbox" id="thread_comments" value="1" <?php checked( '1', get_option( 'thread_comments' ) ); ?> /> <label for="thread_comments"><?php _e( 'Enable threaded (nested) comments' ); ?></label> <?php /** * Filters the maximum depth of threaded/nested comments. * * @since 2.7.0 * * @param int $max_depth The maximum depth of threaded comments. Default 10. */ $maxdeep = (int) apply_filters( 'thread_comments_depth_max', 10 ); $thread_comments_depth = '<select name="thread_comments_depth" id="thread_comments_depth">'; for ( $i = 2; $i <= $maxdeep; $i++ ) { $thread_comments_depth .= "<option value='" . esc_attr( $i ) . "'"; if ( (int) get_option( 'thread_comments_depth' ) === $i ) { $thread_comments_depth .= " selected='selected'"; } $thread_comments_depth .= ">$i</option>"; } $thread_comments_depth .= '</select>'; ?> <ul> <li> <label for="thread_comments_depth"><?php _e( 'Number of levels for threaded (nested) comments' ); ?></label> <?php echo $thread_comments_depth; ?> </li> </ul> </fieldset></td> </tr> <tr> <th scope="row"><?php _e( 'Comment Pagination' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Comment Pagination' ); ?> </span></legend> <input name="page_comments" type="checkbox" id="page_comments" value="1" <?php checked( '1', get_option( 'page_comments' ) ); ?> /> <label for="page_comments"><?php _e( 'Break comments into pages' ); ?></label> <ul> <li> <label for="comments_per_page"><?php _e( 'Top level comments per page' ); ?></label> <input name="comments_per_page" type="number" step="1" min="0" id="comments_per_page" value="<?php echo esc_attr( get_option( 'comments_per_page' ) ); ?>" class="small-text" /> </li> <li> <label for="default_comments_page"><?php _e( 'Comments page to display by default' ); ?></label> <select name="default_comments_page" id="default_comments_page"> <option value="newest" <?php selected( 'newest', get_option( 'default_comments_page' ) ); ?>><?php _e( 'last page' ); ?></option> <option value="oldest" <?php selected( 'oldest', get_option( 'default_comments_page' ) ); ?>><?php _e( 'first page' ); ?></option> </select> </li> <li> <label for="comment_order"><?php _e( 'Comments to display at the top of each page' ); ?></label> <select name="comment_order" id="comment_order"> <option value="asc" <?php selected( 'asc', get_option( 'comment_order' ) ); ?>><?php _e( 'older' ); ?></option> <option value="desc" <?php selected( 'desc', get_option( 'comment_order' ) ); ?>><?php _e( 'newer' ); ?></option> </select> </li> </ul> </fieldset></td> </tr> <tr> <th scope="row"><?php _e( 'Email me whenever' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Email me whenever' ); ?> </span></legend> <label for="comments_notify"> <input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked( '1', get_option( 'comments_notify' ) ); ?> /> <?php _e( 'Anyone posts a comment' ); ?> </label> <br /> <label for="moderation_notify"> <input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked( '1', get_option( 'moderation_notify' ) ); ?> /> <?php _e( 'A comment is held for moderation' ); ?> </label> </fieldset></td> </tr> <tr> <th scope="row"><?php _e( 'Before a comment appears' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Before a comment appears' ); ?> </span></legend> <label for="comment_moderation"> <input name="comment_moderation" type="checkbox" id="comment_moderation" value="1" <?php checked( '1', get_option( 'comment_moderation' ) ); ?> /> <?php _e( 'Comment must be manually approved' ); ?> </label> <br /> <label for="comment_previously_approved"><input type="checkbox" name="comment_previously_approved" id="comment_previously_approved" value="1" <?php checked( '1', get_option( 'comment_previously_approved' ) ); ?> /> <?php _e( 'Comment author must have a previously approved comment' ); ?></label> </fieldset></td> </tr> <tr> <th scope="row"><?php _e( 'Comment Moderation' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Comment Moderation' ); ?> </span></legend> <p><label for="comment_max_links"> <?php printf( /* translators: %s: Number of links. */ __( 'Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)' ), '<input name="comment_max_links" type="number" step="1" min="0" id="comment_max_links" value="' . esc_attr( get_option( 'comment_max_links' ) ) . '" class="small-text" />' ); ?> </label></p> <p><label for="moderation_keys"><?php _e( 'When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be held in the <a href="edit-comments.php?comment_status=moderated">moderation queue</a>. One word or IP address per line. It will match inside words, so “press” will match “WordPress”.' ); ?></label></p> <p> <textarea name="moderation_keys" rows="10" cols="50" id="moderation_keys" class="large-text code"><?php echo esc_textarea( get_option( 'moderation_keys' ) ); ?></textarea> </p> </fieldset></td> </tr> <tr> <th scope="row"><?php _e( 'Disallowed Comment Keys' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Disallowed Comment Keys' ); ?> </span></legend> <p><label for="disallowed_keys"><?php _e( 'When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be put in the Trash. One word or IP address per line. It will match inside words, so “press” will match “WordPress”.' ); ?></label></p> <p> <textarea name="disallowed_keys" rows="10" cols="50" id="disallowed_keys" class="large-text code"><?php echo esc_textarea( get_option( 'disallowed_keys' ) ); ?></textarea> </p> </fieldset></td> </tr> <?php do_settings_fields( 'discussion', 'default' ); ?> </table> <h2 class="title"><?php _e( 'Avatars' ); ?></h2> <p><?php _e( 'An avatar is an image that can be associated with a user across multiple websites. In this area, you can choose to display avatars of users who interact with the site.' ); ?></p> <?php // The above would be a good place to link to the documentation on the Gravatar functions, for putting it in themes. Anything like that? $show_avatars = get_option( 'show_avatars' ); $show_avatars_class = ''; if ( ! $show_avatars ) { $show_avatars_class = ' hide-if-js'; } ?> <table class="form-table" role="presentation"> <tr> <th scope="row"><?php _e( 'Avatar Display' ); ?></th> <td> <label for="show_avatars"> <input type="checkbox" id="show_avatars" name="show_avatars" value="1" <?php checked( $show_avatars, 1 ); ?> /> <?php _e( 'Show Avatars' ); ?> </label> </td> </tr> <tr class="avatar-settings<?php echo $show_avatars_class; ?>"> <th scope="row"><?php _e( 'Maximum Rating' ); ?></th> <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Maximum Rating' ); ?> </span></legend> <?php $ratings = array( /* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */ 'G' => __( 'G — Suitable for all audiences' ), /* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */ 'PG' => __( 'PG — Possibly offensive, usually for audiences 13 and above' ), /* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */ 'R' => __( 'R — Intended for adult audiences above 17' ), /* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */ 'X' => __( 'X — Even more mature than above' ), ); foreach ( $ratings as $key => $rating ) : $selected = ( get_option( 'avatar_rating' ) === $key ) ? 'checked="checked"' : ''; echo "\n\t<label><input type='radio' name='avatar_rating' value='" . esc_attr( $key ) . "' $selected/> $rating</label><br />"; endforeach; ?> </fieldset></td> </tr> <tr class="avatar-settings<?php echo $show_avatars_class; ?>"> <th scope="row"><?php _e( 'Default Avatar' ); ?></th> <td class="defaultavatarpicker"><fieldset><legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Default Avatar' ); ?> </span></legend> <p> <?php _e( 'For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their email address.' ); ?><br /> </p> <?php $avatar_defaults = array( 'mystery' => __( 'Mystery Person' ), 'blank' => __( 'Blank' ), 'gravatar_default' => __( 'Gravatar Logo' ), 'identicon' => __( 'Identicon (Generated)' ), 'wavatar' => __( 'Wavatar (Generated)' ), 'monsterid' => __( 'MonsterID (Generated)' ), 'retro' => __( 'Retro (Generated)' ), 'robohash' => __( 'RoboHash (Generated)' ), ); /** * Filters the default avatars. * * Avatars are stored in key/value pairs, where the key is option value, * and the name is the displayed avatar name. * * @since 2.6.0 * * @param string[] $avatar_defaults Associative array of default avatars. */ $avatar_defaults = apply_filters( 'avatar_defaults', $avatar_defaults ); $default = get_option( 'avatar_default', 'mystery' ); $avatar_list = ''; // Force avatars on to display these choices. add_filter( 'pre_option_show_avatars', '__return_true', 100 ); foreach ( $avatar_defaults as $default_key => $default_name ) { $selected = ( $default === $default_key ) ? 'checked="checked" ' : ''; $avatar_list .= "\n\t<label><input type='radio' name='avatar_default' id='avatar_{$default_key}' value='" . esc_attr( $default_key ) . "' {$selected}/> "; $avatar_list .= get_avatar( $user_email, 32, $default_key, '', array( 'force_default' => true ) ); $avatar_list .= ' ' . $default_name . '</label>'; $avatar_list .= '<br />'; } remove_filter( 'pre_option_show_avatars', '__return_true', 100 ); /** * Filters the HTML output of the default avatar list. * * @since 2.6.0 * * @param string $avatar_list HTML markup of the avatar list. */ echo apply_filters( 'default_avatar_select', $avatar_list ); ?> </fieldset></td> </tr> <?php do_settings_fields( 'discussion', 'avatars' ); ?> </table> <?php do_settings_sections( 'discussion' ); ?> <?php submit_button(); ?> </form> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> import.php 0000644 00000017126 15151241217 0006575 0 ustar 00 <?php /** * Import WordPress Administration Screen * * @package WordPress * @subpackage Administration */ define( 'WP_LOAD_IMPORTERS', true ); /** Load WordPress Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'import' ) ) { wp_die( __( 'Sorry, you are not allowed to import content into this site.' ) ); } // Used in the HTML title tag. $title = __( 'Import' ); get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform.' ) . '</p>' . '<p>' . __( 'In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-import-screen/">Documentation on Import</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); if ( current_user_can( 'install_plugins' ) ) { // List of popular importer plugins from the WordPress.org API. $popular_importers = wp_get_popular_importers(); } else { $popular_importers = array(); } // Detect and redirect invalid importers like 'movabletype', which is registered as 'mt'. if ( ! empty( $_GET['invalid'] ) && isset( $popular_importers[ $_GET['invalid'] ] ) ) { $importer_id = $popular_importers[ $_GET['invalid'] ]['importer-id']; if ( $importer_id !== $_GET['invalid'] ) { // Prevent redirect loops. wp_redirect( admin_url( 'admin.php?import=' . $importer_id ) ); exit; } unset( $importer_id ); } add_thickbox(); wp_enqueue_script( 'plugin-install' ); wp_enqueue_script( 'updates' ); require_once ABSPATH . 'wp-admin/admin-header.php'; $parent_file = 'tools.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <?php if ( ! empty( $_GET['invalid'] ) ) : $importer_not_installed = '<strong>' . __( 'Error:' ) . '</strong> ' . sprintf( /* translators: %s: Importer slug. */ __( 'The %s importer is invalid or is not installed.' ), '<strong>' . esc_html( $_GET['invalid'] ) . '</strong>' ); wp_admin_notice( $importer_not_installed, array( 'additional_classes' => array( 'error' ), ) ); endif; ?> <p><?php _e( 'If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:' ); ?></p> <?php // Registered (already installed) importers. They're stored in the global $wp_importers. $importers = get_importers(); // If a popular importer is not registered, create a dummy registration that links to the plugin installer. foreach ( $popular_importers as $pop_importer => $pop_data ) { if ( isset( $importers[ $pop_importer ] ) ) { continue; } if ( isset( $importers[ $pop_data['importer-id'] ] ) ) { continue; } // Fill the array of registered (already installed) importers with data of the popular importers from the WordPress.org API. $importers[ $pop_data['importer-id'] ] = array( $pop_data['name'], $pop_data['description'], 'install' => $pop_data['plugin-slug'], ); } if ( empty( $importers ) ) { echo '<p>' . __( 'No importers are available.' ) . '</p>'; // TODO: Make more helpful. } else { uasort( $importers, '_usort_by_first_member' ); ?> <table class="widefat importers striped"> <?php foreach ( $importers as $importer_id => $data ) { $plugin_slug = ''; $action = ''; $is_plugin_installed = false; if ( isset( $data['install'] ) ) { $plugin_slug = $data['install']; if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) { // Looks like an importer is installed, but not active. $plugins = get_plugins( '/' . $plugin_slug ); if ( ! empty( $plugins ) ) { $keys = array_keys( $plugins ); $plugin_file = $plugin_slug . '/' . $keys[0]; $url = wp_nonce_url( add_query_arg( array( 'action' => 'activate', 'plugin' => $plugin_file, 'from' => 'import', ), admin_url( 'plugins.php' ) ), 'activate-plugin_' . $plugin_file ); $action = sprintf( '<a href="%s" aria-label="%s">%s</a>', esc_url( $url ), /* translators: %s: Importer name. */ esc_attr( sprintf( __( 'Run %s' ), $data[0] ) ), __( 'Run Importer' ) ); $is_plugin_installed = true; } } if ( empty( $action ) ) { if ( is_main_site() ) { $url = wp_nonce_url( add_query_arg( array( 'action' => 'install-plugin', 'plugin' => $plugin_slug, 'from' => 'import', ), self_admin_url( 'update.php' ) ), 'install-plugin_' . $plugin_slug ); $action = sprintf( '<a href="%1$s" class="install-now" data-slug="%2$s" data-name="%3$s" aria-label="%4$s">%5$s</a>', esc_url( $url ), esc_attr( $plugin_slug ), esc_attr( $data[0] ), /* translators: %s: Importer name. */ esc_attr( sprintf( _x( 'Install %s now', 'plugin' ), $data[0] ) ), _x( 'Install Now', 'plugin' ) ); } else { $action = sprintf( /* translators: %s: URL to Import screen on the main site. */ __( 'This importer is not installed. Please install importers from <a href="%s">the main site</a>.' ), get_admin_url( get_current_network_id(), 'import.php' ) ); } } } else { $url = add_query_arg( array( 'import' => $importer_id, ), self_admin_url( 'admin.php' ) ); $action = sprintf( '<a href="%1$s" aria-label="%2$s">%3$s</a>', esc_url( $url ), /* translators: %s: Importer name. */ esc_attr( sprintf( __( 'Run %s' ), $data[0] ) ), __( 'Run Importer' ) ); $is_plugin_installed = true; } if ( ! $is_plugin_installed && is_main_site() ) { $url = add_query_arg( array( 'tab' => 'plugin-information', 'plugin' => $plugin_slug, 'from' => 'import', 'TB_iframe' => 'true', 'width' => 600, 'height' => 550, ), network_admin_url( 'plugin-install.php' ) ); $action .= sprintf( ' | <a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">%3$s</a>', esc_url( $url ), /* translators: %s: Importer name. */ esc_attr( sprintf( __( 'More information about %s' ), $data[0] ) ), __( 'Details' ) ); } echo " <tr class='importer-item'> <td class='import-system'> <span class='importer-title'>{$data[0]}</span> <span class='importer-action'>{$action}</span> </td> <td class='desc'> <span class='importer-desc'>{$data[1]}</span> </td> </tr>"; } ?> </table> <?php } if ( current_user_can( 'install_plugins' ) ) { echo '<p>' . sprintf( /* translators: %s: URL to Add Plugins screen. */ __( 'If the importer you need is not listed, <a href="%s">search the plugin directory</a> to see if an importer is available.' ), esc_url( network_admin_url( 'plugin-install.php?tab=search&type=tag&s=importer' ) ) ) . '</p>'; } /** * Fires at the end of the Import screen. * * @since 6.8.0 */ do_action( 'import_filters' ); ?> </div> <?php wp_print_request_filesystem_credentials_modal(); wp_print_admin_notice_templates(); require_once ABSPATH . 'wp-admin/admin-footer.php'; user-edit.php 0000644 00000117450 15151241220 0007157 0 ustar 00 <?php /** * Edit user administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; /** WordPress Translation Installation API */ require_once ABSPATH . 'wp-admin/includes/translation-install.php'; $action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : ''; $user_id = ! empty( $_REQUEST['user_id'] ) ? absint( $_REQUEST['user_id'] ) : 0; $wp_http_referer = ! empty( $_REQUEST['wp_http_referer'] ) ? sanitize_url( $_REQUEST['wp_http_referer'] ) : ''; $current_user = wp_get_current_user(); if ( ! defined( 'IS_PROFILE_PAGE' ) ) { define( 'IS_PROFILE_PAGE', ( $user_id === $current_user->ID ) ); } if ( ! $user_id && IS_PROFILE_PAGE ) { $user_id = $current_user->ID; } elseif ( ! $user_id && ! IS_PROFILE_PAGE ) { wp_die( __( 'Invalid user ID.' ) ); } elseif ( ! get_userdata( $user_id ) ) { wp_die( __( 'Invalid user ID.' ) ); } wp_enqueue_script( 'user-profile' ); if ( wp_is_application_passwords_available_for_user( $user_id ) ) { wp_enqueue_script( 'application-passwords' ); } if ( IS_PROFILE_PAGE ) { // Used in the HTML title tag. $title = __( 'Profile' ); } else { // Used in the HTML title tag. /* translators: %s: User's display name. */ $title = __( 'Edit User %s' ); } if ( current_user_can( 'edit_users' ) && ! IS_PROFILE_PAGE ) { $submenu_file = 'users.php'; } else { $submenu_file = 'profile.php'; } if ( current_user_can( 'edit_users' ) && ! is_user_admin() ) { $parent_file = 'users.php'; } else { $parent_file = 'profile.php'; } $profile_help = '<p>' . __( 'Your profile contains information about you (your “account”) as well as some personal options related to using WordPress.' ) . '</p>' . '<p>' . __( 'You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens.' ) . '</p>' . '<p>' . __( 'You can select the language you wish to use while using the WordPress administration screen without affecting the language site visitors see.' ) . '</p>' . '<p>' . __( 'Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts.' ) . '</p>' . '<p>' . __( 'You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button.' ) . '</p>' . '<p>' . __( 'Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so.' ) . '</p>' . '<p>' . __( 'Remember to click the Update Profile button when you are finished.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => $profile_help, ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/users-your-profile-screen/">Documentation on User Profiles</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); $wp_http_referer = remove_query_arg( array( 'update', 'delete_count', 'user_id' ), $wp_http_referer ); $user_can_edit = current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' ); /** * Filters whether to allow administrators on Multisite to edit every user. * * Enabling the user editing form via this filter also hinges on the user holding * the 'manage_network_users' cap, and the logged-in user not matching the user * profile open for editing. * * The filter was introduced to replace the EDIT_ANY_USER constant. * * @since 3.0.0 * * @param bool $allow Whether to allow editing of any user. Default true. */ if ( is_multisite() && ! current_user_can( 'manage_network_users' ) && $user_id !== $current_user->ID && ! apply_filters( 'enable_edit_any_user_configuration', true ) ) { wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); } // Execute confirmed email change. See send_confirmation_on_profile_email(). if ( IS_PROFILE_PAGE && isset( $_GET['newuseremail'] ) && $current_user->ID ) { $new_email = get_user_meta( $current_user->ID, '_new_email', true ); if ( $new_email && hash_equals( $new_email['hash'], $_GET['newuseremail'] ) ) { $user = new stdClass(); $user->ID = $current_user->ID; $user->user_email = esc_html( trim( $new_email['newemail'] ) ); if ( is_multisite() && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $current_user->user_login ) ) ) { $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) ); } wp_update_user( $user ); delete_user_meta( $current_user->ID, '_new_email' ); wp_redirect( add_query_arg( array( 'updated' => 'true' ), self_admin_url( 'profile.php' ) ) ); die(); } else { wp_redirect( add_query_arg( array( 'error' => 'new-email' ), self_admin_url( 'profile.php' ) ) ); } } elseif ( IS_PROFILE_PAGE && ! empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' === $_GET['dismiss'] ) { check_admin_referer( 'dismiss-' . $current_user->ID . '_new_email' ); delete_user_meta( $current_user->ID, '_new_email' ); wp_redirect( add_query_arg( array( 'updated' => 'true' ), self_admin_url( 'profile.php' ) ) ); die(); } switch ( $action ) { case 'update': check_admin_referer( 'update-user_' . $user_id ); if ( ! current_user_can( 'edit_user', $user_id ) ) { wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); } if ( IS_PROFILE_PAGE ) { /** * Fires before the page loads on the 'Profile' editing screen. * * The action only fires if the current user is editing their own profile. * * @since 2.0.0 * * @param int $user_id The user ID. */ do_action( 'personal_options_update', $user_id ); } else { /** * Fires before the page loads on the 'Edit User' screen. * * @since 2.7.0 * * @param int $user_id The user ID. */ do_action( 'edit_user_profile_update', $user_id ); } // Update the email address in signups, if present. if ( is_multisite() ) { $user = get_userdata( $user_id ); if ( $user->user_login && isset( $_POST['email'] ) && is_email( $_POST['email'] ) && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user->user_login ) ) ) { $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST['email'], $user_login ) ); } } // Update the user. $errors = edit_user( $user_id ); // Grant or revoke super admin status if requested. if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) && empty( $_POST['super_admin'] ) === is_super_admin( $user_id ) ) { empty( $_POST['super_admin'] ) ? revoke_super_admin( $user_id ) : grant_super_admin( $user_id ); } if ( ! is_wp_error( $errors ) ) { $redirect = add_query_arg( 'updated', true, get_edit_user_link( $user_id ) ); if ( $wp_http_referer ) { $redirect = add_query_arg( 'wp_http_referer', urlencode( $wp_http_referer ), $redirect ); } wp_redirect( $redirect ); exit; } // Intentional fall-through to display $errors. default: $profile_user = get_user_to_edit( $user_id ); if ( ! current_user_can( 'edit_user', $user_id ) ) { wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); } $title = sprintf( $title, $profile_user->display_name ); $sessions = WP_Session_Tokens::get_instance( $profile_user->ID ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <?php if ( ! IS_PROFILE_PAGE && is_super_admin( $profile_user->ID ) && current_user_can( 'manage_network_options' ) ) : $message = '<strong>' . __( 'Important:' ) . '</strong> ' . __( 'This user has super admin privileges.' ); wp_admin_notice( $message, array( 'type' => 'info', ) ); endif; if ( isset( $_GET['updated'] ) ) : if ( IS_PROFILE_PAGE ) : $message = '<p><strong>' . __( 'Profile updated.' ) . '</strong></p>'; else : $message = '<p><strong>' . __( 'User updated.' ) . '</strong></p>'; endif; if ( $wp_http_referer && ! str_contains( $wp_http_referer, 'user-new.php' ) && ! IS_PROFILE_PAGE ) : $message .= sprintf( '<p><a href="%1$s">%2$s</a></p>', esc_url( wp_validate_redirect( sanitize_url( $wp_http_referer ), self_admin_url( 'users.php' ) ) ), __( '← Go to Users' ) ); endif; wp_admin_notice( $message, array( 'id' => 'message', 'dismissible' => true, 'additional_classes' => array( 'updated' ), 'paragraph_wrap' => false, ) ); endif; if ( isset( $_GET['error'] ) ) : $message = ''; if ( 'new-email' === $_GET['error'] ) : $message = __( 'Error while saving the new email address. Please try again.' ); endif; wp_admin_notice( $message, array( 'type' => 'error', ) ); endif; if ( isset( $errors ) && is_wp_error( $errors ) ) { wp_admin_notice( implode( "</p>\n<p>", $errors->get_error_messages() ), array( 'additional_classes' => array( 'error' ), ) ); } ?> <div class="wrap" id="profile-page"> <h1 class="wp-heading-inline"> <?php echo esc_html( $title ); ?> </h1> <?php if ( ! IS_PROFILE_PAGE ) : ?> <?php if ( current_user_can( 'create_users' ) ) : ?> <a href="user-new.php" class="page-title-action"><?php echo esc_html__( 'Add User' ); ?></a> <?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?> <a href="user-new.php" class="page-title-action"><?php echo esc_html__( 'Add Existing User' ); ?></a> <?php endif; ?> <?php endif; ?> <hr class="wp-header-end"> <form id="your-profile" action="<?php echo esc_url( self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ); ?>" method="post" novalidate="novalidate" <?php /** * Fires inside the your-profile form tag on the user editing screen. * * @since 3.0.0 */ do_action( 'user_edit_form_tag' ); ?> > <?php wp_nonce_field( 'update-user_' . $user_id ); ?> <?php if ( $wp_http_referer ) : ?> <input type="hidden" name="wp_http_referer" value="<?php echo esc_url( $wp_http_referer ); ?>" /> <?php endif; ?> <p> <input type="hidden" name="from" value="profile" /> <input type="hidden" name="checkuser_id" value="<?php echo get_current_user_id(); ?>" /> </p> <h2><?php _e( 'Personal Options' ); ?></h2> <table class="form-table" role="presentation"> <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) && 'false' === $profile_user->rich_editing ) : ?> <tr class="user-rich-editing-wrap"> <th scope="row"><?php _e( 'Visual Editor' ); ?></th> <td> <label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="false" <?php checked( 'false', $profile_user->rich_editing ); ?> /> <?php _e( 'Disable the visual editor when writing' ); ?> </label> </td> </tr> <?php endif; ?> <?php $show_syntax_highlighting_preference = ( // For Custom HTML widget and Additional CSS in Customizer. user_can( $profile_user, 'edit_theme_options' ) || // Edit plugins. user_can( $profile_user, 'edit_plugins' ) || // Edit themes. user_can( $profile_user, 'edit_themes' ) ); ?> <?php if ( $show_syntax_highlighting_preference ) : ?> <tr class="user-syntax-highlighting-wrap"> <th scope="row"><?php _e( 'Syntax Highlighting' ); ?></th> <td> <label for="syntax_highlighting"><input name="syntax_highlighting" type="checkbox" id="syntax_highlighting" value="false" <?php checked( 'false', $profile_user->syntax_highlighting ); ?> /> <?php _e( 'Disable syntax highlighting when editing code' ); ?> </label> </td> </tr> <?php endif; ?> <?php if ( count( $_wp_admin_css_colors ) > 1 && has_action( 'admin_color_scheme_picker' ) ) : ?> <tr class="user-admin-color-wrap"> <th scope="row"><?php _e( 'Admin Color Scheme' ); ?></th> <td> <?php /** * Fires in the 'Admin Color Scheme' section of the user editing screen. * * The section is only enabled if a callback is hooked to the action, * and if there is more than one defined color scheme for the admin. * * @since 3.0.0 * @since 3.8.1 Added `$user_id` parameter. * * @param int $user_id The user ID. */ do_action( 'admin_color_scheme_picker', $user_id ); ?> </td> </tr> <?php endif; // End if count ( $_wp_admin_css_colors ) > 1 ?> <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> <tr class="user-comment-shortcuts-wrap"> <th scope="row"><?php _e( 'Keyboard Shortcuts' ); ?></th> <td> <label for="comment_shortcuts"> <input type="checkbox" name="comment_shortcuts" id="comment_shortcuts" value="true" <?php checked( 'true', $profile_user->comment_shortcuts ); ?> /> <?php _e( 'Enable keyboard shortcuts for comment moderation.' ); ?> </label> <?php _e( '<a href="https://wordpress.org/documentation/article/keyboard-shortcuts-classic-editor/#keyboard-shortcuts-for-comments">Documentation on Keyboard Shortcuts</a>' ); ?> </td> </tr> <?php endif; ?> <tr class="show-admin-bar user-admin-bar-front-wrap"> <th scope="row"><?php _e( 'Toolbar' ); ?></th> <td> <label for="admin_bar_front"> <input name="admin_bar_front" type="checkbox" id="admin_bar_front" value="1"<?php checked( _get_admin_bar_pref( 'front', $profile_user->ID ) ); ?> /> <?php _e( 'Show Toolbar when viewing site' ); ?> </label><br /> </td> </tr> <?php $languages = get_available_languages(); $can_install_translations = current_user_can( 'install_languages' ) && wp_can_install_language_pack(); ?> <?php if ( $languages || $can_install_translations ) : ?> <tr class="user-language-wrap"> <th scope="row"> <?php /* translators: The user language selection field label. */ ?> <label for="locale"><?php _e( 'Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span></label> </th> <td> <?php $user_locale = $profile_user->locale; if ( 'en_US' === $user_locale ) { $user_locale = ''; } elseif ( '' === $user_locale || ! in_array( $user_locale, $languages, true ) ) { $user_locale = 'site-default'; } wp_dropdown_languages( array( 'name' => 'locale', 'id' => 'locale', 'selected' => $user_locale, 'languages' => $languages, 'show_available_translations' => $can_install_translations, 'show_option_site_default' => true, ) ); ?> </td> </tr> <?php endif; ?> <?php /** * Fires at the end of the 'Personal Options' settings table on the user editing screen. * * @since 2.7.0 * * @param WP_User $profile_user The current WP_User object. */ do_action( 'personal_options', $profile_user ); ?> </table> <?php if ( IS_PROFILE_PAGE ) { /** * Fires after the 'Personal Options' settings table on the 'Profile' editing screen. * * The action only fires if the current user is editing their own profile. * * @since 2.0.0 * * @param WP_User $profile_user The current WP_User object. */ do_action( 'profile_personal_options', $profile_user ); } ?> <h2><?php _e( 'Name' ); ?></h2> <table class="form-table" role="presentation"> <tr class="user-user-login-wrap"> <th><label for="user_login"><?php _e( 'Username' ); ?></label></th> <td><input type="text" name="user_login" id="user_login" value="<?php echo esc_attr( $profile_user->user_login ); ?>" readonly="readonly" class="regular-text" /> <span class="description"><?php _e( 'Usernames cannot be changed.' ); ?></span></td> </tr> <?php if ( ! IS_PROFILE_PAGE && ! is_network_admin() && current_user_can( 'promote_user', $profile_user->ID ) ) : ?> <tr class="user-role-wrap"> <th><label for="role"><?php _e( 'Role' ); ?></label></th> <td> <select name="role" id="role"> <?php // Compare user role against currently editable roles. $user_roles = array_intersect( array_values( $profile_user->roles ), array_keys( get_editable_roles() ) ); $user_role = reset( $user_roles ); // Print the full list of roles with the primary one selected. wp_dropdown_roles( $user_role ); // Print the 'no role' option. Make it selected if the user has no role yet. if ( $user_role ) { echo '<option value="">' . __( '— No role for this site —' ) . '</option>'; } else { echo '<option value="" selected="selected">' . __( '— No role for this site —' ) . '</option>'; } ?> </select> </td> </tr> <?php endif; // End if ! IS_PROFILE_PAGE. ?> <?php if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) ) : ?> <tr class="user-super-admin-wrap"> <th><?php _e( 'Super Admin' ); ?></th> <td> <?php if ( 0 !== strcasecmp( $profile_user->user_email, get_site_option( 'admin_email' ) ) || ! is_super_admin( $profile_user->ID ) ) : ?> <p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profile_user->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p> <?php else : ?> <p><?php _e( 'Super admin privileges cannot be removed because this user has the network admin email.' ); ?></p> <?php endif; ?> </td> </tr> <?php endif; ?> <tr class="user-first-name-wrap"> <th><label for="first_name"><?php _e( 'First Name' ); ?></label></th> <td><input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( $profile_user->first_name ); ?>" class="regular-text" /></td> </tr> <tr class="user-last-name-wrap"> <th><label for="last_name"><?php _e( 'Last Name' ); ?></label></th> <td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( $profile_user->last_name ); ?>" class="regular-text" /></td> </tr> <tr class="user-nickname-wrap"> <th><label for="nickname"><?php _e( 'Nickname' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th> <td><input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( $profile_user->nickname ); ?>" class="regular-text" /></td> </tr> <tr class="user-display-name-wrap"> <th> <label for="display_name"><?php _e( 'Display name publicly as' ); ?></label> </th> <td> <select name="display_name" id="display_name"> <?php $public_display = array(); $public_display['display_nickname'] = $profile_user->nickname; $public_display['display_username'] = $profile_user->user_login; if ( ! empty( $profile_user->first_name ) ) { $public_display['display_firstname'] = $profile_user->first_name; } if ( ! empty( $profile_user->last_name ) ) { $public_display['display_lastname'] = $profile_user->last_name; } if ( ! empty( $profile_user->first_name ) && ! empty( $profile_user->last_name ) ) { $public_display['display_firstlast'] = $profile_user->first_name . ' ' . $profile_user->last_name; $public_display['display_lastfirst'] = $profile_user->last_name . ' ' . $profile_user->first_name; } if ( ! in_array( $profile_user->display_name, $public_display, true ) ) { // Only add this if it isn't duplicated elsewhere. $public_display = array( 'display_displayname' => $profile_user->display_name ) + $public_display; } $public_display = array_map( 'trim', $public_display ); $public_display = array_unique( $public_display ); ?> <?php foreach ( $public_display as $id => $item ) : ?> <option <?php selected( $profile_user->display_name, $item ); ?>><?php echo $item; ?></option> <?php endforeach; ?> </select> </td> </tr> </table> <h2><?php _e( 'Contact Info' ); ?></h2> <table class="form-table" role="presentation"> <tr class="user-email-wrap"> <th><label for="email"><?php _e( 'Email' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th> <td> <?php if ( $profile_user->ID === $current_user->ID ) : ?> <input type="email" name="email" id="email" aria-describedby="email-description" value="<?php echo esc_attr( $profile_user->user_email ); ?>" class="regular-text ltr" /> <p class="description" id="email-description"> <?php _e( 'If you change this, an email will be sent at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ); ?> </p> <?php else : ?> <input type="email" name="email" id="email" value="<?php echo esc_attr( $profile_user->user_email ); ?>" class="regular-text ltr" /> <?php endif; ?> <?php $new_email = get_user_meta( $current_user->ID, '_new_email', true ); if ( $new_email && $new_email['newemail'] !== $current_user->user_email && $profile_user->ID === $current_user->ID ) : $pending_change_message = sprintf( /* translators: %s: New email. */ __( 'There is a pending change of your email to %s.' ), '<code>' . esc_html( $new_email['newemail'] ) . '</code>' ); $pending_change_message .= sprintf( ' <a href="%1$s">%2$s</a>', esc_url( wp_nonce_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ), 'dismiss-' . $current_user->ID . '_new_email' ) ), __( 'Cancel' ) ); wp_admin_notice( $pending_change_message, array( 'additional_classes' => array( 'updated', 'inline' ), ) ); endif; ?> </td> </tr> <tr class="user-url-wrap"> <th><label for="url"><?php _e( 'Website' ); ?></label></th> <td><input type="url" name="url" id="url" value="<?php echo esc_attr( $profile_user->user_url ); ?>" class="regular-text code" /></td> </tr> <?php foreach ( wp_get_user_contact_methods( $profile_user ) as $name => $desc ) : ?> <tr class="user-<?php echo $name; ?>-wrap"> <th> <label for="<?php echo $name; ?>"> <?php /** * Filters a user contactmethod label. * * The dynamic portion of the hook name, `$name`, refers to * each of the keys in the contact methods array. * * @since 2.9.0 * * @param string $desc The translatable label for the contact method. */ echo apply_filters( "user_{$name}_label", $desc ); ?> </label> </th> <td> <input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $profile_user->$name ); ?>" class="regular-text" /> </td> </tr> <?php endforeach; ?> </table> <h2><?php IS_PROFILE_PAGE ? _e( 'About Yourself' ) : _e( 'About the user' ); ?></h2> <table class="form-table" role="presentation"> <tr class="user-description-wrap"> <th><label for="description"><?php _e( 'Biographical Info' ); ?></label></th> <td><textarea name="description" id="description" rows="5" cols="30"><?php echo $profile_user->description; // textarea_escaped ?></textarea> <p class="description"><?php _e( 'Share a little biographical information to fill out your profile. This may be shown publicly.' ); ?></p></td> </tr> <?php if ( get_option( 'show_avatars' ) ) : ?> <tr class="user-profile-picture"> <th><?php _e( 'Profile Picture' ); ?></th> <td> <?php echo get_avatar( $user_id ); ?> <p class="description"> <?php if ( IS_PROFILE_PAGE ) { $description = sprintf( /* translators: %s: Gravatar URL. */ __( '<a href="%s">You can change your profile picture on Gravatar</a>.' ), /* translators: The localized Gravatar URL. */ __( 'https://gravatar.com/' ) ); } else { $description = ''; } /** * Filters the user profile picture description displayed under the Gravatar. * * @since 4.4.0 * @since 4.7.0 Added the `$profile_user` parameter. * * @param string $description The description that will be printed. * @param WP_User $profile_user The current WP_User object. */ echo apply_filters( 'user_profile_picture_description', $description, $profile_user ); ?> </p> </td> </tr> <?php endif; ?> <?php /** * Filters the display of the password fields. * * @since 1.5.1 * @since 2.8.0 Added the `$profile_user` parameter. * @since 4.4.0 Now evaluated only in user-edit.php. * * @param bool $show Whether to show the password fields. Default true. * @param WP_User $profile_user User object for the current user to edit. */ $show_password_fields = apply_filters( 'show_password_fields', true, $profile_user ); ?> <?php if ( $show_password_fields ) : ?> </table> <h2><?php _e( 'Account Management' ); ?></h2> <table class="form-table" role="presentation"> <tr id="password" class="user-pass1-wrap"> <th><label for="pass1"><?php _e( 'New Password' ); ?></label></th> <td> <input type="hidden" value=" " /><!-- #24364 workaround --> <button type="button" class="button wp-generate-pw hide-if-no-js" aria-expanded="false"><?php _e( 'Set New Password' ); ?></button> <div class="wp-pwd hide-if-js"> <div class="password-input-wrapper"> <input type="password" name="pass1" id="pass1" class="regular-text" value="" autocomplete="new-password" spellcheck="false" data-pw="<?php echo esc_attr( wp_generate_password( 24 ) ); ?>" aria-describedby="pass-strength-result" /> <div style="display:none" id="pass-strength-result" aria-live="polite"></div> </div> <button type="button" class="button wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>"> <span class="dashicons dashicons-hidden" aria-hidden="true"></span> <span class="text"><?php _e( 'Hide' ); ?></span> </button> <button type="button" class="button wp-cancel-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Cancel password change' ); ?>"> <span class="dashicons dashicons-no" aria-hidden="true"></span> <span class="text"><?php _e( 'Cancel' ); ?></span> </button> </div> </td> </tr> <tr class="user-pass2-wrap hide-if-js"> <th scope="row"><label for="pass2"><?php _e( 'Repeat New Password' ); ?></label></th> <td> <input type="password" name="pass2" id="pass2" class="regular-text" value="" autocomplete="new-password" spellcheck="false" aria-describedby="pass2-desc" /> <?php if ( IS_PROFILE_PAGE ) : ?> <p class="description" id="pass2-desc"><?php _e( 'Type your new password again.' ); ?></p> <?php else : ?> <p class="description" id="pass2-desc"><?php _e( 'Type the new password again.' ); ?></p> <?php endif; ?> </td> </tr> <tr class="pw-weak"> <th><?php _e( 'Confirm Password' ); ?></th> <td> <label> <input type="checkbox" name="pw_weak" class="pw-checkbox" /> <span id="pw-weak-text-label"><?php _e( 'Confirm use of weak password' ); ?></span> </label> </td> </tr> <?php endif; // End Show Password Fields. ?> <?php // Allow admins to send reset password link. ?> <?php if ( ! IS_PROFILE_PAGE && true === wp_is_password_reset_allowed_for_user( $profile_user ) ) : ?> <tr class="user-generate-reset-link-wrap hide-if-no-js"> <th><?php _e( 'Password Reset' ); ?></th> <td> <div class="generate-reset-link"> <button type="button" class="button button-secondary" id="generate-reset-link"> <?php _e( 'Send Reset Link' ); ?> </button> </div> <p class="description"> <?php printf( /* translators: %s: User's display name. */ __( 'Send %s a link to reset their password. This will not change their password, nor will it force a change.' ), esc_html( $profile_user->display_name ) ); ?> </p> </td> </tr> <?php endif; ?> <?php if ( IS_PROFILE_PAGE && count( $sessions->get_all() ) === 1 ) : ?> <tr class="user-sessions-wrap hide-if-no-js"> <th><?php _e( 'Sessions' ); ?></th> <td aria-live="assertive"> <div class="destroy-sessions"><button type="button" disabled class="button"><?php _e( 'Log Out Everywhere Else' ); ?></button></div> <p class="description"> <?php _e( 'You are only logged in at this location.' ); ?> </p> </td> </tr> <?php elseif ( IS_PROFILE_PAGE && count( $sessions->get_all() ) > 1 ) : ?> <tr class="user-sessions-wrap hide-if-no-js"> <th><?php _e( 'Sessions' ); ?></th> <td aria-live="assertive"> <div class="destroy-sessions"><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere Else' ); ?></button></div> <p class="description"> <?php _e( 'Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here.' ); ?> </p> </td> </tr> <?php elseif ( ! IS_PROFILE_PAGE && $sessions->get_all() ) : ?> <tr class="user-sessions-wrap hide-if-no-js"> <th><?php _e( 'Sessions' ); ?></th> <td> <p><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere' ); ?></button></p> <p class="description"> <?php /* translators: %s: User's display name. */ printf( __( 'Log %s out of all locations.' ), $profile_user->display_name ); ?> </p> </td> </tr> <?php endif; ?> </table> <?php if ( wp_is_application_passwords_available_for_user( $user_id ) || ! wp_is_application_passwords_supported() ) : ?> <div class="application-passwords hide-if-no-js" id="application-passwords-section"> <h2><?php _e( 'Application Passwords' ); ?></h2> <p><?php _e( 'Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website.' ); ?></p> <?php if ( wp_is_application_passwords_available_for_user( $user_id ) ) : ?> <?php if ( is_multisite() ) : $blogs = get_blogs_of_user( $user_id, true ); $blogs_count = count( $blogs ); if ( $blogs_count > 1 ) : ?> <p> <?php /* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */ $message = _n( 'Application passwords grant access to <a href="%1$s">the %2$s site in this installation that you have permissions on</a>.', 'Application passwords grant access to <a href="%1$s">all %2$s sites in this installation that you have permissions on</a>.', $blogs_count ); if ( is_super_admin( $user_id ) ) { /* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */ $message = _n( 'Application passwords grant access to <a href="%1$s">the %2$s site on the network as you have Super Admin rights</a>.', 'Application passwords grant access to <a href="%1$s">all %2$s sites on the network as you have Super Admin rights</a>.', $blogs_count ); } printf( $message, admin_url( 'my-sites.php' ), number_format_i18n( $blogs_count ) ); ?> </p> <?php endif; endif; ?> <?php if ( ! wp_is_site_protected_by_basic_auth( 'front' ) ) : ?> <div class="create-application-password form-wrap"> <div class="form-field"> <label for="new_application_password_name"><?php _e( 'New Application Password Name' ); ?></label> <input type="text" size="30" id="new_application_password_name" name="new_application_password_name" class="input" aria-required="true" aria-describedby="new_application_password_name_desc" spellcheck="false" /> <p class="description" id="new_application_password_name_desc"><?php _e( 'Required to create an Application Password, but not to update the user.' ); ?></p> </div> <?php /** * Fires in the create Application Passwords form. * * @since 5.6.0 * * @param WP_User $profile_user The current WP_User object. */ do_action( 'wp_create_application_password_form', $profile_user ); ?> <button type="button" name="do_new_application_password" id="do_new_application_password" class="button button-secondary"><?php _e( 'Add Application Password' ); ?></button> </div> <?php else : wp_admin_notice( __( 'Your website appears to use Basic Authentication, which is not currently compatible with Application Passwords.' ), array( 'type' => 'error', 'additional_classes' => array( 'inline' ), ) ); endif; ?> <div class="application-passwords-list-table-wrapper"> <?php $application_passwords_list_table = _get_list_table( 'WP_Application_Passwords_List_Table', array( 'screen' => 'application-passwords-user' ) ); $application_passwords_list_table->prepare_items(); $application_passwords_list_table->display(); ?> </div> <?php elseif ( ! wp_is_application_passwords_supported() ) : ?> <p><?php _e( 'The application password feature requires HTTPS, which is not enabled on this site.' ); ?></p> <p> <?php printf( /* translators: %s: Documentation URL. */ __( 'If this is a development website, you can <a href="%s">set the environment type accordingly</a> to enable application passwords.' ), __( 'https://developer.wordpress.org/apis/wp-config-php/#wp-environment-type' ) ); ?> </p> <?php endif; ?> </div> <?php endif; // End Application Passwords. ?> <?php if ( IS_PROFILE_PAGE ) { /** * Fires after the 'About Yourself' settings table on the 'Profile' editing screen. * * The action only fires if the current user is editing their own profile. * * @since 2.0.0 * * @param WP_User $profile_user The current WP_User object. */ do_action( 'show_user_profile', $profile_user ); } else { /** * Fires after the 'About the User' settings table on the 'Edit User' screen. * * @since 2.0.0 * * @param WP_User $profile_user The current WP_User object. */ do_action( 'edit_user_profile', $profile_user ); } ?> <?php /** * Filters whether to display additional capabilities for the user. * * The 'Additional Capabilities' section will only be enabled if * the number of the user's capabilities exceeds their number of * roles. * * @since 2.8.0 * * @param bool $enable Whether to display the capabilities. Default true. * @param WP_User $profile_user The current WP_User object. */ $display_additional_caps = apply_filters( 'additional_capabilities_display', true, $profile_user ); ?> <?php if ( count( $profile_user->caps ) > count( $profile_user->roles ) && ( true === $display_additional_caps ) ) : ?> <h2><?php _e( 'Additional Capabilities' ); ?></h2> <table class="form-table" role="presentation"> <tr class="user-capabilities-wrap"> <th scope="row"><?php _e( 'Capabilities' ); ?></th> <td> <?php $output = ''; foreach ( $profile_user->caps as $cap => $value ) { if ( ! $wp_roles->is_role( $cap ) ) { if ( '' !== $output ) { $output .= ', '; } if ( $value ) { $output .= $cap; } else { /* translators: %s: Capability name. */ $output .= sprintf( __( 'Denied: %s' ), $cap ); } } } echo $output; ?> </td> </tr> </table> <?php endif; // End Display Additional Capabilities. ?> <input type="hidden" name="action" value="update" /> <input type="hidden" name="user_id" id="user_id" value="<?php echo esc_attr( $user_id ); ?>" /> <?php submit_button( IS_PROFILE_PAGE ? __( 'Update Profile' ) : __( 'Update User' ) ); ?> </form> </div> <?php break; } ?> <script type="text/javascript"> if (window.location.hash == '#password') { document.getElementById('pass1').focus(); } </script> <script type="text/javascript"> jQuery( function( $ ) { var languageSelect = $( '#locale' ); $( 'form' ).on( 'submit', function() { /* * Don't show a spinner for English and installed languages, * as there is nothing to download. */ if ( ! languageSelect.find( 'option:selected' ).data( 'installed' ) ) { $( '#submit', this ).after( '<span class="spinner language-install-spinner is-active" />' ); } }); } ); </script> <?php if ( isset( $application_passwords_list_table ) ) : ?> <script type="text/html" id="tmpl-new-application-password"> <div class="notice notice-success is-dismissible new-application-password-notice" role="alert"> <p class="application-password-display"> <label for="new-application-password-value"> <?php printf( /* translators: %s: Application name. */ __( 'Your new password for %s is:' ), '<strong>{{ data.name }}</strong>' ); ?> </label> <input id="new-application-password-value" type="text" class="code" readonly="readonly" value="{{ data.password }}" /> <button type="button" class="button copy-button" data-clipboard-text="{{ data.password }}"><?php _e( 'Copy' ); ?></button> <span class="success hidden" aria-hidden="true"><?php _e( 'Copied!' ); ?></span> </p> <p><?php _e( 'Be sure to save this in a safe location. You will not be able to retrieve it.' ); ?></p> <button type="button" class="notice-dismiss"> <span class="screen-reader-text"> <?php /* translators: Hidden accessibility text. */ _e( 'Dismiss this notice.' ); ?> </span> </button> </div> </script> <script type="text/html" id="tmpl-application-password-row"> <?php $application_passwords_list_table->print_js_template_row(); ?> </script> <?php endif; ?> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; load-styles.php 0000644 00000005663 15151241220 0007520 0 ustar 00 <?php /* * The error_reporting() function can be disabled in php.ini. On systems where that is the case, * it's best to add a dummy function to the wp-config.php file, but as this call to the function * is run prior to wp-config.php loading, it is wrapped in a function_exists() check. */ if ( function_exists( 'error_reporting' ) ) { /* * Disable error reporting. * * Set this to error_reporting( -1 ) for debugging. */ error_reporting( 0 ); } // Set ABSPATH for execution. if ( ! defined( 'ABSPATH' ) ) { define( 'ABSPATH', dirname( __DIR__ ) . '/' ); } define( 'WPINC', 'wp-includes' ); define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' ); require ABSPATH . 'wp-admin/includes/noop.php'; require ABSPATH . WPINC . '/theme.php'; require ABSPATH . WPINC . '/class-wp-theme-json-resolver.php'; require ABSPATH . WPINC . '/global-styles-and-settings.php'; require ABSPATH . WPINC . '/script-loader.php'; require ABSPATH . WPINC . '/version.php'; $protocol = $_SERVER['SERVER_PROTOCOL']; if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) { $protocol = 'HTTP/1.0'; } $load = $_GET['load']; if ( is_array( $load ) ) { ksort( $load ); $load = implode( '', $load ); } $load = preg_replace( '/[^a-z0-9,_-]+/i', '', $load ); $load = array_unique( explode( ',', $load ) ); if ( empty( $load ) ) { header( "$protocol 400 Bad Request" ); exit; } $rtl = ( isset( $_GET['dir'] ) && 'rtl' === $_GET['dir'] ); $expires_offset = 31536000; // 1 year. $out = ''; $wp_styles = new WP_Styles(); wp_default_styles( $wp_styles ); $etag = $wp_styles->get_etag( $load ); if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) && stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) === $etag ) { header( "$protocol 304 Not Modified" ); exit; } foreach ( $load as $handle ) { if ( ! array_key_exists( $handle, $wp_styles->registered ) ) { continue; } $style = $wp_styles->registered[ $handle ]; if ( empty( $style->src ) ) { continue; } $path = ABSPATH . $style->src; if ( $rtl && ! empty( $style->extra['rtl'] ) ) { // All default styles have fully independent RTL files. $path = str_replace( '.min.css', '-rtl.min.css', $path ); } $content = get_file( $path ) . "\n"; // Note: str_starts_with() is not used here, as wp-includes/compat.php is not loaded in this file. if ( 0 === strpos( $style->src, '/' . WPINC . '/css/' ) ) { $content = str_replace( '../images/', '../' . WPINC . '/images/', $content ); $content = str_replace( '../js/tinymce/', '../' . WPINC . '/js/tinymce/', $content ); $content = str_replace( '../fonts/', '../' . WPINC . '/fonts/', $content ); $out .= $content; } else { $out .= str_replace( '../images/', 'images/', $content ); } } header( "Etag: $etag" ); header( 'Content-Type: text/css; charset=UTF-8' ); header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + $expires_offset ) . ' GMT' ); header( "Cache-Control: public, max-age=$expires_offset" ); echo $out; exit; widgets-form-blocks.php 0000644 00000011736 15151241221 0011141 0 ustar 00 <?php /** * The block-based widgets editor, for use in widgets.php. * * @package WordPress * @subpackage Administration */ // Don't load directly. if ( ! defined( 'ABSPATH' ) ) { die( '-1' ); } // Flag that we're loading the block editor. $current_screen = get_current_screen(); $current_screen->is_block_editor( true ); $block_editor_context = new WP_Block_Editor_Context( array( 'name' => 'core/edit-widgets' ) ); $preload_paths = array( array( rest_get_route_for_post_type_items( 'attachment' ), 'OPTIONS' ), '/wp/v2/widget-types?context=edit&per_page=-1', '/wp/v2/sidebars?context=edit&per_page=-1', '/wp/v2/widgets?context=edit&per_page=-1&_embed=about', ); block_editor_rest_api_preload( $preload_paths, $block_editor_context ); $editor_settings = get_block_editor_settings( array_merge( get_legacy_widget_block_editor_settings(), array( 'styles' => get_block_editor_theme_styles() ) ), $block_editor_context ); // The widgets editor does not support the Block Directory, so don't load any of // its assets. This also prevents 'wp-editor' from being enqueued which we // cannot load in the widgets screen because many widget scripts rely on `wp.editor`. remove_action( 'enqueue_block_editor_assets', 'wp_enqueue_editor_block_directory_assets' ); wp_add_inline_script( 'wp-edit-widgets', sprintf( 'wp.domReady( function() { wp.editWidgets.initialize( "widgets-editor", %s ); } );', wp_json_encode( $editor_settings ) ) ); // Preload server-registered block schemas. wp_add_inline_script( 'wp-blocks', 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');' ); // Preload server-registered block bindings sources. $registered_sources = get_all_registered_block_bindings_sources(); if ( ! empty( $registered_sources ) ) { $filtered_sources = array(); foreach ( $registered_sources as $source ) { $filtered_sources[] = array( 'name' => $source->name, 'label' => $source->label, 'usesContext' => $source->uses_context, ); } $script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources ) ); wp_add_inline_script( 'wp-blocks', $script ); } wp_add_inline_script( 'wp-blocks', sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ) ) ), 'after' ); wp_enqueue_script( 'wp-edit-widgets' ); wp_enqueue_script( 'admin-widgets' ); wp_enqueue_style( 'wp-edit-widgets' ); /** This action is documented in wp-admin/edit-form-blocks.php */ do_action( 'enqueue_block_editor_assets' ); /** This action is documented in wp-admin/widgets-form.php */ do_action( 'sidebar_admin_setup' ); require_once ABSPATH . 'wp-admin/admin-header.php'; /** This action is documented in wp-admin/widgets-form.php */ do_action( 'widgets_admin_page' ); ?> <div id="widgets-editor" class="blocks-widgets-container"> <?php // JavaScript is disabled. ?> <div class="wrap hide-if-js widgets-editor-no-js"> <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1> <?php if ( file_exists( WP_PLUGIN_DIR . '/classic-widgets/classic-widgets.php' ) ) { // If Classic Widgets is already installed, provide a link to activate the plugin. $installed = true; $plugin_activate_url = wp_nonce_url( 'plugins.php?action=activate&plugin=classic-widgets/classic-widgets.php', 'activate-plugin_classic-widgets/classic-widgets.php' ); $message = sprintf( /* translators: %s: Link to activate the Classic Widgets plugin. */ __( 'The block widgets require JavaScript. Please enable JavaScript in your browser settings, or activate the <a href="%s">Classic Widgets plugin</a>.' ), esc_url( $plugin_activate_url ) ); } else { // If Classic Widgets is not installed, provide a link to install it. $installed = false; $plugin_install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=classic-widgets' ), 'install-plugin_classic-widgets' ); $message = sprintf( /* translators: %s: A link to install the Classic Widgets plugin. */ __( 'The block widgets require JavaScript. Please enable JavaScript in your browser settings, or install the <a href="%s">Classic Widgets plugin</a>.' ), esc_url( $plugin_install_url ) ); } /** * Filters the message displayed in the block widget interface when JavaScript is * not enabled in the browser. * * @since 6.4.0 * * @param string $message The message being displayed. * @param bool $installed Whether the Classic Widget plugin is installed. */ $message = apply_filters( 'block_widgets_no_javascript_message', $message, $installed ); wp_admin_notice( $message, array( 'type' => 'error', 'additional_classes' => array( 'hide-if-js' ), ) ); ?> </div> </div> <?php /** This action is documented in wp-admin/widgets-form.php */ do_action( 'sidebar_admin_page' ); require_once ABSPATH . 'wp-admin/admin-footer.php'; options-reading.php 0000644 00000024032 15151241221 0010352 0 ustar 00 <?php /** * Reading settings administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'manage_options' ) ) { wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) ); } // Used in the HTML title tag. $title = __( 'Reading Settings' ); $parent_file = 'options-general.php'; add_action( 'admin_head', 'options_reading_add_js' ); get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'This screen contains the settings that affect the display of your content.' ) . '</p>' . '<p>' . sprintf( /* translators: %s: URL to create a new page. */ __( 'You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two <a href="%s">Pages</a>. One will become the homepage, and the other will be where your posts are displayed.' ), 'post-new.php?post_type=page' ) . '</p>' . '<p>' . sprintf( /* translators: %s: Documentation URL. */ __( 'You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or an excerpt. <a href="%s">Learn more about feeds</a>.' ), __( 'https://developer.wordpress.org/advanced-administration/wordpress/feeds/' ) ) . '</p>' . '<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>', ) ); get_current_screen()->add_help_tab( array( 'id' => 'site-visibility', 'title' => has_action( 'blog_privacy_selector' ) ? __( 'Site visibility' ) : __( 'Search engine visibility' ), 'content' => '<p>' . __( 'You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to “Discourage search engines from indexing this site” and click the Save Changes button at the bottom of the screen.' ) . '</p>' . '<p>' . __( 'Note that even when set to discourage search engines, your site is still visible on the web and not all search engines adhere to this directive.' ) . '</p>' . '<p>' . __( 'When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, “Search engines discouraged”, to remind you that you have directed search engines to not crawl your site.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-reading-screen/">Documentation on Reading Settings</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <form method="post" action="options.php"> <?php settings_fields( 'reading' ); if ( ! is_utf8_charset() ) { add_settings_field( 'blog_charset', __( 'Encoding for pages and feeds' ), 'options_reading_blog_charset', 'reading', 'default', array( 'label_for' => 'blog_charset' ) ); } ?> <?php if ( ! get_pages() ) : ?> <input name="show_on_front" type="hidden" value="posts" /> <table class="form-table" role="presentation"> <?php if ( 'posts' !== get_option( 'show_on_front' ) ) : update_option( 'show_on_front', 'posts' ); endif; else : if ( 'page' === get_option( 'show_on_front' ) && ! get_option( 'page_on_front' ) && ! get_option( 'page_for_posts' ) ) { update_option( 'show_on_front', 'posts' ); } ?> <table class="form-table" role="presentation"> <tr> <th scope="row"><?php _e( 'Your homepage displays' ); ?></th> <td id="front-static-pages"><fieldset> <legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'Your homepage displays' ); ?> </span></legend> <p><label> <input name="show_on_front" type="radio" value="posts" class="tog" <?php checked( 'posts', get_option( 'show_on_front' ) ); ?> /> <?php _e( 'Your latest posts' ); ?> </label> </p> <p><label> <input name="show_on_front" type="radio" value="page" class="tog" <?php checked( 'page', get_option( 'show_on_front' ) ); ?> /> <?php printf( /* translators: %s: URL to Pages screen. */ __( 'A <a href="%s">static page</a> (select below)' ), 'edit.php?post_type=page' ); ?> </label> </p> <ul> <li><label for="page_on_front"> <?php printf( /* translators: %s: Select field to choose the front page. */ __( 'Homepage: %s' ), wp_dropdown_pages( array( 'name' => 'page_on_front', 'echo' => 0, 'show_option_none' => __( '— Select —' ), 'option_none_value' => '0', 'selected' => get_option( 'page_on_front' ), ) ) ); ?> </label></li> <li><label for="page_for_posts"> <?php printf( /* translators: %s: Select field to choose the page for posts. */ __( 'Posts page: %s' ), wp_dropdown_pages( array( 'name' => 'page_for_posts', 'echo' => 0, 'show_option_none' => __( '— Select —' ), 'option_none_value' => '0', 'selected' => get_option( 'page_for_posts' ), ) ) ); ?> </label></li> </ul> <?php if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) === get_option( 'page_on_front' ) ) : wp_admin_notice( __( '<strong>Warning:</strong> these pages should not be the same!' ), array( 'type' => 'warning', 'id' => 'front-page-warning', 'additional_classes' => array( 'inline' ), ) ); endif; if ( get_option( 'wp_page_for_privacy_policy' ) === get_option( 'page_for_posts' ) || get_option( 'wp_page_for_privacy_policy' ) === get_option( 'page_on_front' ) ) : wp_admin_notice( __( '<strong>Warning:</strong> these pages should not be the same as your Privacy Policy page!' ), array( 'type' => 'warning', 'id' => 'privacy-policy-page-warning', 'additional_classes' => array( 'inline' ), ) ); endif; ?> </fieldset></td> </tr> <?php endif; ?> <tr> <th scope="row"><label for="posts_per_page"><?php _e( 'Blog pages show at most' ); ?></label></th> <td> <input name="posts_per_page" type="number" step="1" min="1" id="posts_per_page" value="<?php form_option( 'posts_per_page' ); ?>" class="small-text" /> <?php _e( 'posts' ); ?> </td> </tr> <tr> <th scope="row"><label for="posts_per_rss"><?php _e( 'Syndication feeds show the most recent' ); ?></label></th> <td><input name="posts_per_rss" type="number" step="1" min="1" id="posts_per_rss" value="<?php form_option( 'posts_per_rss' ); ?>" class="small-text" /> <?php _e( 'items' ); ?></td> </tr> <tr> <th scope="row"><?php _e( 'For each post in a feed, include' ); ?> </th> <td><fieldset> <legend class="screen-reader-text"><span> <?php /* translators: Hidden accessibility text. */ _e( 'For each post in a feed, include' ); ?> </span></legend> <p> <label><input name="rss_use_excerpt" type="radio" value="0" <?php checked( 0, get_option( 'rss_use_excerpt' ) ); ?> /> <?php _e( 'Full text' ); ?></label><br /> <label><input name="rss_use_excerpt" type="radio" value="1" <?php checked( 1, get_option( 'rss_use_excerpt' ) ); ?> /> <?php _e( 'Excerpt' ); ?></label> </p> <p class="description"> <?php printf( /* translators: %s: Documentation URL. */ __( 'Your theme determines how content is displayed in browsers. <a href="%s">Learn more about feeds</a>.' ), __( 'https://developer.wordpress.org/advanced-administration/wordpress/feeds/' ) ); ?> </p> </fieldset></td> </tr> <tr class="option-site-visibility"> <th scope="row"><?php has_action( 'blog_privacy_selector' ) ? _e( 'Site visibility' ) : _e( 'Search engine visibility' ); ?> </th> <td><fieldset> <legend class="screen-reader-text"><span> <?php has_action( 'blog_privacy_selector' ) /* translators: Hidden accessibility text. */ ? _e( 'Site visibility' ) /* translators: Hidden accessibility text. */ : _e( 'Search engine visibility' ); ?> </span></legend> <?php if ( has_action( 'blog_privacy_selector' ) ) : ?> <input id="blog-public" type="radio" name="blog_public" value="1" <?php checked( '1', get_option( 'blog_public' ) ); ?> /> <label for="blog-public"><?php _e( 'Allow search engines to index this site' ); ?></label><br /> <input id="blog-norobots" type="radio" name="blog_public" value="0" <?php checked( '0', get_option( 'blog_public' ) ); ?> /> <label for="blog-norobots"><?php _e( 'Discourage search engines from indexing this site' ); ?></label> <p class="description"><?php _e( 'Note: Neither of these options blocks access to your site — it is up to search engines to honor your request.' ); ?></p> <?php /** * Enables the legacy 'Site visibility' privacy options. * * By default the privacy options form displays a single checkbox to 'discourage' search * engines from indexing the site. Hooking to this action serves a dual purpose: * * 1. Disable the single checkbox in favor of a multiple-choice list of radio buttons. * 2. Open the door to adding additional radio button choices to the list. * * Hooking to this action also converts the 'Search engine visibility' heading to the more * open-ended 'Site visibility' heading. * * @since 2.1.0 */ do_action( 'blog_privacy_selector' ); ?> <?php else : ?> <label for="blog_public"><input name="blog_public" type="checkbox" id="blog_public" value="0" <?php checked( '0', get_option( 'blog_public' ) ); ?> /> <?php _e( 'Discourage search engines from indexing this site' ); ?></label> <p class="description"><?php _e( 'It is up to search engines to honor this request.' ); ?></p> <?php endif; ?> </fieldset></td> </tr> <?php do_settings_fields( 'reading', 'default' ); ?> </table> <?php do_settings_sections( 'reading' ); ?> <?php submit_button(); ?> </form> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> media.php 0000644 00000001463 15151241221 0006332 0 ustar 00 <?php /** * Media management action handler. * * This file is deprecated, use 'wp-admin/upload.php' instead. * * @deprecated 6.3.0 * @package WordPress * @subpackage Administration */ /** Load WordPress Administration Bootstrap. */ require_once __DIR__ . '/admin.php'; $parent_file = 'upload.php'; $submenu_file = 'upload.php'; $action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : ''; switch ( $action ) { case 'editattachment': case 'edit': if ( empty( $_GET['attachment_id'] ) ) { wp_redirect( admin_url( 'upload.php?error=deprecated' ) ); exit; } $att_id = (int) $_GET['attachment_id']; wp_redirect( admin_url( "upload.php?item={$att_id}&error=deprecated" ) ); exit; default: wp_redirect( admin_url( 'upload.php?error=deprecated' ) ); exit; } network.php 0000644 00000012622 15151241221 0006743 0 ustar 00 <?php /** * Network installation administration panel. * * A multi-step process allowing the user to enable a network of WordPress sites. * * @since 3.0.0 * * @package WordPress * @subpackage Administration */ define( 'WP_INSTALLING_NETWORK', true ); /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'setup_network' ) ) { wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) ); } if ( is_multisite() ) { if ( ! is_network_admin() ) { wp_redirect( network_admin_url( 'setup.php' ) ); exit; } if ( ! defined( 'MULTISITE' ) ) { wp_die( __( 'The Network creation panel is not for WordPress MU networks.' ) ); } } require_once __DIR__ . '/includes/network.php'; // We need to create references to ms global tables to enable Network. foreach ( $wpdb->tables( 'ms_global' ) as $table => $prefixed_table ) { $wpdb->$table = $prefixed_table; } if ( ! network_domain_check() && ( ! defined( 'WP_ALLOW_MULTISITE' ) || ! WP_ALLOW_MULTISITE ) ) { wp_die( printf( /* translators: 1: WP_ALLOW_MULTISITE, 2: wp-config.php */ __( 'You must define the %1$s constant as true in your %2$s file to allow creation of a Network.' ), '<code>WP_ALLOW_MULTISITE</code>', '<code>wp-config.php</code>' ) ); } if ( is_network_admin() ) { // Used in the HTML title tag. $title = __( 'Network Setup' ); $parent_file = 'settings.php'; } else { // Used in the HTML title tag. $title = __( 'Create a Network of WordPress Sites' ); $parent_file = 'tools.php'; } $network_help = '<p>' . __( 'This screen allows you to configure a network as having subdomains (<code>site1.example.com</code>) or subdirectories (<code>example.com/site1</code>). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it.' ) . '</p>' . '<p>' . __( 'Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your installation. Fill out the network details, and click Install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories).' ) . '</p>' . '<p>' . __( 'The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files.' ) . '</p>' . '<p>' . __( 'Add the designated lines of code to wp-config.php (just before <code>/*...stop editing...*/</code>) and <code>.htaccess</code> (replacing the existing WordPress rules).' ) . '</p>' . '<p>' . __( 'Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar.' ) . '</p>' . '<p>' . __( 'The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with “/blog/” from the main site. This disabling will be addressed in a future version.' ) . '</p>' . '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/multisite/create-network/">Documentation on Creating a Network</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-network-screen/">Documentation on the Network Screen</a>' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'network', 'title' => __( 'Network' ), 'content' => $network_help, ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/multisite/create-network/">Documentation on Creating a Network</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-network-screen/">Documentation on the Network Screen</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <?php if ( $_POST ) { check_admin_referer( 'install-network-1' ); require_once ABSPATH . 'wp-admin/includes/upgrade.php'; // Create network tables. install_network(); $base = parse_url( trailingslashit( get_option( 'home' ) ), PHP_URL_PATH ); $subdomain_install = allow_subdomain_install() ? ! empty( $_POST['subdomain_install'] ) : false; if ( ! network_domain_check() ) { $result = populate_network( 1, get_clean_basedomain(), sanitize_email( $_POST['email'] ), wp_unslash( $_POST['sitename'] ), $base, $subdomain_install ); if ( is_wp_error( $result ) ) { if ( 1 === count( $result->get_error_codes() ) && 'no_wildcard_dns' === $result->get_error_code() ) { network_step2( $result ); } else { network_step1( $result ); } } else { network_step2(); } } else { network_step2(); } } elseif ( is_multisite() || network_domain_check() ) { network_step2(); } else { network_step1(); } ?> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> comment.php 0000644 00000026546 15151241221 0006726 0 ustar 00 <?php /** * Comment Management Screen * * @package WordPress * @subpackage Administration */ /** Load WordPress Bootstrap */ require_once __DIR__ . '/admin.php'; $parent_file = 'edit-comments.php'; $submenu_file = 'edit-comments.php'; /** * @global string $action */ global $action; $action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : ''; if ( isset( $_POST['deletecomment'] ) ) { $action = 'deletecomment'; } if ( 'cdc' === $action ) { $action = 'delete'; } elseif ( 'mac' === $action ) { $action = 'approve'; } if ( isset( $_GET['dt'] ) ) { if ( 'spam' === $_GET['dt'] ) { $action = 'spam'; } elseif ( 'trash' === $_GET['dt'] ) { $action = 'trash'; } } if ( isset( $_REQUEST['c'] ) ) { $comment_id = absint( $_REQUEST['c'] ); $comment = get_comment( $comment_id ); // Prevent actions on a comment associated with a trashed post. if ( $comment && 'trash' === get_post_status( $comment->comment_post_ID ) ) { wp_die( __( 'You cannot edit this comment because the associated post is in the Trash. Please restore the post first, then try again.' ) ); } } else { $comment = null; } switch ( $action ) { case 'editcomment': // Used in the HTML title tag. $title = __( 'Edit Comment' ); get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error.' ) . '</p>' . '<p>' . __( 'You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/comments-screen/">Documentation on Comments</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); wp_enqueue_script( 'comment' ); require_once ABSPATH . 'wp-admin/admin-header.php'; if ( ! $comment ) { comment_footer_die( __( 'Invalid comment ID.' ) . sprintf( ' <a href="%s">' . __( 'Go back' ) . '</a>.', 'javascript:history.go(-1)' ) ); } if ( ! current_user_can( 'edit_comment', $comment_id ) ) { comment_footer_die( __( 'Sorry, you are not allowed to edit this comment.' ) ); } if ( 'trash' === $comment->comment_approved ) { comment_footer_die( __( 'This comment is in the Trash. Please move it out of the Trash if you want to edit it.' ) ); } $comment = get_comment_to_edit( $comment_id ); require ABSPATH . 'wp-admin/edit-form-comment.php'; break; case 'delete': case 'approve': case 'trash': case 'spam': // Used in the HTML title tag. $title = __( 'Moderate Comment' ); if ( ! $comment ) { wp_redirect( admin_url( 'edit-comments.php?error=1' ) ); die(); } if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) { wp_redirect( admin_url( 'edit-comments.php?error=2' ) ); die(); } // No need to re-approve/re-trash/re-spam a comment. if ( str_replace( '1', 'approve', $comment->comment_approved ) === $action ) { wp_redirect( admin_url( 'edit-comments.php?same=' . $comment_id ) ); die(); } require_once ABSPATH . 'wp-admin/admin-header.php'; $formaction = $action . 'comment'; $nonce_action = ( 'approve' === $action ) ? 'approve-comment_' : 'delete-comment_'; $nonce_action .= $comment_id; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <?php switch ( $action ) { case 'spam': $caution_msg = __( 'You are about to mark the following comment as spam:' ); $button = _x( 'Mark as spam', 'comment' ); break; case 'trash': $caution_msg = __( 'You are about to move the following comment to the Trash:' ); $button = __( 'Move to Trash' ); break; case 'delete': $caution_msg = __( 'You are about to delete the following comment:' ); $button = __( 'Permanently delete comment' ); break; default: $caution_msg = __( 'You are about to approve the following comment:' ); $button = __( 'Approve comment' ); break; } if ( '0' !== $comment->comment_approved ) { // If not unapproved. $message = ''; switch ( $comment->comment_approved ) { case '1': $message = __( 'This comment is currently approved.' ); break; case 'spam': $message = __( 'This comment is currently marked as spam.' ); break; case 'trash': $message = __( 'This comment is currently in the Trash.' ); break; } if ( $message ) { wp_admin_notice( $message, array( 'type' => 'info', 'id' => 'message', ) ); } } wp_admin_notice( '<strong>' . __( 'Caution:' ) . '</strong> ' . $caution_msg, array( 'type' => 'warning', 'id' => 'message', ) ); ?> <table class="form-table comment-ays"> <tr> <th scope="row"><?php _e( 'Author' ); ?></th> <td><?php comment_author( $comment ); ?></td> </tr> <?php if ( get_comment_author_email( $comment ) ) { ?> <tr> <th scope="row"><?php _e( 'Email' ); ?></th> <td><?php comment_author_email( $comment ); ?></td> </tr> <?php } ?> <?php if ( get_comment_author_url( $comment ) ) { ?> <tr> <th scope="row"><?php _e( 'URL' ); ?></th> <td><a href="<?php comment_author_url( $comment ); ?>"><?php comment_author_url( $comment ); ?></a></td> </tr> <?php } ?> <tr> <th scope="row"><?php /* translators: Column name or table row header. */ _e( 'In response to' ); ?></th> <td> <?php $post_id = $comment->comment_post_ID; if ( current_user_can( 'edit_post', $post_id ) ) { $post_link = "<a href='" . esc_url( get_edit_post_link( $post_id ) ) . "'>"; $post_link .= esc_html( get_the_title( $post_id ) ) . '</a>'; } else { $post_link = esc_html( get_the_title( $post_id ) ); } echo $post_link; if ( $comment->comment_parent ) { $parent = get_comment( $comment->comment_parent ); $parent_link = esc_url( get_comment_link( $parent ) ); $name = get_comment_author( $parent ); printf( /* translators: %s: Comment link. */ ' | ' . __( 'In reply to %s.' ), '<a href="' . $parent_link . '">' . $name . '</a>' ); } ?> </td> </tr> <tr> <th scope="row"><?php _e( 'Submitted on' ); ?></th> <td> <?php $submitted = sprintf( /* translators: 1: Comment date, 2: Comment time. */ __( '%1$s at %2$s' ), /* translators: Comment date format. See https://www.php.net/manual/datetime.format.php */ get_comment_date( __( 'Y/m/d' ), $comment ), /* translators: Comment time format. See https://www.php.net/manual/datetime.format.php */ get_comment_date( __( 'g:i a' ), $comment ) ); if ( 'approved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_post_ID ) ) { echo '<a href="' . esc_url( get_comment_link( $comment ) ) . '">' . $submitted . '</a>'; } else { echo $submitted; } ?> </td> </tr> <tr> <th scope="row"><?php /* translators: Field name in comment form. */ _ex( 'Comment', 'noun' ); ?></th> <td class="comment-content"> <?php comment_text( $comment ); ?> <p class="edit-comment"> <a href="<?php echo esc_url( admin_url( "comment.php?action=editcomment&c={$comment->comment_ID}" ) ); ?>"><?php esc_html_e( 'Edit' ); ?></a> </p> </td> </tr> </table> <form action="comment.php" method="get" class="comment-ays-submit"> <p> <?php submit_button( $button, 'primary', 'submit', false ); ?> <a href="<?php echo esc_url( admin_url( 'edit-comments.php' ) ); ?>" class="button-cancel"><?php esc_html_e( 'Cancel' ); ?></a> </p> <?php wp_nonce_field( $nonce_action ); ?> <input type="hidden" name="action" value="<?php echo esc_attr( $formaction ); ?>" /> <input type="hidden" name="c" value="<?php echo esc_attr( $comment->comment_ID ); ?>" /> <input type="hidden" name="noredir" value="1" /> </form> </div> <?php break; case 'deletecomment': case 'trashcomment': case 'untrashcomment': case 'spamcomment': case 'unspamcomment': case 'approvecomment': case 'unapprovecomment': $comment_id = absint( $_REQUEST['c'] ); if ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ), true ) ) { check_admin_referer( 'approve-comment_' . $comment_id ); } else { check_admin_referer( 'delete-comment_' . $comment_id ); } $noredir = isset( $_REQUEST['noredir'] ); $comment = get_comment( $comment_id ); if ( ! $comment ) { comment_footer_die( __( 'Invalid comment ID.' ) . sprintf( ' <a href="%s">' . __( 'Go back' ) . '</a>.', 'edit-comments.php' ) ); } if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) { comment_footer_die( __( 'Sorry, you are not allowed to edit comments on this post.' ) ); } if ( wp_get_referer() && ! $noredir && ! str_contains( wp_get_referer(), 'comment.php' ) ) { $redir = wp_get_referer(); } elseif ( wp_get_original_referer() && ! $noredir ) { $redir = wp_get_original_referer(); } elseif ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ), true ) ) { $redir = admin_url( 'edit-comments.php?p=' . absint( $comment->comment_post_ID ) ); } else { $redir = admin_url( 'edit-comments.php' ); } $redir = remove_query_arg( array( 'spammed', 'unspammed', 'trashed', 'untrashed', 'deleted', 'ids', 'approved', 'unapproved' ), $redir ); switch ( $action ) { case 'deletecomment': wp_delete_comment( $comment ); $redir = add_query_arg( array( 'deleted' => '1' ), $redir ); break; case 'trashcomment': wp_trash_comment( $comment ); $redir = add_query_arg( array( 'trashed' => '1', 'ids' => $comment_id, ), $redir ); break; case 'untrashcomment': wp_untrash_comment( $comment ); $redir = add_query_arg( array( 'untrashed' => '1' ), $redir ); break; case 'spamcomment': wp_spam_comment( $comment ); $redir = add_query_arg( array( 'spammed' => '1', 'ids' => $comment_id, ), $redir ); break; case 'unspamcomment': wp_unspam_comment( $comment ); $redir = add_query_arg( array( 'unspammed' => '1' ), $redir ); break; case 'approvecomment': wp_set_comment_status( $comment, 'approve' ); $redir = add_query_arg( array( 'approved' => 1 ), $redir ); break; case 'unapprovecomment': wp_set_comment_status( $comment, 'hold' ); $redir = add_query_arg( array( 'unapproved' => 1 ), $redir ); break; } wp_redirect( $redir ); die; case 'editedcomment': $comment_id = absint( $_POST['comment_ID'] ); $comment_post_id = absint( $_POST['comment_post_ID'] ); check_admin_referer( 'update-comment_' . $comment_id ); $updated = edit_comment(); if ( is_wp_error( $updated ) ) { wp_die( $updated->get_error_message() ); } $location = ( empty( $_POST['referredby'] ) ? "edit-comments.php?p=$comment_post_id" : $_POST['referredby'] ) . '#comment-' . $comment_id; /** * Filters the URI the user is redirected to after editing a comment in the admin. * * @since 2.1.0 * * @param string $location The URI the user will be redirected to. * @param int $comment_id The ID of the comment being edited. */ $location = apply_filters( 'comment_edit_redirect', $location, $comment_id ); wp_redirect( $location ); exit; default: wp_die( __( 'Unknown action.' ) ); } // End switch. require_once ABSPATH . 'wp-admin/admin-footer.php'; authorize-application.php 0000644 00000024137 15151241221 0011571 0 ustar 00 <?php /** * Authorize Application Screen * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; $error = null; $new_password = ''; // This is the no-js fallback script. Generally this will all be handled by `auth-app.js`. if ( isset( $_POST['action'] ) && 'authorize_application_password' === $_POST['action'] ) { check_admin_referer( 'authorize_application_password' ); $success_url = $_POST['success_url']; $reject_url = $_POST['reject_url']; $app_name = $_POST['app_name']; $app_id = $_POST['app_id']; $redirect = ''; if ( isset( $_POST['reject'] ) ) { if ( $reject_url ) { $redirect = $reject_url; } else { $redirect = admin_url(); } } elseif ( isset( $_POST['approve'] ) ) { $created = WP_Application_Passwords::create_new_application_password( get_current_user_id(), array( 'name' => $app_name, 'app_id' => $app_id, ) ); if ( is_wp_error( $created ) ) { $error = $created; } else { list( $new_password ) = $created; if ( $success_url ) { $redirect = add_query_arg( array( 'site_url' => urlencode( site_url() ), 'user_login' => urlencode( wp_get_current_user()->user_login ), 'password' => urlencode( $new_password ), ), $success_url ); } } } if ( $redirect ) { // Explicitly not using wp_safe_redirect b/c sends to arbitrary domain. wp_redirect( $redirect ); exit; } } // Used in the HTML title tag. $title = __( 'Authorize Application' ); $app_name = ! empty( $_REQUEST['app_name'] ) ? $_REQUEST['app_name'] : ''; $app_id = ! empty( $_REQUEST['app_id'] ) ? $_REQUEST['app_id'] : ''; $success_url = ! empty( $_REQUEST['success_url'] ) ? $_REQUEST['success_url'] : null; if ( ! empty( $_REQUEST['reject_url'] ) ) { $reject_url = $_REQUEST['reject_url']; } elseif ( $success_url ) { $reject_url = add_query_arg( 'success', 'false', $success_url ); } else { $reject_url = null; } $user = wp_get_current_user(); $request = compact( 'app_name', 'app_id', 'success_url', 'reject_url' ); $is_valid = wp_is_authorize_application_password_request_valid( $request, $user ); if ( is_wp_error( $is_valid ) ) { wp_die( __( 'The Authorize Application request is not allowed.' ) . ' ' . implode( ' ', $is_valid->get_error_messages() ), __( 'Cannot Authorize Application' ) ); } if ( wp_is_site_protected_by_basic_auth( 'front' ) ) { wp_die( __( 'Your website appears to use Basic Authentication, which is not currently compatible with application passwords.' ), __( 'Cannot Authorize Application' ), array( 'response' => 501, 'link_text' => __( 'Go Back' ), 'link_url' => $reject_url ? add_query_arg( 'error', 'disabled', $reject_url ) : admin_url(), ) ); } if ( ! wp_is_application_passwords_available_for_user( $user ) ) { if ( wp_is_application_passwords_available() ) { $message = __( 'Application passwords are not available for your account. Please contact the site administrator for assistance.' ); } else { $message = __( 'Application passwords are not available.' ); } wp_die( $message, __( 'Cannot Authorize Application' ), array( 'response' => 501, 'link_text' => __( 'Go Back' ), 'link_url' => $reject_url ? add_query_arg( 'error', 'disabled', $reject_url ) : admin_url(), ) ); } wp_enqueue_script( 'auth-app' ); wp_localize_script( 'auth-app', 'authApp', array( 'site_url' => site_url(), 'user_login' => $user->user_login, 'success' => $success_url, 'reject' => $reject_url ? $reject_url : admin_url(), ) ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <?php if ( is_wp_error( $error ) ) { wp_admin_notice( $error->get_error_message(), array( 'type' => 'error', ) ); } ?> <div class="card auth-app-card"> <h2 class="title"><?php _e( 'An application would like to connect to your account.' ); ?></h2> <?php if ( $app_name ) : ?> <p> <?php printf( /* translators: %s: Application name. */ __( 'Would you like to give the application identifying itself as %s access to your account? You should only do this if you trust the application in question.' ), '<strong>' . esc_html( $app_name ) . '</strong>' ); ?> </p> <?php else : ?> <p><?php _e( 'Would you like to give this application access to your account? You should only do this if you trust the application in question.' ); ?></p> <?php endif; ?> <?php if ( is_multisite() ) { $blogs = get_blogs_of_user( $user->ID, true ); $blogs_count = count( $blogs ); if ( $blogs_count > 1 ) { ?> <p> <?php /* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */ $message = _n( 'This will grant access to <a href="%1$s">the %2$s site in this installation that you have permissions on</a>.', 'This will grant access to <a href="%1$s">all %2$s sites in this installation that you have permissions on</a>.', $blogs_count ); if ( is_super_admin() ) { /* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */ $message = _n( 'This will grant access to <a href="%1$s">the %2$s site on the network as you have Super Admin rights</a>.', 'This will grant access to <a href="%1$s">all %2$s sites on the network as you have Super Admin rights</a>.', $blogs_count ); } printf( $message, admin_url( 'my-sites.php' ), number_format_i18n( $blogs_count ) ); ?> </p> <?php } } ?> <?php if ( $new_password ) : $message = '<p class="application-password-display"> <label for="new-application-password-value">' . sprintf( /* translators: %s: Application name. */ esc_html__( 'Your new password for %s is:' ), '<strong>' . esc_html( $app_name ) . '</strong>' ) . ' </label> <input id="new-application-password-value" type="text" class="code" readonly="readonly" value="' . esc_attr( WP_Application_Passwords::chunk_password( $new_password ) ) . '" /> </p> <p>' . __( 'Be sure to save this in a safe location. You will not be able to retrieve it.' ) . '</p>'; $args = array( 'type' => 'success', 'additional_classes' => array( 'notice-alt', 'below-h2' ), 'paragraph_wrap' => false, ); wp_admin_notice( $message, $args ); /** * Fires in the Authorize Application Password new password section in the no-JS version. * * In most cases, this should be used in combination with the {@see 'wp_application_passwords_approve_app_request_success'} * action to ensure that both the JS and no-JS variants are handled. * * @since 5.6.0 * @since 5.6.1 Corrected action name and signature. * * @param string $new_password The newly generated application password. * @param array $request The array of request data. All arguments are optional and may be empty. * @param WP_User $user The user authorizing the application. */ do_action( 'wp_authorize_application_password_form_approved_no_js', $new_password, $request, $user ); else : ?> <form action="<?php echo esc_url( admin_url( 'authorize-application.php' ) ); ?>" method="post" class="form-wrap"> <?php wp_nonce_field( 'authorize_application_password' ); ?> <input type="hidden" name="action" value="authorize_application_password" /> <input type="hidden" name="app_id" value="<?php echo esc_attr( $app_id ); ?>" /> <input type="hidden" name="success_url" value="<?php echo esc_url( $success_url ); ?>" /> <input type="hidden" name="reject_url" value="<?php echo esc_url( $reject_url ); ?>" /> <div class="form-field"> <label for="app_name"><?php _e( 'New Application Password Name' ); ?></label> <input type="text" id="app_name" name="app_name" value="<?php echo esc_attr( $app_name ); ?>" required /> </div> <?php /** * Fires in the Authorize Application Password form before the submit buttons. * * @since 5.6.0 * * @param array $request { * The array of request data. All arguments are optional and may be empty. * * @type string $app_name The suggested name of the application. * @type string $success_url The URL the user will be redirected to after approving the application. * @type string $reject_url The URL the user will be redirected to after rejecting the application. * } * @param WP_User $user The user authorizing the application. */ do_action( 'wp_authorize_application_password_form', $request, $user ); ?> <?php submit_button( __( 'Yes, I approve of this connection' ), 'primary', 'approve', false, array( 'aria-describedby' => 'description-approve', ) ); ?> <p class="description" id="description-approve"> <?php if ( $success_url ) { printf( /* translators: %s: The URL the user is being redirected to. */ __( 'You will be sent to %s' ), '<strong><code>' . esc_html( add_query_arg( array( 'site_url' => site_url(), 'user_login' => $user->user_login, 'password' => '[------]', ), $success_url ) ) . '</code></strong>' ); } else { _e( 'You will be given a password to manually enter into the application in question.' ); } ?> </p> <?php submit_button( __( 'No, I do not approve of this connection' ), 'secondary', 'reject', false, array( 'aria-describedby' => 'description-reject', ) ); ?> <p class="description" id="description-reject"> <?php if ( $reject_url ) { printf( /* translators: %s: The URL the user is being redirected to. */ __( 'You will be sent to %s' ), '<strong><code>' . esc_html( $reject_url ) . '</code></strong>' ); } else { _e( 'You will be returned to the WordPress Dashboard, and no changes will be made.' ); } ?> </p> </form> <?php endif; ?> </div> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; credits.php 0000644 00000010164 15151241221 0006706 0 ustar 00 <?php /** * Credits administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; require_once __DIR__ . '/includes/credits.php'; // Used in the HTML title tag. $title = __( 'Credits' ); list( $display_version ) = explode( '-', get_bloginfo( 'version' ) ); require_once ABSPATH . 'wp-admin/admin-header.php'; $credits = wp_credits(); ?> <div class="wrap about__container"> <div class="about__header"> <div class="about__header-title"> <h1> <?php _e( 'Contributors' ); ?> </h1> </div> <div class="about__header-text"> <?php _e( 'Created by a worldwide team of passionate individuals' ); ?> </div> </div> <nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>"> <a href="about.php" class="nav-tab"><?php _e( 'What’s New' ); ?></a> <a href="credits.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'Credits' ); ?></a> <a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a> <a href="privacy.php" class="nav-tab"><?php _e( 'Privacy' ); ?></a> <a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a> </nav> <div class="about__section has-1-column has-gutters"> <div class="column aligncenter"> <?php if ( ! $credits ) : ?> <p> <?php printf( /* translators: 1: https://wordpress.org/about/ */ __( 'WordPress is created by a <a href="%1$s">worldwide team</a> of passionate individuals.' ), __( 'https://wordpress.org/about/' ) ); ?> <br /> <a href="<?php echo esc_url( __( 'https://make.wordpress.org/contribute/' ) ); ?>"><?php _e( 'Get involved in WordPress.' ); ?></a> </p> <?php else : ?> <p> <?php _e( 'Want to see your name in lights on this page?' ); ?> <br /> <a href="<?php echo esc_url( __( 'https://make.wordpress.org/contribute/' ) ); ?>"><?php _e( 'Get involved in WordPress.' ); ?></a> </p> <?php endif; ?> </div> </div> <?php if ( ! $credits ) { echo '</div>'; require_once ABSPATH . 'wp-admin/admin-footer.php'; exit; } ?> <hr class="is-large" /> <div class="about__section"> <div class="column is-edge-to-edge"> <?php wp_credits_section_title( $credits['groups']['core-developers'] ); ?> <?php wp_credits_section_list( $credits, 'core-developers' ); ?> <?php wp_credits_section_list( $credits, 'contributing-developers' ); ?> </div> </div> <hr /> <div class="about__section"> <div class="column"> <?php wp_credits_section_title( $credits['groups']['props'] ); ?> <?php wp_credits_section_list( $credits, 'props' ); ?> </div> </div> <hr /> <?php if ( isset( $credits['groups']['translators'] ) || isset( $credits['groups']['validators'] ) ) : ?> <div class="about__section"> <div class="column"> <?php wp_credits_section_title( $credits['groups']['validators'] ); ?> <?php wp_credits_section_list( $credits, 'validators' ); ?> <?php wp_credits_section_list( $credits, 'translators' ); ?> </div> </div> <hr /> <?php endif; ?> <div class="about__section"> <div class="column"> <?php wp_credits_section_title( $credits['groups']['libraries'] ); ?> <?php wp_credits_section_list( $credits, 'libraries' ); ?> </div> </div> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; return; // These are strings returned by the API that we want to be translatable. __( 'Project Leaders' ); /* translators: %s: The current WordPress version number. */ __( 'Core Contributors to WordPress %s' ); __( 'Noteworthy Contributors' ); __( 'Cofounder, Project Lead' ); __( 'Lead Developer' ); __( 'Release Lead' ); __( 'Release Design Lead' ); __( 'Release Deputy' ); __( 'Release Coordination' ); __( 'Minor Release Lead' ); __( 'Core Developer' ); __( 'Core Tech Lead' ); __( 'Core Triage Lead' ); __( 'Editor Tech Lead' ); __( 'Editor Triage Lead' ); __( 'Documentation Lead' ); __( 'Test Lead' ); __( 'Design Lead' ); __( 'Performance Lead' ); __( 'Default Theme Design Lead' ); __( 'Default Theme Development Lead' ); __( 'Tech Lead' ); __( 'Triage Lead' ); __( 'External Libraries' ); edit-comments.php 0000644 00000034606 15151241222 0010031 0 ustar 00 <?php /** * Edit Comments Administration Screen. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'edit_posts' ) ) { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to edit comments.' ) . '</p>', 403 ); } $wp_list_table = _get_list_table( 'WP_Comments_List_Table' ); $pagenum = $wp_list_table->get_pagenum(); $doaction = $wp_list_table->current_action(); if ( $doaction ) { check_admin_referer( 'bulk-comments' ); if ( 'delete_all' === $doaction && ! empty( $_REQUEST['pagegen_timestamp'] ) ) { /** * @global wpdb $wpdb WordPress database abstraction object. */ global $wpdb; $comment_status = wp_unslash( $_REQUEST['comment_status'] ); $delete_time = wp_unslash( $_REQUEST['pagegen_timestamp'] ); $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = %s AND %s > comment_date_gmt", $comment_status, $delete_time ) ); $doaction = 'delete'; } elseif ( isset( $_REQUEST['delete_comments'] ) ) { $comment_ids = $_REQUEST['delete_comments']; $doaction = $_REQUEST['action']; } elseif ( isset( $_REQUEST['ids'] ) ) { $comment_ids = array_map( 'absint', explode( ',', $_REQUEST['ids'] ) ); } elseif ( wp_get_referer() ) { wp_safe_redirect( wp_get_referer() ); exit; } $approved = 0; $unapproved = 0; $spammed = 0; $unspammed = 0; $trashed = 0; $untrashed = 0; $deleted = 0; $redirect_to = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'spammed', 'unspammed', 'approved', 'unapproved', 'ids', ), wp_get_referer() ); $redirect_to = add_query_arg( 'paged', $pagenum, $redirect_to ); wp_defer_comment_counting( true ); foreach ( $comment_ids as $comment_id ) { // Check the permissions on each. if ( ! current_user_can( 'edit_comment', $comment_id ) ) { continue; } switch ( $doaction ) { case 'approve': wp_set_comment_status( $comment_id, 'approve' ); ++$approved; break; case 'unapprove': wp_set_comment_status( $comment_id, 'hold' ); ++$unapproved; break; case 'spam': wp_spam_comment( $comment_id ); ++$spammed; break; case 'unspam': wp_unspam_comment( $comment_id ); ++$unspammed; break; case 'trash': wp_trash_comment( $comment_id ); ++$trashed; break; case 'untrash': wp_untrash_comment( $comment_id ); ++$untrashed; break; case 'delete': wp_delete_comment( $comment_id ); ++$deleted; break; } } if ( ! in_array( $doaction, array( 'approve', 'unapprove', 'spam', 'unspam', 'trash', 'delete' ), true ) ) { $screen = get_current_screen()->id; /** This action is documented in wp-admin/edit.php */ $redirect_to = apply_filters( "handle_bulk_actions-{$screen}", $redirect_to, $doaction, $comment_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } wp_defer_comment_counting( false ); if ( $approved ) { $redirect_to = add_query_arg( 'approved', $approved, $redirect_to ); } if ( $unapproved ) { $redirect_to = add_query_arg( 'unapproved', $unapproved, $redirect_to ); } if ( $spammed ) { $redirect_to = add_query_arg( 'spammed', $spammed, $redirect_to ); } if ( $unspammed ) { $redirect_to = add_query_arg( 'unspammed', $unspammed, $redirect_to ); } if ( $trashed ) { $redirect_to = add_query_arg( 'trashed', $trashed, $redirect_to ); } if ( $untrashed ) { $redirect_to = add_query_arg( 'untrashed', $untrashed, $redirect_to ); } if ( $deleted ) { $redirect_to = add_query_arg( 'deleted', $deleted, $redirect_to ); } if ( $trashed || $spammed ) { $redirect_to = add_query_arg( 'ids', implode( ',', $comment_ids ), $redirect_to ); } wp_safe_redirect( $redirect_to ); exit; } elseif ( ! empty( $_GET['_wp_http_referer'] ) ) { wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); exit; } $wp_list_table->prepare_items(); wp_enqueue_script( 'admin-comments' ); enqueue_comment_hotkeys_js(); /** * @global int $post_id */ global $post_id; if ( $post_id ) { $comments_count = wp_count_comments( $post_id ); $draft_or_post_title = wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '…' ); if ( $comments_count->moderated > 0 ) { // Used in the HTML title tag. $title = sprintf( /* translators: 1: Comments count, 2: Post title. */ __( 'Comments (%1$s) on “%2$s”' ), number_format_i18n( $comments_count->moderated ), $draft_or_post_title ); } else { // Used in the HTML title tag. $title = sprintf( /* translators: %s: Post title. */ __( 'Comments on “%s”' ), $draft_or_post_title ); } } else { $comments_count = wp_count_comments(); if ( $comments_count->moderated > 0 ) { // Used in the HTML title tag. $title = sprintf( /* translators: %s: Comments count. */ __( 'Comments (%s)' ), number_format_i18n( $comments_count->moderated ) ); } else { // Used in the HTML title tag. $title = __( 'Comments' ); } } add_screen_option( 'per_page' ); get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the bulk actions.' ) . '</p>', ) ); get_current_screen()->add_help_tab( array( 'id' => 'moderating-comments', 'title' => __( 'Moderating Comments' ), 'content' => '<p>' . __( 'A red bar on the left means the comment is waiting for you to moderate it.' ) . '</p>' . '<p>' . __( 'In the <strong>Author</strong> column, in addition to the author’s name, email address, and site URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address.' ) . '</p>' . '<p>' . __( 'In the <strong>Comment</strong> column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment.' ) . '</p>' . '<p>' . __( 'In the <strong>In response to</strong> column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post.' ) . '</p>' . '<p>' . __( 'In the <strong>Submitted on</strong> column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site.' ) . '</p>' . '<p>' . __( 'Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/comments-screen/">Documentation on Comments</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/understand-comment-spam/">Documentation on Comment Spam</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/keyboard-shortcuts-classic-editor/#keyboard-shortcuts-for-comments">Documentation on Keyboard Shortcuts</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); get_current_screen()->set_screen_reader_content( array( 'heading_views' => __( 'Filter comments list' ), 'heading_pagination' => __( 'Comments list navigation' ), 'heading_list' => __( 'Comments list' ), ) ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1 class="wp-heading-inline"> <?php if ( $post_id ) { printf( /* translators: %s: Link to post. */ __( 'Comments on “%s”' ), sprintf( '<a href="%1$s">%2$s</a>', get_edit_post_link( $post_id ), wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '…' ) ) ); } else { _e( 'Comments' ); } ?> </h1> <?php if ( $post_id ) { $post_type_object = get_post_type_object( get_post_type( $post_id ) ); if ( $post_type_object ) { printf( '<a href="%1$s" class="comments-view-item-link">%2$s</a>', get_permalink( $post_id ), $post_type_object->labels->view_item ); } } if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) { echo '<span class="subtitle">'; printf( /* translators: %s: Search query. */ __( 'Search results for: %s' ), '<strong>' . esc_html( wp_unslash( $_REQUEST['s'] ) ) . '</strong>' ); echo '</span>'; } ?> <hr class="wp-header-end"> <?php if ( isset( $_REQUEST['error'] ) ) { $error = (int) $_REQUEST['error']; $error_msg = ''; switch ( $error ) { case 1: $error_msg = __( 'Invalid comment ID.' ); break; case 2: $error_msg = __( 'Sorry, you are not allowed to edit comments on this post.' ); break; } if ( $error_msg ) { wp_admin_notice( $error_msg, array( 'id' => 'moderated', 'additional_classes' => array( 'error' ), ) ); } } if ( isset( $_REQUEST['approved'] ) || isset( $_REQUEST['deleted'] ) || isset( $_REQUEST['trashed'] ) || isset( $_REQUEST['untrashed'] ) || isset( $_REQUEST['spammed'] ) || isset( $_REQUEST['unspammed'] ) || isset( $_REQUEST['same'] ) ) { $approved = isset( $_REQUEST['approved'] ) ? (int) $_REQUEST['approved'] : 0; $deleted = isset( $_REQUEST['deleted'] ) ? (int) $_REQUEST['deleted'] : 0; $trashed = isset( $_REQUEST['trashed'] ) ? (int) $_REQUEST['trashed'] : 0; $untrashed = isset( $_REQUEST['untrashed'] ) ? (int) $_REQUEST['untrashed'] : 0; $spammed = isset( $_REQUEST['spammed'] ) ? (int) $_REQUEST['spammed'] : 0; $unspammed = isset( $_REQUEST['unspammed'] ) ? (int) $_REQUEST['unspammed'] : 0; $same = isset( $_REQUEST['same'] ) ? (int) $_REQUEST['same'] : 0; if ( $approved > 0 || $deleted > 0 || $trashed > 0 || $untrashed > 0 || $spammed > 0 || $unspammed > 0 || $same > 0 ) { if ( $approved > 0 ) { $messages[] = sprintf( /* translators: %s: Number of comments. */ _n( '%s comment approved.', '%s comments approved.', $approved ), $approved ); } if ( $spammed > 0 ) { $ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0; $messages[] = sprintf( /* translators: %s: Number of comments. */ _n( '%s comment marked as spam.', '%s comments marked as spam.', $spammed ), $spammed ) . sprintf( ' <a href="%1$s">%2$s</a><br />', esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=unspam&ids=$ids", 'bulk-comments' ) ), __( 'Undo' ) ); } if ( $unspammed > 0 ) { $messages[] = sprintf( /* translators: %s: Number of comments. */ _n( '%s comment restored from the spam.', '%s comments restored from the spam.', $unspammed ), $unspammed ); } if ( $trashed > 0 ) { $ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0; $messages[] = sprintf( /* translators: %s: Number of comments. */ _n( '%s comment moved to the Trash.', '%s comments moved to the Trash.', $trashed ), $trashed ) . sprintf( ' <a href="%1$s">%2$s</a><br />', esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=untrash&ids=$ids", 'bulk-comments' ) ), __( 'Undo' ) ); } if ( $untrashed > 0 ) { $messages[] = sprintf( /* translators: %s: Number of comments. */ _n( '%s comment restored from the Trash.', '%s comments restored from the Trash.', $untrashed ), $untrashed ); } if ( $deleted > 0 ) { $messages[] = sprintf( /* translators: %s: Number of comments. */ _n( '%s comment permanently deleted.', '%s comments permanently deleted.', $deleted ), $deleted ); } if ( $same > 0 ) { $comment = get_comment( $same ); if ( $comment ) { switch ( $comment->comment_approved ) { case '1': $messages[] = __( 'This comment is already approved.' ) . sprintf( ' <a href="%1$s">%2$s</a>', esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ), __( 'Edit comment' ) ); break; case 'trash': $messages[] = __( 'This comment is already in the Trash.' ) . sprintf( ' <a href="%1$s">%2$s</a>', esc_url( admin_url( 'edit-comments.php?comment_status=trash' ) ), __( 'View Trash' ) ); break; case 'spam': $messages[] = __( 'This comment is already marked as spam.' ) . sprintf( ' <a href="%1$s">%2$s</a>', esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ), __( 'Edit comment' ) ); break; } } } wp_admin_notice( implode( "<br />\n", $messages ), array( 'id' => 'moderated', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } } ?> <?php $wp_list_table->views(); ?> <form id="comments-form" method="get"> <?php $wp_list_table->search_box( __( 'Search Comments' ), 'comment' ); ?> <?php if ( $post_id ) : ?> <input type="hidden" name="p" value="<?php echo esc_attr( (int) $post_id ); ?>" /> <?php endif; ?> <input type="hidden" name="comment_status" value="<?php echo esc_attr( $comment_status ); ?>" /> <input type="hidden" name="pagegen_timestamp" value="<?php echo esc_attr( current_time( 'mysql', 1 ) ); ?>" /> <input type="hidden" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'total_items' ) ); ?>" /> <input type="hidden" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'per_page' ) ); ?>" /> <input type="hidden" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'page' ) ); ?>" /> <?php if ( isset( $_REQUEST['paged'] ) ) { ?> <input type="hidden" name="paged" value="<?php echo esc_attr( absint( $_REQUEST['paged'] ) ); ?>" /> <?php } ?> <?php $wp_list_table->display(); ?> </form> </div> <div id="ajax-response"></div> <?php wp_comment_reply( '-1', true, 'detail' ); wp_comment_trashnotice(); require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> export-personal-data.php 0000644 00000017405 15151241222 0011330 0 ustar 00 <?php /** * Privacy tools, Export Personal Data screen. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; if ( ! current_user_can( 'export_others_personal_data' ) ) { wp_die( __( 'Sorry, you are not allowed to export personal data on this site.' ) ); } // Used in the HTML title tag. $title = __( 'Export Personal Data' ); // Contextual help - choose Help on the top right of admin panel to preview this. get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'This screen is where you manage requests for an export of personal data.' ) . '</p>' . '<p>' . __( 'Privacy Laws around the world require businesses and online services to provide an export of some of the data they collect about an individual, and to deliver that export on request. The rights those laws enshrine are sometimes called the "Right of Data Portability". It allows individuals to obtain and reuse their personal data for their own purposes across different services. It allows them to move, copy or transfer personal data easily from one IT environment to another.' ) . '</p>' . '<p>' . __( 'The tool associates data stored in WordPress with a supplied email address, including profile data and comments.' ) . '</p>' . '<p><strong>' . __( 'Note: Since this tool only gathers data from WordPress and participating plugins, you may need to do more to comply with export requests. For example, you should also send the requester some of the data collected from or stored with the 3rd party services your organization uses.' ) . '</strong></p>', ) ); get_current_screen()->add_help_tab( array( 'id' => 'default-data', 'title' => __( 'Default Data' ), 'content' => '<p>' . __( 'WordPress collects (but <em>never</em> publishes) a limited amount of data from registered users who have logged in to the site. Generally, these users are people who contribute to the site in some way -- content, store management, and so on. With rare exceptions, these users do not include occasional visitors who might have registered to comment on articles or buy products. The data WordPress retains can include:' ) . '</p>' . '<p>' . __( '<strong>Profile Information</strong> — user email address, username, display name, nickname, first name, last name, description/bio, and registration date.' ) . '</p>' . '<p>' . __( '<strong>Community Events Location</strong> — The IP Address of the user, which populates the Upcoming Community Events dashboard widget with relevant information.' ) . '</p>' . '<p>' . __( '<strong>Session Tokens</strong> — User login information, IP Addresses, Expiration Date, User Agent (Browser/OS), and Last Login.' ) . '</p>' . '<p>' . __( '<strong>Comments</strong> — For user comments, Email Address, IP Address, User Agent (Browser/OS), Date/Time, Comment Content, and Content URL.' ) . '</p>' . '<p>' . __( '<strong>Media</strong> — A list of URLs for media files the user uploads.' ) . '</p>', ) ); $privacy_policy_guide = '<p>' . sprintf( /* translators: %s: URL to Privacy Policy Guide screen. */ __( 'If you are not sure, check the plugin documentation or contact the plugin author to see if the plugin collects data and if it supports the Data Exporter tool. This information may be available in the <a href="%s">Privacy Policy Guide</a>.' ), admin_url( 'options-privacy.php?tab=policyguide' ) ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'plugin-data', 'title' => __( 'Plugin Data' ), 'content' => '<p>' . __( 'Many plugins may collect or store personal data either in the WordPress database or remotely. Any Export Personal Data request should include data from plugins as well.' ) . '</p>' . $privacy_policy_guide . '<p>' . __( 'If you are a plugin author, you can learn more about <a href="https://developer.wordpress.org/plugins/privacy/adding-the-personal-data-exporter-to-your-plugin/">how to add the Personal Data Exporter to a plugin</a>.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-export-personal-data-screen/">Documentation on Export Personal Data</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); // Handle list table actions. _wp_personal_data_handle_actions(); // Cleans up failed and expired requests before displaying the list table. _wp_personal_data_cleanup_requests(); wp_enqueue_script( 'privacy-tools' ); add_screen_option( 'per_page', array( 'default' => 20, 'option' => 'export_personal_data_requests_per_page', ) ); $_list_table_args = array( 'plural' => 'privacy_requests', 'singular' => 'privacy_request', ); $requests_table = _get_list_table( 'WP_Privacy_Data_Export_Requests_List_Table', $_list_table_args ); $requests_table->screen->set_screen_reader_content( array( 'heading_views' => __( 'Filter export personal data list' ), 'heading_pagination' => __( 'Export personal data list navigation' ), 'heading_list' => __( 'Export personal data list' ), ) ); $requests_table->process_bulk_action(); $requests_table->prepare_items(); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap nosubsub"> <h1><?php esc_html_e( 'Export Personal Data' ); ?></h1> <p><?php _e( 'This tool helps site owners comply with local laws and regulations by exporting known data for a given user in a .zip file.' ); ?></p> <hr class="wp-header-end" /> <?php settings_errors(); ?> <form action="<?php echo esc_url( admin_url( 'export-personal-data.php' ) ); ?>" method="post" class="wp-privacy-request-form"> <h2><?php esc_html_e( 'Add Data Export Request' ); ?></h2> <div class="wp-privacy-request-form-field"> <table class="form-table"> <tr> <th scope="row"> <label for="username_or_email_for_privacy_request"><?php esc_html_e( 'Username or email address' ); ?></label> </th> <td> <input type="text" required class="regular-text ltr" id="username_or_email_for_privacy_request" name="username_or_email_for_privacy_request" /> </td> </tr> <tr> <th scope="row"> <?php _e( 'Confirmation email' ); ?> </th> <td> <label for="send_confirmation_email"> <input type="checkbox" name="send_confirmation_email" id="send_confirmation_email" value="1" checked="checked" /> <?php _e( 'Send personal data export confirmation email.' ); ?> </label> </td> </tr> </table> <p class="submit"> <?php submit_button( __( 'Send Request' ), 'secondary', 'submit', false ); ?> </p> </div> <?php wp_nonce_field( 'personal-data-request' ); ?> <input type="hidden" name="action" value="add_export_personal_data_request" /> <input type="hidden" name="type_of_action" value="export_personal_data" /> </form> <hr /> <?php $requests_table->views(); ?> <form class="search-form wp-clearfix"> <?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?> <input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" /> <input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" /> <input type="hidden" name="order" value="<?php echo isset( $_REQUEST['order'] ) ? esc_attr( sanitize_text_field( $_REQUEST['order'] ) ) : ''; ?>" /> </form> <form method="post"> <?php $requests_table->display(); $requests_table->embed_scripts(); ?> </form> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; tools.php 0000644 00000006672 15151241222 0006423 0 ustar 00 <?php /** * Tools Administration Screen. * * @package WordPress * @subpackage Administration */ if ( isset( $_GET['page'] ) && ! empty( $_POST ) ) { // Ensure POST-ing to `tools.php?page=export_personal_data` and `tools.php?page=remove_personal_data` // continues to work after creating the new files for exporting and erasing of personal data. if ( 'export_personal_data' === $_GET['page'] ) { require_once ABSPATH . 'wp-admin/export-personal-data.php'; return; } elseif ( 'remove_personal_data' === $_GET['page'] ) { require_once ABSPATH . 'wp-admin/erase-personal-data.php'; return; } } // The privacy policy guide used to be outputted from here. Since WP 5.3 it is in wp-admin/privacy-policy-guide.php. if ( isset( $_GET['wp-privacy-policy-guide'] ) ) { require_once dirname( __DIR__ ) . '/wp-load.php'; wp_redirect( admin_url( 'options-privacy.php?tab=policyguide' ), 301 ); exit; } elseif ( isset( $_GET['page'] ) ) { // These were also moved to files in WP 5.3. if ( 'export_personal_data' === $_GET['page'] ) { require_once dirname( __DIR__ ) . '/wp-load.php'; wp_redirect( admin_url( 'export-personal-data.php' ), 301 ); exit; } elseif ( 'remove_personal_data' === $_GET['page'] ) { require_once dirname( __DIR__ ) . '/wp-load.php'; wp_redirect( admin_url( 'erase-personal-data.php' ), 301 ); exit; } } /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; // Used in the HTML title tag. $title = __( 'Tools' ); get_current_screen()->add_help_tab( array( 'id' => 'converter', 'title' => __( 'Categories and Tags Converter' ), 'content' => '<p>' . __( 'Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realize that the other would work better for their content.' ) . '</p>' . '<p>' . __( 'The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin & Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-screen/">Documentation on Tools</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1><?php echo esc_html( $title ); ?></h1> <?php if ( current_user_can( 'import' ) ) : $cats = get_taxonomy( 'category' ); $tags = get_taxonomy( 'post_tag' ); if ( current_user_can( $cats->cap->manage_terms ) || current_user_can( $tags->cap->manage_terms ) ) : ?> <div class="card"> <h2 class="title"><?php _e( 'Categories and Tags Converter' ); ?></h2> <p> <?php printf( /* translators: %s: URL to Import screen. */ __( 'If you want to convert your categories to tags (or vice versa), use the <a href="%s">Categories and Tags Converter</a> available from the Import screen.' ), 'import.php' ); ?> </p> </div> <?php endif; endif; /** * Fires at the end of the Tools Administration screen. * * @since 2.8.0 */ do_action( 'tool_box' ); ?> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; edit-form-advanced.php 0000644 00000071527 15151241222 0010715 0 ustar 00 <?php /** * Post advanced form for inclusion in the administration panels. * * @package WordPress * @subpackage Administration */ // Don't load directly. if ( ! defined( 'ABSPATH' ) ) { die( '-1' ); } /** * @global string $post_type Global post type. * @global WP_Post_Type $post_type_object Global post type object. * @global WP_Post $post Global post object. */ global $post_type, $post_type_object, $post; // Flag that we're not loading the block editor. $current_screen = get_current_screen(); $current_screen->is_block_editor( false ); if ( is_multisite() ) { add_action( 'admin_footer', '_admin_notice_post_locked' ); } else { if ( get_user_count() > 1 ) { add_action( 'admin_footer', '_admin_notice_post_locked' ); } unset( $check_users ); } wp_enqueue_script( 'post' ); $_wp_editor_expand = false; $_content_editor_dfw = false; if ( post_type_supports( $post_type, 'editor' ) && ! wp_is_mobile() && ! ( $is_IE && preg_match( '/MSIE [5678]/', $_SERVER['HTTP_USER_AGENT'] ) ) ) { /** * Filters whether to enable the 'expand' functionality in the post editor. * * @since 4.0.0 * @since 4.1.0 Added the `$post_type` parameter. * * @param bool $expand Whether to enable the 'expand' functionality. Default true. * @param string $post_type Post type. */ if ( apply_filters( 'wp_editor_expand', true, $post_type ) ) { wp_enqueue_script( 'editor-expand' ); $_content_editor_dfw = true; $_wp_editor_expand = ( 'on' === get_user_setting( 'editor_expand', 'on' ) ); } } if ( wp_is_mobile() ) { wp_enqueue_script( 'jquery-touch-punch' ); } /** * Post ID global * * @name $post_ID * @var int */ $post_ID = isset( $post_ID ) ? (int) $post_ID : 0; $user_ID = isset( $user_ID ) ? (int) $user_ID : 0; $action = isset( $action ) ? $action : ''; if ( (int) get_option( 'page_for_posts' ) === $post->ID && empty( $post->post_content ) ) { add_action( 'edit_form_after_title', '_wp_posts_page_notice' ); remove_post_type_support( $post_type, 'editor' ); } $thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ); if ( ! $thumbnail_support && 'attachment' === $post_type && $post->post_mime_type ) { if ( wp_attachment_is( 'audio', $post ) ) { $thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' ); } elseif ( wp_attachment_is( 'video', $post ) ) { $thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' ); } } if ( $thumbnail_support ) { add_thickbox(); wp_enqueue_media( array( 'post' => $post->ID ) ); } // Add the local autosave notice HTML. add_action( 'admin_footer', '_local_storage_notice' ); /* * @todo Document the $messages array(s). */ $permalink = get_permalink( $post->ID ); if ( ! $permalink ) { $permalink = ''; } $messages = array(); $preview_post_link_html = ''; $scheduled_post_link_html = ''; $view_post_link_html = ''; $preview_page_link_html = ''; $scheduled_page_link_html = ''; $view_page_link_html = ''; $preview_url = get_preview_post_link( $post ); $viewable = is_post_type_viewable( $post_type_object ); if ( $viewable ) { // Preview post link. $preview_post_link_html = sprintf( ' <a target="_blank" href="%1$s">%2$s</a>', esc_url( $preview_url ), __( 'Preview post' ) ); // Scheduled post preview link. $scheduled_post_link_html = sprintf( ' <a target="_blank" href="%1$s">%2$s</a>', esc_url( $permalink ), __( 'Preview post' ) ); // View post link. $view_post_link_html = sprintf( ' <a href="%1$s">%2$s</a>', esc_url( $permalink ), __( 'View post' ) ); // Preview page link. $preview_page_link_html = sprintf( ' <a target="_blank" href="%1$s">%2$s</a>', esc_url( $preview_url ), __( 'Preview page' ) ); // Scheduled page preview link. $scheduled_page_link_html = sprintf( ' <a target="_blank" href="%1$s">%2$s</a>', esc_url( $permalink ), __( 'Preview page' ) ); // View page link. $view_page_link_html = sprintf( ' <a href="%1$s">%2$s</a>', esc_url( $permalink ), __( 'View page' ) ); } $scheduled_date = sprintf( /* translators: Publish box date string. 1: Date, 2: Time. */ __( '%1$s at %2$s' ), /* translators: Publish box date format, see https://www.php.net/manual/datetime.format.php */ date_i18n( _x( 'M j, Y', 'publish box date format' ), strtotime( $post->post_date ) ), /* translators: Publish box time format, see https://www.php.net/manual/datetime.format.php */ date_i18n( _x( 'H:i', 'publish box time format' ), strtotime( $post->post_date ) ) ); $messages['post'] = array( 0 => '', // Unused. Messages start at index 1. 1 => __( 'Post updated.' ) . $view_post_link_html, 2 => __( 'Custom field updated.' ), 3 => __( 'Custom field deleted.' ), 4 => __( 'Post updated.' ), /* translators: %s: Date and time of the revision. */ 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Post restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __( 'Post published.' ) . $view_post_link_html, 7 => __( 'Post saved.' ), 8 => __( 'Post submitted.' ) . $preview_post_link_html, /* translators: %s: Scheduled date for the post. */ 9 => sprintf( __( 'Post scheduled for: %s.' ), '<strong>' . $scheduled_date . '</strong>' ) . $scheduled_post_link_html, 10 => __( 'Post draft updated.' ) . $preview_post_link_html, ); $messages['page'] = array( 0 => '', // Unused. Messages start at index 1. 1 => __( 'Page updated.' ) . $view_page_link_html, 2 => __( 'Custom field updated.' ), 3 => __( 'Custom field deleted.' ), 4 => __( 'Page updated.' ), /* translators: %s: Date and time of the revision. */ 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Page restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __( 'Page published.' ) . $view_page_link_html, 7 => __( 'Page saved.' ), 8 => __( 'Page submitted.' ) . $preview_page_link_html, /* translators: %s: Scheduled date for the page. */ 9 => sprintf( __( 'Page scheduled for: %s.' ), '<strong>' . $scheduled_date . '</strong>' ) . $scheduled_page_link_html, 10 => __( 'Page draft updated.' ) . $preview_page_link_html, ); $messages['attachment'] = array_fill( 1, 10, __( 'Media file updated.' ) ); // Hack, for now. /** * Filters the post updated messages. * * @since 3.0.0 * * @param array[] $messages Post updated messages. For defaults see `$messages` declarations above. */ $messages = apply_filters( 'post_updated_messages', $messages ); $message = false; if ( isset( $_GET['message'] ) ) { $_GET['message'] = absint( $_GET['message'] ); if ( isset( $messages[ $post_type ][ $_GET['message'] ] ) ) { $message = $messages[ $post_type ][ $_GET['message'] ]; } elseif ( ! isset( $messages[ $post_type ] ) && isset( $messages['post'][ $_GET['message'] ] ) ) { $message = $messages['post'][ $_GET['message'] ]; } } $notice = false; $form_extra = ''; if ( 'auto-draft' === $post->post_status ) { if ( 'edit' === $action ) { $post->post_title = ''; } $autosave = false; $form_extra .= "<input type='hidden' id='auto_draft' name='auto_draft' value='1' />"; } else { $autosave = wp_get_post_autosave( $post->ID ); } $form_action = 'editpost'; $nonce_action = 'update-post_' . $post->ID; $form_extra .= "<input type='hidden' id='post_ID' name='post_ID' value='" . esc_attr( $post->ID ) . "' />"; // Detect if there exists an autosave newer than the post and if that autosave is different than the post. if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) { foreach ( _wp_post_revision_fields( $post ) as $autosave_field => $_autosave_field ) { if ( normalize_whitespace( $autosave->$autosave_field ) !== normalize_whitespace( $post->$autosave_field ) ) { $notice = sprintf( /* translators: %s: URL to view the autosave. */ __( 'There is an autosave of this post that is more recent than the version below. <a href="%s">View the autosave</a>' ), get_edit_post_link( $autosave->ID ) ); break; } } // If this autosave isn't different from the current post, begone. if ( ! $notice ) { wp_delete_post_revision( $autosave->ID ); } unset( $autosave_field, $_autosave_field ); } $post_type_object = get_post_type_object( $post_type ); // All meta boxes should be defined and added before the first do_meta_boxes() call (or potentially during the do_meta_boxes action). require_once ABSPATH . 'wp-admin/includes/meta-boxes.php'; register_and_do_post_meta_boxes( $post ); add_screen_option( 'layout_columns', array( 'max' => 2, 'default' => 2, ) ); if ( 'post' === $post_type ) { $customize_display = '<p>' . __( 'The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop. You can also minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'customize-display', 'title' => __( 'Customizing This Display' ), 'content' => $customize_display, ) ); $title_and_editor = '<p>' . __( '<strong>Title</strong> — Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit.' ) . '</p>'; $title_and_editor .= '<p>' . __( '<strong>Post editor</strong> — Enter the text for your post. There are two modes of editing: Visual and Code. Choose the mode by clicking on the appropriate tab.' ) . '</p>'; $title_and_editor .= '<p>' . __( 'Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls.' ) . '</p>'; $title_and_editor .= '<p>' . __( 'The Code mode allows you to enter HTML along with your post text. Note that <p> and <br> tags are converted to line breaks when switching to the Code editor to make it less cluttered. When you type, a single line break can be used instead of typing <br>, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically.' ) . '</p>'; $title_and_editor .= '<p>' . __( 'You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode.' ) . '</p>'; $title_and_editor .= '<p>' . __( 'You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options.' ) . '</p>'; $title_and_editor .= '<p>' . sprintf( /* translators: %s: Alt + F10 */ __( 'Keyboard users: When you are working in the visual editor, you can use %s to access the toolbar.' ), '<kbd>Alt + F10</kbd>' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'title-post-editor', 'title' => __( 'Title and Post Editor' ), 'content' => $title_and_editor, ) ); get_current_screen()->set_help_sidebar( '<p>' . sprintf( /* translators: %s: URL to Press This bookmarklet. */ __( 'You can also create posts with the <a href="%s">Press This bookmarklet</a>.' ), 'tools.php' ) . '</p>' . '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/write-posts-classic-editor/">Documentation on Writing and Editing Posts</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); } elseif ( 'page' === $post_type ) { $about_pages = '<p>' . __( 'Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the “Parent” of the other, creating a group of pages.' ) . '</p>' . '<p>' . __( 'Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Code modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'about-pages', 'title' => __( 'About Pages' ), 'content' => $about_pages, ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/pages-add-new-screen/">Documentation on Adding New Pages</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/pages-screen/">Documentation on Editing Pages</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); } elseif ( 'attachment' === $post_type ) { get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'This screen allows you to edit fields for metadata in a file within the media library.' ) . '</p>' . '<p>' . __( 'For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information.' ) . '</p>' . '<p>' . __( 'Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping.' ) . '</p>' . '<p>' . __( 'Remember to click Update to save metadata entered or changed.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/edit-media/">Documentation on Edit Media</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); } if ( 'post' === $post_type || 'page' === $post_type ) { $inserting_media = '<p>' . __( 'You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the “Create a new gallery” button.' ) . '</p>'; $inserting_media .= '<p>' . __( 'You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. <a href="https://wordpress.org/documentation/article/embeds/">Learn more about embeds</a>.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'inserting-media', 'title' => __( 'Inserting Media' ), 'content' => $inserting_media, ) ); } if ( 'post' === $post_type ) { $publish_box = '<p>' . __( 'Several boxes on this screen contain settings for how your content will be published, including:' ) . '</p>'; $publish_box .= '<ul><li>' . __( '<strong>Publish</strong> — You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators. Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post.' ) . '</li>'; if ( current_theme_supports( 'post-formats' ) && post_type_supports( 'post', 'post-formats' ) ) { $publish_box .= '<li>' . __( '<strong>Format</strong> — Post Formats designate how your theme will display a specific post. For example, you could have a <em>standard</em> blog post with a title and paragraphs, or a short <em>aside</em> that omits the title and contains a short text blurb. Your theme could enable all or some of 10 possible formats. <a href="https://developer.wordpress.org/advanced-administration/wordpress/post-formats/#supported-formats">Learn more about each post format</a>.' ) . '</li>'; } if ( current_theme_supports( 'post-thumbnails' ) && post_type_supports( 'post', 'thumbnail' ) ) { $publish_box .= '<li>' . sprintf( /* translators: %s: Featured image. */ __( '<strong>%s</strong> — This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc.' ), esc_html( $post_type_object->labels->featured_image ) ) . '</li>'; } $publish_box .= '</ul>'; get_current_screen()->add_help_tab( array( 'id' => 'publish-box', 'title' => __( 'Publish Settings' ), 'content' => $publish_box, ) ); $discussion_settings = '<p>' . __( '<strong>Send Trackbacks</strong> — Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary.' ) . '</p>'; $discussion_settings .= '<p>' . __( '<strong>Discussion</strong> — You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'discussion-settings', 'title' => __( 'Discussion Settings' ), 'content' => $discussion_settings, ) ); } elseif ( 'page' === $post_type ) { $page_attributes = '<p>' . __( '<strong>Parent</strong> — You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages.' ) . '</p>' . '<p>' . __( '<strong>Template</strong> — Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu.' ) . '</p>' . '<p>' . __( '<strong>Order</strong> — Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'page-attributes', 'title' => __( 'Page Attributes' ), 'content' => $page_attributes, ) ); } require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1 class="wp-heading-inline"> <?php echo esc_html( $title ); ?> </h1> <?php if ( isset( $post_new_file ) && current_user_can( $post_type_object->cap->create_posts ) ) { echo ' <a href="' . esc_url( admin_url( $post_new_file ) ) . '" class="page-title-action">' . esc_html( $post_type_object->labels->add_new_item ) . '</a>'; } ?> <hr class="wp-header-end"> <?php if ( $notice ) : wp_admin_notice( '<p id="has-newer-autosave">' . $notice . '</p>', array( 'type' => 'warning', 'id' => 'notice', 'paragraph_wrap' => false, ) ); endif; if ( $message ) : wp_admin_notice( $message, array( 'type' => 'success', 'dismissible' => true, 'id' => 'message', 'additional_classes' => array( 'updated' ), ) ); endif; $connection_lost_message = sprintf( '<span class="spinner"></span> %1$s <span class="hide-if-no-sessionstorage">%2$s</span>', __( '<strong>Connection lost.</strong> Saving has been disabled until you are reconnected.' ), __( 'This post is being backed up in your browser, just in case.' ) ); wp_admin_notice( $connection_lost_message, array( 'id' => 'lost-connection-notice', 'additional_classes' => array( 'error', 'hidden' ), ) ); ?> <form name="post" action="post.php" method="post" id="post" <?php /** * Fires inside the post editor form tag. * * @since 3.0.0 * * @param WP_Post $post Post object. */ do_action( 'post_edit_form_tag', $post ); $referer = wp_get_referer(); ?> > <?php wp_nonce_field( $nonce_action ); ?> <input type="hidden" id="user-id" name="user_ID" value="<?php echo (int) $user_ID; ?>" /> <input type="hidden" id="hiddenaction" name="action" value="<?php echo esc_attr( $form_action ); ?>" /> <input type="hidden" id="originalaction" name="originalaction" value="<?php echo esc_attr( $form_action ); ?>" /> <input type="hidden" id="post_author" name="post_author" value="<?php echo esc_attr( $post->post_author ); ?>" /> <input type="hidden" id="post_type" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" /> <input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo esc_attr( $post->post_status ); ?>" /> <input type="hidden" id="referredby" name="referredby" value="<?php echo $referer ? esc_url( $referer ) : ''; ?>" /> <?php if ( ! empty( $active_post_lock ) ) { ?> <input type="hidden" id="active_post_lock" value="<?php echo esc_attr( implode( ':', $active_post_lock ) ); ?>" /> <?php } if ( 'draft' !== get_post_status( $post ) ) { wp_original_referer_field( true, 'previous' ); } echo $form_extra; wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?> <?php /** * Fires at the beginning of the edit form. * * At this point, the required hidden fields and nonces have already been output. * * @since 3.7.0 * * @param WP_Post $post Post object. */ do_action( 'edit_form_top', $post ); ?> <div id="poststuff"> <div id="post-body" class="metabox-holder columns-<?php echo ( 1 === get_current_screen()->get_columns() ) ? '1' : '2'; ?>"> <div id="post-body-content"> <?php if ( post_type_supports( $post_type, 'title' ) ) { ?> <div id="titlediv"> <div id="titlewrap"> <?php /** * Filters the title field placeholder text. * * @since 3.1.0 * * @param string $text Placeholder text. Default 'Add title'. * @param WP_Post $post Post object. */ $title_placeholder = apply_filters( 'enter_title_here', __( 'Add title' ), $post ); ?> <label class="screen-reader-text" id="title-prompt-text" for="title"><?php echo $title_placeholder; ?></label> <input type="text" name="post_title" size="30" value="<?php echo esc_attr( $post->post_title ); ?>" id="title" spellcheck="true" autocomplete="off" /> <?php if ( post_type_supports( $post_type, 'editor' ) ) { ?> <a href="#content" class="button-secondary screen-reader-text skiplink" onclick="if (tinymce) { tinymce.execCommand( 'mceFocus', false, 'content' ); }"><?php esc_html_e( 'Skip to Editor' ); ?></a> <?php } ?> </div> <?php /** * Fires before the permalink field in the edit form. * * @since 4.1.0 * * @param WP_Post $post Post object. */ do_action( 'edit_form_before_permalink', $post ); ?> <div class="inside"> <?php if ( $viewable ) : $sample_permalink_html = $post_type_object->public ? get_sample_permalink_html( $post->ID ) : ''; // As of 4.4, the Get Shortlink button is hidden by default. if ( has_filter( 'pre_get_shortlink' ) || has_filter( 'get_shortlink' ) ) { $shortlink = wp_get_shortlink( $post->ID, 'post' ); if ( ! empty( $shortlink ) && $shortlink !== $permalink && home_url( '?page_id=' . $post->ID ) !== $permalink ) { $sample_permalink_html .= '<input id="shortlink" type="hidden" value="' . esc_attr( $shortlink ) . '" />' . '<button type="button" class="button button-small" onclick="prompt('URL:', jQuery(\'#shortlink\').val());">' . __( 'Get Shortlink' ) . '</button>'; } } if ( $post_type_object->public && ! ( 'pending' === get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) ) ) { $has_sample_permalink = $sample_permalink_html && 'auto-draft' !== $post->post_status; ?> <div id="edit-slug-box" class="hide-if-no-js"> <?php if ( $has_sample_permalink ) { echo $sample_permalink_html; } ?> </div> <?php } endif; ?> </div> <?php wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false ); ?> </div><!-- /titlediv --> <?php } /** * Fires after the title field. * * @since 3.5.0 * * @param WP_Post $post Post object. */ do_action( 'edit_form_after_title', $post ); if ( post_type_supports( $post_type, 'editor' ) ) { $_wp_editor_expand_class = ''; if ( $_wp_editor_expand ) { $_wp_editor_expand_class = ' wp-editor-expand'; } ?> <div id="postdivrich" class="postarea<?php echo $_wp_editor_expand_class; ?>"> <?php wp_editor( $post->post_content, 'content', array( '_content_editor_dfw' => $_content_editor_dfw, 'drag_drop_upload' => true, 'editor_height' => 300, 'tinymce' => array( 'resize' => false, 'wp_autoresize_on' => $_wp_editor_expand, 'add_unload_trigger' => false, ), ) ); ?> <table id="post-status-info" role="presentation"><tbody><tr> <td id="wp-word-count" class="hide-if-no-js"> <?php printf( /* translators: %s: Number of words. */ __( 'Word count: %s' ), '<span class="word-count">0</span>' ); ?> </td> <td class="autosave-info"> <span class="autosave-message"> </span> <?php if ( 'auto-draft' !== $post->post_status ) { echo '<span id="last-edit">'; $last_user = get_userdata( get_post_meta( $post->ID, '_edit_last', true ) ); if ( $last_user ) { printf( /* translators: 1: Name of most recent post author, 2: Post edited date, 3: Post edited time. */ __( 'Last edited by %1$s on %2$s at %3$s' ), esc_html( $last_user->display_name ), mysql2date( __( 'F j, Y' ), $post->post_modified ), mysql2date( __( 'g:i a' ), $post->post_modified ) ); } else { printf( /* translators: 1: Post edited date, 2: Post edited time. */ __( 'Last edited on %1$s at %2$s' ), mysql2date( __( 'F j, Y' ), $post->post_modified ), mysql2date( __( 'g:i a' ), $post->post_modified ) ); } echo '</span>'; } ?> </td> <td id="content-resize-handle" class="hide-if-no-js"><br /></td> </tr></tbody></table> </div> <?php } /** * Fires after the content editor. * * @since 3.5.0 * * @param WP_Post $post Post object. */ do_action( 'edit_form_after_editor', $post ); ?> </div><!-- /post-body-content --> <div id="postbox-container-1" class="postbox-container"> <?php if ( 'page' === $post_type ) { /** * Fires before meta boxes with 'side' context are output for the 'page' post type. * * The submitpage box is a meta box with 'side' context, so this hook fires just before it is output. * * @since 2.5.0 * * @param WP_Post $post Post object. */ do_action( 'submitpage_box', $post ); } else { /** * Fires before meta boxes with 'side' context are output for all post types other than 'page'. * * The submitpost box is a meta box with 'side' context, so this hook fires just before it is output. * * @since 2.5.0 * * @param WP_Post $post Post object. */ do_action( 'submitpost_box', $post ); } do_meta_boxes( $post_type, 'side', $post ); ?> </div> <div id="postbox-container-2" class="postbox-container"> <?php do_meta_boxes( null, 'normal', $post ); if ( 'page' === $post_type ) { /** * Fires after 'normal' context meta boxes have been output for the 'page' post type. * * @since 1.5.0 * * @param WP_Post $post Post object. */ do_action( 'edit_page_form', $post ); } else { /** * Fires after 'normal' context meta boxes have been output for all post types other than 'page'. * * @since 1.5.0 * * @param WP_Post $post Post object. */ do_action( 'edit_form_advanced', $post ); } do_meta_boxes( null, 'advanced', $post ); ?> </div> <?php /** * Fires after all meta box sections have been output, before the closing #post-body div. * * @since 2.1.0 * * @param WP_Post $post Post object. */ do_action( 'dbx_post_sidebar', $post ); ?> </div><!-- /post-body --> <br class="clear" /> </div><!-- /poststuff --> </form> </div> <?php if ( post_type_supports( $post_type, 'comments' ) ) { wp_comment_reply(); } ?> <?php if ( ! wp_is_mobile() && post_type_supports( $post_type, 'title' ) && '' === $post->post_title ) : ?> <script type="text/javascript"> try{document.post.title.focus();}catch(e){} </script> <?php endif; ?> custom-header.php 0000644 00000000763 15151241222 0010016 0 ustar 00 <?php /** * Custom header image script. * * This file is deprecated, use 'wp-admin/includes/class-custom-image-header.php' instead. * * @deprecated 5.3.0 * @package WordPress * @subpackage Administration */ // Don't load directly. if ( ! defined( 'ABSPATH' ) ) { die( '-1' ); } _deprecated_file( basename( __FILE__ ), '5.3.0', 'wp-admin/includes/class-custom-image-header.php' ); /** Custom_Image_Header class */ require_once ABSPATH . 'wp-admin/includes/class-custom-image-header.php'; edit-link-form.php 0000644 00000014322 15151241222 0010073 0 ustar 00 <?php /** * Edit links form for inclusion in administration panels. * * @package WordPress * @subpackage Administration */ // Don't load directly. if ( ! defined( 'ABSPATH' ) ) { die( '-1' ); } if ( ! empty( $link_id ) ) { /* translators: %s: URL to Links screen. */ $heading = sprintf( __( '<a href="%s">Links</a> / Edit Link' ), 'link-manager.php' ); $submit_text = __( 'Update Link' ); $form_name = 'editlink'; $nonce_action = 'update-bookmark_' . $link_id; } else { /* translators: %s: URL to Links screen. */ $heading = sprintf( __( '<a href="%s">Links</a> / Add Link' ), 'link-manager.php' ); $submit_text = __( 'Add Link' ); $form_name = 'addlink'; $nonce_action = 'add-bookmark'; } require_once ABSPATH . 'wp-admin/includes/meta-boxes.php'; add_meta_box( 'linksubmitdiv', __( 'Save' ), 'link_submit_meta_box', null, 'side', 'core' ); add_meta_box( 'linkcategorydiv', __( 'Categories' ), 'link_categories_meta_box', null, 'normal', 'core' ); add_meta_box( 'linktargetdiv', __( 'Target' ), 'link_target_meta_box', null, 'normal', 'core' ); add_meta_box( 'linkxfndiv', __( 'Link Relationship (XFN)' ), 'link_xfn_meta_box', null, 'normal', 'core' ); add_meta_box( 'linkadvanceddiv', __( 'Advanced' ), 'link_advanced_meta_box', null, 'normal', 'core' ); /** This action is documented in wp-admin/includes/meta-boxes.php */ do_action( 'add_meta_boxes', 'link', $link ); /** * Fires when link-specific meta boxes are added. * * @since 3.0.0 * * @param object $link Link object. */ do_action( 'add_meta_boxes_link', $link ); /** This action is documented in wp-admin/includes/meta-boxes.php */ do_action( 'do_meta_boxes', 'link', 'normal', $link ); /** This action is documented in wp-admin/includes/meta-boxes.php */ do_action( 'do_meta_boxes', 'link', 'advanced', $link ); /** This action is documented in wp-admin/includes/meta-boxes.php */ do_action( 'do_meta_boxes', 'link', 'side', $link ); add_screen_option( 'layout_columns', array( 'max' => 2, 'default' => 2, ) ); get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'You can add or edit links on this screen by entering information in each of the boxes. Only the link’s web address and name (the text you want to display on your site as the link) are required fields.' ) . '</p>' . '<p>' . __( 'The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you do not use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box.' ) . '</p>' . '<p>' . __( 'XFN stands for <a href="https://gmpg.org/xfn/">XHTML Friends Network</a>, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking.' ) . '</p>', ) ); get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://codex.wordpress.org/Links_Add_New_Screen">Documentation on Creating Links</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1 class="wp-heading-inline"> <?php echo esc_html( $title ); ?> </h1> <a href="link-add.php" class="page-title-action"><?php echo esc_html__( 'Add Link' ); ?></a> <hr class="wp-header-end"> <?php if ( isset( $_GET['added'] ) ) { wp_admin_notice( __( 'Link added.' ), array( 'id' => 'message', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } ?> <form name="<?php echo esc_attr( $form_name ); ?>" id="<?php echo esc_attr( $form_name ); ?>" method="post" action="link.php"> <?php if ( ! empty( $link_added ) ) { echo $link_added; } wp_nonce_field( $nonce_action ); wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?> <div id="poststuff"> <div id="post-body" class="metabox-holder columns-<?php echo ( 1 === get_current_screen()->get_columns() ) ? '1' : '2'; ?>"> <div id="post-body-content"> <div id="namediv" class="postbox"> <h2 class="postbox-header"><label for="link_name"><?php _ex( 'Name', 'link name' ); ?></label></h2> <div class="inside"> <input type="text" name="link_name" size="30" maxlength="255" value="<?php echo esc_attr( $link->link_name ); ?>" id="link_name" /> <p><?php _e( 'Example: Nifty blogging software' ); ?></p> </div> </div> <div id="addressdiv" class="postbox"> <h2 class="postbox-header"><label for="link_url"><?php _e( 'Web Address' ); ?></label></h2> <div class="inside"> <input type="text" name="link_url" size="30" maxlength="255" class="code" value="<?php echo esc_url( $link->link_url ); ?>" id="link_url" /> <p><?php _e( 'Example: <code>https://wordpress.org/</code> — do not forget the <code>https://</code>' ); ?></p> </div> </div> <div id="descriptiondiv" class="postbox"> <h2 class="postbox-header"><label for="link_description"><?php _e( 'Description' ); ?></label></h2> <div class="inside"> <input type="text" name="link_description" size="30" maxlength="255" value="<?php echo isset( $link->link_description ) ? esc_attr( $link->link_description ) : ''; ?>" id="link_description" /> <p><?php _e( 'This will be shown when someone hovers over the link in the blogroll, or optionally below the link.' ); ?></p> </div> </div> </div><!-- /post-body-content --> <div id="postbox-container-1" class="postbox-container"> <?php /** This action is documented in wp-admin/includes/meta-boxes.php */ do_action( 'submitlink_box' ); $side_meta_boxes = do_meta_boxes( 'link', 'side', $link ); ?> </div> <div id="postbox-container-2" class="postbox-container"> <?php do_meta_boxes( null, 'normal', $link ); do_meta_boxes( null, 'advanced', $link ); ?> </div> <?php if ( $link_id ) : ?> <input type="hidden" name="action" value="save" /> <input type="hidden" name="link_id" value="<?php echo (int) $link_id; ?>" /> <input type="hidden" name="cat_id" value="<?php echo (int) $cat_id; ?>" /> <?php else : ?> <input type="hidden" name="action" value="add" /> <?php endif; ?> </div> </div> </form> </div> freedoms.php 0000644 00000011045 15151241222 0007055 0 ustar 00 <?php /** * Your Rights administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; // This file was used to also display the Privacy tab on the About screen from 4.9.6 until 5.3.0. if ( isset( $_GET['privacy-notice'] ) ) { wp_redirect( admin_url( 'privacy.php' ), 301 ); exit; } // Used in the HTML title tag. $title = __( 'Freedoms' ); list( $display_version ) = explode( '-', get_bloginfo( 'version' ) ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap about__container"> <div class="about__header"> <div class="about__header-title"> <h1> <?php _e( 'The Four Freedoms' ); ?> </h1> </div> <div class="about__header-text"> <?php _e( 'WordPress is free and open source software' ); ?> </div> </div> <nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>"> <a href="about.php" class="nav-tab"><?php _e( 'What’s New' ); ?></a> <a href="credits.php" class="nav-tab"><?php _e( 'Credits' ); ?></a> <a href="freedoms.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'Freedoms' ); ?></a> <a href="privacy.php" class="nav-tab"><?php _e( 'Privacy' ); ?></a> <a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a> </nav> <div class="about__section is-feature"> <p class="about-description"> <?php printf( /* translators: %s: https://wordpress.org/about/license/ */ __( 'WordPress comes with some awesome, worldview-changing rights courtesy of its <a href="%s">license</a>, the GPL.' ), __( 'https://wordpress.org/about/license/' ) ); ?> </p> </div> <div class="about__section has-2-columns"> <div class="column aligncenter"> <img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-1.svg?ver=6.5' ) ); ?>" alt="" /> <h2 class="is-smaller-heading"><?php _e( 'The 1st Freedom' ); ?></h2> <p><?php _e( 'To run the program for any purpose.' ); ?></p> </div> <div class="column aligncenter"> <img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-2.svg?ver=6.5' ) ); ?>" alt="" /> <h2 class="is-smaller-heading"><?php _e( 'The 2nd Freedom' ); ?></h2> <p><?php _e( 'To study how the program works and change it to make it do what you wish.' ); ?></p> </div> <div class="column aligncenter"> <img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-3.svg?ver=6.5' ) ); ?>" alt="" /> <h2 class="is-smaller-heading"><?php _e( 'The 3rd Freedom' ); ?></h2> <p><?php _e( 'To redistribute.' ); ?></p> </div> <div class="column aligncenter"> <img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-4.svg?ver=6.5' ) ); ?>" alt="" /> <h2 class="is-smaller-heading"><?php _e( 'The 4th Freedom' ); ?></h2> <p><?php _e( 'To distribute copies of your modified versions to others.' ); ?></p> </div> </div> <div class="about__section has-1-column"> <div class="column"> <p> <?php printf( /* translators: %s: https://wordpressfoundation.org/trademark-policy/ */ __( 'WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. The WordPress community is flattered every time someone spreads the good word, just make sure to <a href="%s">check out the WordPress Foundation trademark guidelines</a> first.' ), 'https://wordpressfoundation.org/trademark-policy/' ); ?> </p> <p> <?php $plugins_url = current_user_can( 'activate_plugins' ) ? admin_url( 'plugins.php' ) : __( 'https://wordpress.org/plugins/' ); $themes_url = current_user_can( 'switch_themes' ) ? admin_url( 'themes.php' ) : __( 'https://wordpress.org/themes/' ); printf( /* translators: 1: URL to Plugins screen, 2: URL to Themes screen, 3: https://wordpress.org/about/license/ */ __( 'Every plugin and theme in WordPress.org’s directory is 100%% GPL or a similarly free and compatible license, so you can feel safe finding <a href="%1$s">plugins</a> and <a href="%2$s">themes</a> there. If you get a plugin or theme from another source, make sure to <a href="%3$s">ask them if it’s GPL</a> first. If they do not respect the WordPress license, it is not recommended to use them.' ), $plugins_url, $themes_url, __( 'https://wordpress.org/about/license/' ) ); ?> </p> </div> </div> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> about.php 0000644 00000047213 15151241222 0006371 0 ustar 00 <?php /** * About This Version administration panel. * * @package WordPress * @subpackage Administration */ /** WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; // Used in the HTML title tag. /* translators: Page title of the About WordPress page in the admin. */ $title = _x( 'About', 'page title' ); list( $display_version ) = explode( '-', wp_get_wp_version() ); $display_major_version = '6.8'; $release_notes_url = sprintf( /* translators: %s: WordPress version number. */ __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ), '6-8' ); $field_guide_url = sprintf( /* translators: %s: WordPress version number. */ __( 'https://make.wordpress.org/core/wordpress-%s-field-guide/' ), '6-8' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap about__container"> <div class="about__header"> <div class="about__header-title"> <h1> <?php printf( /* translators: %s: Version number. */ __( 'WordPress %s' ), $display_version ); ?> </h1> </div> </div> <nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>"> <a href="about.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'What’s New' ); ?></a> <a href="credits.php" class="nav-tab"><?php _e( 'Credits' ); ?></a> <a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a> <a href="privacy.php" class="nav-tab"><?php _e( 'Privacy' ); ?></a> <a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a> </nav> <div class="about__section changelog has-subtle-background-color"> <div class="column"> <h2><?php _e( 'Maintenance and Security Releases' ); ?></h2> <p> <?php printf( /* translators: %s: WordPress version. */ __( '<strong>Version %s</strong> addressed some security issues.' ), '6.8.3' ); ?> <?php printf( /* translators: %s: HelpHub URL. */ __( 'For more information, see <a href="%s">the release notes</a>.' ), sprintf( /* translators: %s: WordPress version. */ esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), sanitize_title( '6.8.3' ) ) ); ?> </p> <p> <?php printf( /* translators: 1: WordPress version number, 2: Plural number of bugs. */ _n( '<strong>Version %1$s</strong> addressed %2$s bug.', '<strong>Version %1$s</strong> addressed %2$s bugs.', 35 ), '6.8.2', '35' ); ?> <?php printf( /* translators: %s: HelpHub URL. */ __( 'For more information, see <a href="%s">the release notes</a>.' ), sprintf( /* translators: %s: WordPress version. */ esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), sanitize_title( '6.8.2' ) ) ); ?> </p> <p> <?php printf( /* translators: 1: WordPress version number, 2: Plural number of bugs. */ _n( '<strong>Version %1$s</strong> addressed %2$s bug.', '<strong>Version %1$s</strong> addressed %2$s bugs.', 16 ), '6.8.1', '15' ); ?> <?php printf( /* translators: %s: HelpHub URL. */ __( 'For more information, see <a href="%s">the release notes</a>.' ), sprintf( /* translators: %s: WordPress version. */ esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), sanitize_title( '6.8.1' ) ) ); ?> </p> </div> </div> <div class="about__section has-1-column"> <div class="column"> <h2><?php _e( 'A release polished to a high sheen.' ); ?></h2> <p class="is-subheading"><?php _e( 'WordPress 6.8 polishes and refines the tools you use every day, making your site faster, more secure, and easier to manage.' ); ?></p> <p><?php _e( 'The Style Book now has a structured layout and works with Classic themes, giving you more control over global styles.' ); ?></p> <p><?php _e( 'Speculative loading speeds up navigation by preloading links before users navigate to them, bcrypt hashing strengthens password security automatically, and database optimizations improve performance.' ); ?></p> </div> </div> <div class="about__section has-2-columns"> <div class="column is-vertically-aligned-center"> <h3><?php _e( 'The Style Book gets a cleaner look—and a few new tricks' ); ?></h3> <p> <?php _e( 'The Style Book has a new, structured layout and clearer labels, to make it even easier to edit colors, typography—almost all your site styles—in one place.' ); ?> </p> <?php if ( ! wp_is_block_theme() ) : ?> <p> <?php if ( current_user_can( 'edit_theme_options' ) && ( current_theme_supports( 'editor-styles' ) || wp_theme_has_theme_json() ) ) { printf( /* translators: %s is a direct link to the Style Book. */ __( 'Plus, now you can see it in Classic themes that have editor-styles or a theme.json file. Find <a href="%s">the Style Book</a> under Appearance > Design and use it to preview your theme’s evolution, as you edit CSS or make changes in the Customizer.' ), add_query_arg( 'p', '/stylebook', admin_url( '/site-editor.php' ) ) ); } else { _e( 'Plus, now you can see it in Classic themes that have editor-styles or a theme.json file. Find the Style Book under Appearance > Design and use it to preview your theme’s evolution, as you edit CSS or make changes in the Customizer.' ); } ?> </p> <?php endif; ?> </div> <div class="column is-vertically-aligned-center"> <div class="about__image"> <img src="https://s.w.org/images/core/6.8/feature-01.webp?v=23478" alt="" height="436" width="436" /> </div> </div> </div> <div class="about__section has-2-columns"> <div class="column is-vertically-aligned-center"> <div class="about__image"> <img src="https://s.w.org/images/core/6.8/feature-02.png?v=23478" alt="" height="436" width="436" /> </div> </div> <div class="column is-vertically-aligned-center"> <h3><?php _e( 'Editor improvements' ); ?></h3> <p><?php _e( 'Easier ways to see your options in Data Views, and you can exclude sticky posts from the Query Loop. Plus, you’ll find lots of little improvements in the editor that smooth your way through everything you build.' ); ?></p> </div> </div> <div class="about__section has-2-columns"> <div class="column is-vertically-aligned-center"> <h3><?php _e( 'Near-instant page loads, thanks to Speculative Loading' ); ?></h3> <p><?php _e( 'In WordPress 6.8, pages load faster than ever. When you or your user hovers over or clicks a link, WordPress may preload the next page, for a smoother, near-instant experience. The system balances speed and efficiency, and you can control how it works, with a plugin or your own code. This feature only works in modern browsers—older ones will simply ignore it without any impact.' ); ?></p> </div> <div class="column is-vertically-aligned-center"> <div class="about__image"> <img src="https://s.w.org/images/core/6.8/feature-03.webp?v=23478" alt="" height="436" width="436" /> </div> </div> </div> <div class="about__section has-2-columns"> <div class="column is-vertically-aligned-center"> <div class="about__image"> <img src="https://s.w.org/images/core/6.8/feature-04.png?v=23478" alt="" height="436" width="436" /> </div> </div> <div class="column is-vertically-aligned-center"> <h3><?php _e( 'Stronger password security with bcrypt' ); ?></h3> <p><?php _e( 'Now passwords are harder to crack with bcrypt hashing, which takes a lot more computing power to break. This strengthens overall security, as do other encryption improvements across WordPress. You don’t need to do anything—everything updates automatically.' ); ?></p> </div> </div> <hr class="is-invisible is-large" /> <div class="about__section has-2-columns"> <div class="column"> <div class="about__image"> <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"> <path fill="#1e1e1e" d="M24 13.84c-.752 0-1.397-.287-1.936-.86a2.902 2.902 0 0 1-.809-2.06c0-.8.27-1.487.809-2.06S23.248 8 24 8c.753 0 1.398.287 1.937.86.54.573.809 1.26.809 2.06s-.27 1.487-.809 2.06-1.184.86-1.937.86ZM19.976 40V18.68a69.562 69.562 0 0 1-4.945-.56 45.877 45.877 0 0 1-4.57-.92l.565-2.4a46.79 46.79 0 0 0 6.356 1.14c2.106.227 4.312.34 6.618.34 2.307 0 4.513-.113 6.62-.34a46.786 46.786 0 0 0 6.355-1.14l.564 2.4c-1.454.373-2.977.68-4.57.92a69.55 69.55 0 0 1-4.945.56V40h-2.256V29.6h-3.535V40h-2.257Z"/> </svg> </div> <h3><?php _e( 'Accessibility improvements' ); ?></h3> <p><?php _e( '100+ accessibility fixes and enhancements touch a broad spectrum of the WordPress experience. This release includes fixes to every bundled theme, improvements to the navigation menu management, the customizer, and simplified labeling. The Block Editor has over 70 improvements to blocks, DataViews, and to its overall user experience.' ); ?></p> </div> <div class="column"> <div class="about__image"> <svg width="48" height="48" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"> <path fill="#1e1e1e" d="M18.1823 11.6392C18.1823 13.0804 17.0139 14.2487 15.5727 14.2487C14.3579 14.2487 13.335 13.4179 13.0453 12.2922L13.0377 12.2625L13.0278 12.2335L12.3985 10.377L12.3942 10.3785C11.8571 8.64997 10.246 7.39405 8.33961 7.39405C5.99509 7.39405 4.09448 9.29465 4.09448 11.6392C4.09448 13.9837 5.99509 15.8843 8.33961 15.8843C8.88499 15.8843 9.40822 15.781 9.88943 15.5923L9.29212 14.0697C8.99812 14.185 8.67729 14.2487 8.33961 14.2487C6.89838 14.2487 5.73003 13.0804 5.73003 11.6392C5.73003 10.1979 6.89838 9.02959 8.33961 9.02959C9.55444 9.02959 10.5773 9.86046 10.867 10.9862L10.8772 10.9836L11.4695 12.7311C11.9515 14.546 13.6048 15.8843 15.5727 15.8843C17.9172 15.8843 19.8178 13.9837 19.8178 11.6392C19.8178 9.29465 17.9172 7.39404 15.5727 7.39404C15.0287 7.39404 14.5066 7.4968 14.0264 7.6847L14.6223 9.20781C14.9158 9.093 15.2358 9.02959 15.5727 9.02959C17.0139 9.02959 18.1823 10.1979 18.1823 11.6392Z"></path> </svg> </div> <h3><?php _e( 'Take a load off the database' ); ?></h3> <p><?php _e( 'Work continues on optimizing cache key generation in the <code>WP_Query</code> class. The goal is, as ever, to boost your site’s performance, in this case by taking some more of the load off your database. This is especially good if you get a lot of traffic.' ); ?></p> </div> </div> <div class="about__section has-1-column"> <div class="column"> <div class="about__image"> <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"> <path fill="#1e1e1e" d="M32.455 17.72a1.592 1.592 0 0 1 .599 2.195l-7.637 12.99a1.653 1.653 0 0 1-2.235.589 1.592 1.592 0 0 1-.599-2.195l7.637-12.99a1.653 1.653 0 0 1 2.235-.589ZM13.774 23.21a1.653 1.653 0 0 0-2.236.589 1.592 1.592 0 0 0 .6 2.195l.944.536c.783.444 1.783.18 2.235-.588a1.592 1.592 0 0 0-.599-2.196l-.944-.535ZM16.432 17.72a1.653 1.653 0 0 1 2.236.588l.545.928a1.592 1.592 0 0 1-.599 2.196 1.653 1.653 0 0 1-2.235-.588l-.546-.928a1.592 1.592 0 0 1 .6-2.196ZM25.637 16.5c0-.888-.733-1.607-1.637-1.607s-1.636.72-1.636 1.607v1.071c0 .888.732 1.608 1.636 1.608.904 0 1.637-.72 1.637-1.608V16.5Z"/> <path fill="#1e1e1e" fill-rule="evenodd" d="M4.91 27.75C4.91 17.395 13.455 9 24 9s19.091 8.395 19.091 18.75c0 3.909-1.22 7.542-3.305 10.548l-.488.702H8.702l-.488-.702A18.438 18.438 0 0 1 4.91 27.75ZM24 12.214c-8.736 0-15.818 6.956-15.818 15.536 0 2.943.832 5.692 2.277 8.036h27.082a15.25 15.25 0 0 0 2.277-8.036c0-8.58-7.082-15.536-15.818-15.536Z" clip-rule="evenodd"/> </svg> </div> <h3><?php _e( 'Performance updates' ); ?></h3> <p><?php _e( 'WordPress 6.8 packs a wide range of performance fixes and enhancements to speed up everything from editing to browsing. Beyond speculative loading, WordPress 6.8 pays special attention to the block editor, block type registration, and query caching. Plus, imagine never waiting longer than 50 milliseconds—for any interaction. In WordPress 6.8, the Interactivity API takes a first step toward that goal.' ); ?></p> </div> </div> <hr class="is-invisible is-large" style="margin-bottom:calc(2 * var(--gap));" /> <div class="about__section has-2-columns is-wider-left is-feature" style="background-color:var(--background);border-radius:var(--border-radius);"> <h3 class="is-section-header"><?php _e( 'And much more' ); ?></h3> <div class="column"> <p> <?php printf( /* translators: %s: Version number. */ __( 'For a comprehensive overview of all the new features and enhancements in WordPress %s, please visit the feature-showcase website.' ), $display_major_version ); ?> </p> </div> <div class="column aligncenter"> <div class="about__image"> <a href="<?php echo esc_url( __( 'https://wordpress.org/download/releases/6-8/' ) ); ?>" class="button button-primary button-hero"><?php _e( 'See everything new' ); ?></a> </div> </div> </div> <hr class="is-large" style="margin-top:calc(2 * var(--gap));" /> <div class="about__section has-3-columns"> <div class="column about__image is-vertically-aligned-top"> <img src="<?php echo esc_url( admin_url( 'images/about-release-badge.svg?ver=6.8' ) ); ?>" alt="" height="280" width="280" /> </div> <div class="column is-vertically-aligned-center" style="grid-column-end:span 2"> <h3> <?php printf( /* translators: %s: Version number. */ __( 'Learn more about WordPress %s' ), $display_major_version ); ?> </h3> <p> <?php printf( /* translators: 1: Learn WordPress link, 2: Workshops link. */ __( '<a href="%1$s">Learn WordPress</a> is a free resource for new and experienced WordPress users. Learn is stocked with how-to videos on using various features in WordPress, <a href="%2$s">interactive workshops</a> for exploring topics in-depth, and lesson plans for diving deep into specific areas of WordPress.' ), 'https://learn.wordpress.org/', 'https://learn.wordpress.org/online-workshops/' ); ?> </p> </div> </div> <div class="about__section has-2-columns"> <div class="column"> <div class="about__image"> <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"> <path fill="#1e1e1e" d="M32 15.5H16v3h16v-3ZM16 22h16v3H16v-3ZM28 28.5H16v3h12v-3Z"/> <path fill="#1e1e1e" fill-rule="evenodd" d="M34 8H14a4 4 0 0 0-4 4v24a4 4 0 0 0 4 4h20a4 4 0 0 0 4-4V12a4 4 0 0 0-4-4Zm-20 3h20a1 1 0 0 1 1 1v24a1 1 0 0 1-1 1H14a1 1 0 0 1-1-1V12a1 1 0 0 1 1-1Z" clip-rule="evenodd"/> </svg> </div> <h4 style="margin-top: calc(var(--gap) / 2); margin-bottom: calc(var(--gap) / 2);"> <a href="<?php echo esc_url( $release_notes_url ); ?>"> <?php printf( /* translators: %s: WordPress version number. */ __( 'WordPress %s Release Notes' ), $display_major_version ); ?> </a> </h4> <p> <?php printf( /* translators: %s: WordPress version number. */ __( 'Read the WordPress %s Release Notes for information on installation, enhancements, fixed issues, release contributors, learning resources, and the list of file changes.' ), $display_major_version ); ?> </p> </div> <div class="column"> <div class="about__image"> <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"> <path fill="#1e1e1e" stroke="#fff" stroke-width=".5" d="M26.5 24.25h13.75v11.5h-14v8h-3.5v-8H12.604L8.09 31.237a1.75 1.75 0 0 1 0-2.474l4.513-4.513H22.75v-4.5h-14V8.25h14v-4h3.5v4h10.146l4.513 4.513a1.75 1.75 0 0 1 0 2.474l-4.513 4.513H26.25v4.5h.25ZM12.25 16v.25h22.704l.073-.073 1.293-1.293a1.25 1.25 0 0 0 0-1.768l-1.293-1.293-.073-.073H12.25V16Zm1.723 16.177.073.073H36.75v-4.5H14.046l-.073.073-1.293 1.293a1.25 1.25 0 0 0 0 1.768l1.293 1.293Z"/> </svg> </div> <h4 style="margin-top: calc(var(--gap) / 2); margin-bottom: calc(var(--gap) / 2);"> <a href="<?php echo esc_url( $field_guide_url ); ?>"> <?php printf( /* translators: %s: WordPress version number. */ __( 'WordPress %s Field Guide' ), $display_major_version ); ?> </a> </h4> <p> <?php printf( /* translators: %s: WordPress version number. */ __( 'Explore the WordPress %s Field Guide. Learn about the changes in this release with detailed developer notes to help you build with WordPress.' ), $display_major_version ); ?> </p> </div> </div> <hr class="is-large" /> <div class="return-to-dashboard"> <?php if ( isset( $_GET['updated'] ) && current_user_can( 'update_core' ) ) { printf( '<a href="%1$s">%2$s</a> | ', esc_url( self_admin_url( 'update-core.php' ) ), is_multisite() ? __( 'Go to Updates' ) : __( 'Go to Dashboard → Updates' ) ); } printf( '<a href="%1$s">%2$s</a>', esc_url( self_admin_url() ), is_blog_admin() ? __( 'Go to Dashboard → Home' ) : __( 'Go to Dashboard' ) ); ?> </div> </div> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> <?php // These are strings we may use to describe maintenance/security releases, where we aim for no new strings. return; __( 'Maintenance Release' ); __( 'Maintenance Releases' ); __( 'Security Release' ); __( 'Security Releases' ); __( 'Maintenance and Security Release' ); __( 'Maintenance and Security Releases' ); /* translators: %s: WordPress version number. */ __( '<strong>Version %s</strong> addressed one security issue.' ); /* translators: %s: WordPress version number. */ __( '<strong>Version %s</strong> addressed some security issues.' ); /* translators: 1: WordPress version number, 2: Plural number of bugs. */ _n_noop( '<strong>Version %1$s</strong> addressed %2$s bug.', '<strong>Version %1$s</strong> addressed %2$s bugs.' ); /* translators: 1: WordPress version number, 2: Plural number of bugs. Singular security issue. */ _n_noop( '<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bug.', '<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bugs.' ); /* translators: 1: WordPress version number, 2: Plural number of bugs. More than one security issue. */ _n_noop( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.', '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.' ); /* translators: %s: Documentation URL. */ __( 'For more information, see <a href="%s">the release notes</a>.' ); /* translators: 1: WordPress version number, 2: Link to update WordPress */ __( 'Important! Your version of WordPress (%1$s) is no longer supported, you will not receive any security updates for your website. To keep your site secure, please <a href="%2$s">update to the latest version of WordPress</a>.' ); /* translators: 1: WordPress version number, 2: Link to update WordPress */ __( 'Important! Your version of WordPress (%1$s) will stop receiving security updates in the near future. To keep your site secure, please <a href="%2$s">update to the latest version of WordPress</a>.' ); /* translators: %s: The major version of WordPress for this branch. */ __( 'This is the final release of WordPress %s' ); /* translators: The localized WordPress download URL. */ __( 'https://wordpress.org/download/' ); edit-form-blocks.php 0000644 00000034571 15151241223 0010424 0 ustar 00 <?php /** * The block editor page. * * @since 5.0.0 * * @package WordPress * @subpackage Administration */ // Don't load directly. if ( ! defined( 'ABSPATH' ) ) { die( '-1' ); } /** * @global string $post_type Global post type. * @global WP_Post_Type $post_type_object Global post type object. * @global WP_Post $post Global post object. * @global string $title The title of the current screen. * @global array $wp_meta_boxes Global meta box state. */ global $post_type, $post_type_object, $post, $title, $wp_meta_boxes; $block_editor_context = new WP_Block_Editor_Context( array( 'post' => $post ) ); // Flag that we're loading the block editor. $current_screen = get_current_screen(); $current_screen->is_block_editor( true ); // Default to is-fullscreen-mode to avoid jumps in the UI. add_filter( 'admin_body_class', static function ( $classes ) { return "$classes is-fullscreen-mode"; } ); /* * Emoji replacement is disabled for now, until it plays nicely with React. */ remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); /* * Block editor implements its own Options menu for toggling Document Panels. */ add_filter( 'screen_options_show_screen', '__return_false' ); wp_enqueue_script( 'heartbeat' ); wp_enqueue_script( 'wp-edit-post' ); $rest_path = rest_get_route_for_post( $post ); $active_theme = get_stylesheet(); $global_styles_endpoint_context = current_user_can( 'edit_theme_options' ) ? 'edit' : 'view'; $template_lookup_slug = 'page' === $post->post_type ? 'page' : 'single-' . $post->post_type; if ( ! empty( $post->post_name ) ) { $template_lookup_slug .= '-' . $post->post_name; } // Preload common data. $preload_paths = array( '/wp/v2/types?context=view', '/wp/v2/taxonomies?context=view', add_query_arg( 'context', 'edit', $rest_path ), sprintf( '/wp/v2/types/%s?context=edit', $post_type ), '/wp/v2/users/me', array( rest_get_route_for_post_type_items( 'attachment' ), 'OPTIONS' ), array( rest_get_route_for_post_type_items( 'page' ), 'OPTIONS' ), array( rest_get_route_for_post_type_items( 'wp_block' ), 'OPTIONS' ), array( rest_get_route_for_post_type_items( 'wp_template' ), 'OPTIONS' ), sprintf( '%s/autosaves?context=edit', $rest_path ), '/wp/v2/settings', array( '/wp/v2/settings', 'OPTIONS' ), '/wp/v2/global-styles/themes/' . $active_theme . '?context=view', '/wp/v2/global-styles/themes/' . $active_theme . '/variations?context=view', '/wp/v2/themes?context=edit&status=active', array( '/wp/v2/global-styles/' . WP_Theme_JSON_Resolver::get_user_global_styles_post_id(), 'OPTIONS' ), /* * Preload the global styles path with the correct context based on user caps. * NOTE: There is an equivalent conditional check in the client-side code to fetch * the global styles entity using the appropriate context value. * See the call to `canUser()`, under `useGlobalStylesUserConfig()` in `packages/edit-site/src/components/use-global-styles-user-config/index.js`. * Please ensure that the equivalent check is kept in sync with this preload path. */ '/wp/v2/global-styles/' . WP_Theme_JSON_Resolver::get_user_global_styles_post_id() . '?context=' . $global_styles_endpoint_context, // Used by getBlockPatternCategories in useBlockEditorSettings. '/wp/v2/block-patterns/categories', // @see packages/core-data/src/entities.js '/?_fields=' . implode( ',', array( 'description', 'gmt_offset', 'home', 'name', 'site_icon', 'site_icon_url', 'site_logo', 'timezone_string', 'url', 'page_for_posts', 'page_on_front', 'show_on_front', ) ), $paths[] = add_query_arg( 'slug', // @see https://github.com/WordPress/gutenberg/blob/e093fefd041eb6cc4a4e7f67b92ab54fd75c8858/packages/core-data/src/private-selectors.ts#L244-L254 $template_lookup_slug, '/wp/v2/templates/lookup' ), ); block_editor_rest_api_preload( $preload_paths, $block_editor_context ); wp_add_inline_script( 'wp-blocks', sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ), 'after' ); /* * Assign initial edits, if applicable. These are not initially assigned to the persisted post, * but should be included in its save payload. */ $initial_edits = array(); $is_new_post = false; if ( 'auto-draft' === $post->post_status ) { $is_new_post = true; // Override "(Auto Draft)" new post default title with empty string, or filtered value. if ( post_type_supports( $post->post_type, 'title' ) ) { $initial_edits['title'] = $post->post_title; } if ( post_type_supports( $post->post_type, 'editor' ) ) { $initial_edits['content'] = $post->post_content; } if ( post_type_supports( $post->post_type, 'excerpt' ) ) { $initial_edits['excerpt'] = $post->post_excerpt; } } // Preload server-registered block schemas. wp_add_inline_script( 'wp-blocks', 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');' ); // Preload server-registered block bindings sources. $registered_sources = get_all_registered_block_bindings_sources(); if ( ! empty( $registered_sources ) ) { $filtered_sources = array(); foreach ( $registered_sources as $source ) { $filtered_sources[] = array( 'name' => $source->name, 'label' => $source->label, 'usesContext' => $source->uses_context, ); } $script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources ) ); wp_add_inline_script( 'wp-blocks', $script ); } // Get admin url for handling meta boxes. $meta_box_url = admin_url( 'post.php' ); $meta_box_url = add_query_arg( array( 'post' => $post->ID, 'action' => 'edit', 'meta-box-loader' => true, 'meta-box-loader-nonce' => wp_create_nonce( 'meta-box-loader' ), ), $meta_box_url ); wp_add_inline_script( 'wp-editor', sprintf( 'var _wpMetaBoxUrl = %s;', wp_json_encode( $meta_box_url ) ), 'before' ); // Set Heartbeat interval to 10 seconds, used to refresh post locks. wp_add_inline_script( 'heartbeat', 'jQuery( function() { wp.heartbeat.interval( 10 ); } );', 'after' ); /* * Get all available templates for the post/page attributes meta-box. * The "Default template" array element should only be added if the array is * not empty so we do not trigger the template select element without any options * besides the default value. */ $available_templates = wp_get_theme()->get_page_templates( get_post( $post->ID ) ); $available_templates = ! empty( $available_templates ) ? array_replace( array( /** This filter is documented in wp-admin/includes/meta-boxes.php */ '' => apply_filters( 'default_page_template_title', __( 'Default template' ), 'rest-api' ), ), $available_templates ) : $available_templates; // Lock settings. $user_id = wp_check_post_lock( $post->ID ); if ( $user_id ) { $locked = false; /** This filter is documented in wp-admin/includes/post.php */ if ( apply_filters( 'show_post_locked_dialog', true, $post, $user_id ) ) { $locked = true; } $user_details = null; if ( $locked ) { $user = get_userdata( $user_id ); $user_details = array( 'name' => $user->display_name, ); if ( get_option( 'show_avatars' ) ) { $user_details['avatar'] = get_avatar_url( $user_id, array( 'size' => 128 ) ); } } $lock_details = array( 'isLocked' => $locked, 'user' => $user_details, ); } else { // Lock the post. $active_post_lock = wp_set_post_lock( $post->ID ); if ( $active_post_lock ) { $active_post_lock = esc_attr( implode( ':', $active_post_lock ) ); } $lock_details = array( 'isLocked' => false, 'activePostLock' => $active_post_lock, ); } /** * Filters the body placeholder text. * * @since 5.0.0 * @since 5.8.0 Changed the default placeholder text. * * @param string $text Placeholder text. Default 'Type / to choose a block'. * @param WP_Post $post Post object. */ $body_placeholder = apply_filters( 'write_your_story', __( 'Type / to choose a block' ), $post ); $editor_settings = array( 'availableTemplates' => $available_templates, 'disablePostFormats' => ! current_theme_supports( 'post-formats' ), /** This filter is documented in wp-admin/edit-form-advanced.php */ 'titlePlaceholder' => apply_filters( 'enter_title_here', __( 'Add title' ), $post ), 'bodyPlaceholder' => $body_placeholder, 'autosaveInterval' => AUTOSAVE_INTERVAL, 'richEditingEnabled' => user_can_richedit(), 'postLock' => $lock_details, 'postLockUtils' => array( 'nonce' => wp_create_nonce( 'lock-post_' . $post->ID ), 'unlockNonce' => wp_create_nonce( 'update-post_' . $post->ID ), 'ajaxUrl' => admin_url( 'admin-ajax.php' ), ), 'supportsLayout' => wp_theme_has_theme_json(), 'supportsTemplateMode' => current_theme_supports( 'block-templates' ), // Whether or not to load the 'postcustom' meta box is stored as a user meta // field so that we're not always loading its assets. 'enableCustomFields' => (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ), ); // Add additional back-compat patterns registered by `current_screen` et al. $editor_settings['__experimentalAdditionalBlockPatterns'] = WP_Block_Patterns_Registry::get_instance()->get_all_registered( true ); $editor_settings['__experimentalAdditionalBlockPatternCategories'] = WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered( true ); $autosave = wp_get_post_autosave( $post->ID ); if ( $autosave ) { if ( mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) { $editor_settings['autosave'] = array( 'editLink' => get_edit_post_link( $autosave->ID ), ); } else { wp_delete_post_revision( $autosave->ID ); } } if ( ! empty( $post_type_object->template ) ) { $editor_settings['template'] = $post_type_object->template; $editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false; } // If there's no template set on a new post, use the post format, instead. if ( $is_new_post && ! isset( $editor_settings['template'] ) && 'post' === $post->post_type ) { $post_format = get_post_format( $post ); if ( in_array( $post_format, array( 'audio', 'gallery', 'image', 'quote', 'video' ), true ) ) { $editor_settings['template'] = array( array( "core/$post_format" ) ); } } if ( wp_is_block_theme() && $editor_settings['supportsTemplateMode'] ) { $editor_settings['defaultTemplatePartAreas'] = get_allowed_block_template_part_areas(); } /** * Scripts */ wp_enqueue_media( array( 'post' => $post->ID, ) ); wp_tinymce_inline_scripts(); wp_enqueue_editor(); /** * Styles */ wp_enqueue_style( 'wp-edit-post' ); /** * Fires after block assets have been enqueued for the editing interface. * * Call `add_action` on any hook before 'admin_enqueue_scripts'. * * In the function call you supply, simply use `wp_enqueue_script` and * `wp_enqueue_style` to add your functionality to the block editor. * * @since 5.0.0 */ do_action( 'enqueue_block_editor_assets' ); // In order to duplicate classic meta box behavior, we need to run the classic meta box actions. require_once ABSPATH . 'wp-admin/includes/meta-boxes.php'; register_and_do_post_meta_boxes( $post ); // Check if the Custom Fields meta box has been removed at some point. $core_meta_boxes = $wp_meta_boxes[ $current_screen->id ]['normal']['core']; if ( ! isset( $core_meta_boxes['postcustom'] ) || ! $core_meta_boxes['postcustom'] ) { unset( $editor_settings['enableCustomFields'] ); } $editor_settings = get_block_editor_settings( $editor_settings, $block_editor_context ); $init_script = <<<JS ( function() { window._wpLoadBlockEditor = new Promise( function( resolve ) { wp.domReady( function() { resolve( wp.editPost.initializeEditor( 'editor', "%s", %d, %s, %s ) ); } ); } ); } )(); JS; $script = sprintf( $init_script, $post->post_type, $post->ID, wp_json_encode( $editor_settings ), wp_json_encode( $initial_edits ) ); wp_add_inline_script( 'wp-edit-post', $script ); if ( (int) get_option( 'page_for_posts' ) === $post->ID ) { add_action( 'admin_enqueue_scripts', '_wp_block_editor_posts_page_notice' ); } require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="block-editor"> <h1 class="screen-reader-text hide-if-no-js"><?php echo esc_html( $title ); ?></h1> <div id="editor" class="block-editor__container hide-if-no-js"></div> <div id="metaboxes" class="hidden"> <?php the_block_editor_meta_boxes(); ?> </div> <?php // JavaScript is disabled. ?> <div class="wrap hide-if-js block-editor-no-js"> <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1> <?php if ( file_exists( WP_PLUGIN_DIR . '/classic-editor/classic-editor.php' ) ) { // If Classic Editor is already installed, provide a link to activate the plugin. $installed = true; $plugin_activate_url = wp_nonce_url( 'plugins.php?action=activate&plugin=classic-editor/classic-editor.php', 'activate-plugin_classic-editor/classic-editor.php' ); $message = sprintf( /* translators: %s: Link to activate the Classic Editor plugin. */ __( 'The block editor requires JavaScript. Please enable JavaScript in your browser settings, or activate the <a href="%s">Classic Editor plugin</a>.' ), esc_url( $plugin_activate_url ) ); } else { // If Classic Editor is not installed, provide a link to install it. $installed = false; $plugin_install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=classic-editor' ), 'install-plugin_classic-editor' ); $message = sprintf( /* translators: %s: Link to install the Classic Editor plugin. */ __( 'The block editor requires JavaScript. Please enable JavaScript in your browser settings, or install the <a href="%s">Classic Editor plugin</a>.' ), esc_url( $plugin_install_url ) ); } /** * Filters the message displayed in the block editor interface when JavaScript is * not enabled in the browser. * * @since 5.0.3 * @since 6.4.0 Added `$installed` parameter. * * @param string $message The message being displayed. * @param WP_Post $post The post being edited. * @param bool $installed Whether the classic editor is installed. */ $message = apply_filters( 'block_editor_no_javascript_message', $message, $post, $installed ); wp_admin_notice( $message, array( 'type' => 'error', ) ); ?> </div> </div> admin.php 0000644 00000030465 15151241223 0006351 0 ustar 00 <?php /** * WordPress Administration Bootstrap * * @package WordPress * @subpackage Administration */ /** * In WordPress Administration Screens * * @since 2.3.2 */ if ( ! defined( 'WP_ADMIN' ) ) { define( 'WP_ADMIN', true ); } if ( ! defined( 'WP_NETWORK_ADMIN' ) ) { define( 'WP_NETWORK_ADMIN', false ); } if ( ! defined( 'WP_USER_ADMIN' ) ) { define( 'WP_USER_ADMIN', false ); } if ( ! WP_NETWORK_ADMIN && ! WP_USER_ADMIN ) { define( 'WP_BLOG_ADMIN', true ); } if ( isset( $_GET['import'] ) && ! defined( 'WP_LOAD_IMPORTERS' ) ) { define( 'WP_LOAD_IMPORTERS', true ); } /** Load WordPress Bootstrap */ require_once dirname( __DIR__ ) . '/wp-load.php'; nocache_headers(); if ( get_option( 'db_upgraded' ) ) { flush_rewrite_rules(); update_option( 'db_upgraded', false, true ); /** * Fires on the next page load after a successful DB upgrade. * * @since 2.8.0 */ do_action( 'after_db_upgrade' ); } elseif ( ! wp_doing_ajax() && empty( $_POST ) && (int) get_option( 'db_version' ) !== $wp_db_version ) { if ( ! is_multisite() ) { wp_redirect( admin_url( 'upgrade.php?_wp_http_referer=' . urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); exit; } /** * Filters whether to attempt to perform the multisite DB upgrade routine. * * In single site, the user would be redirected to wp-admin/upgrade.php. * In multisite, the DB upgrade routine is automatically fired, but only * when this filter returns true. * * If the network is 50 sites or less, it will run every time. Otherwise, * it will throttle itself to reduce load. * * @since MU (3.0.0) * * @param bool $do_mu_upgrade Whether to perform the Multisite upgrade routine. Default true. */ if ( apply_filters( 'do_mu_upgrade', true ) ) { $c = get_blog_count(); /* * If there are 50 or fewer sites, run every time. Otherwise, throttle to reduce load: * attempt to do no more than threshold value, with some +/- allowed. */ if ( $c <= 50 || ( $c > 50 && mt_rand( 0, (int) ( $c / 50 ) ) === 1 ) ) { require_once ABSPATH . WPINC . '/http.php'; $response = wp_remote_get( admin_url( 'upgrade.php?step=1' ), array( 'timeout' => 120, 'httpversion' => '1.1', ) ); /** This action is documented in wp-admin/network/upgrade.php */ do_action( 'after_mu_upgrade', $response ); unset( $response ); } unset( $c ); } } require_once ABSPATH . 'wp-admin/includes/admin.php'; auth_redirect(); // Schedule Trash collection. if ( ! wp_next_scheduled( 'wp_scheduled_delete' ) && ! wp_installing() ) { wp_schedule_event( time(), 'daily', 'wp_scheduled_delete' ); } // Schedule transient cleanup. if ( ! wp_next_scheduled( 'delete_expired_transients' ) && ! wp_installing() ) { wp_schedule_event( time(), 'daily', 'delete_expired_transients' ); } set_screen_options(); $date_format = __( 'F j, Y' ); $time_format = __( 'g:i a' ); wp_enqueue_script( 'common' ); /** * $pagenow is set in vars.php. * $wp_importers is sometimes set in wp-admin/includes/import.php. * The remaining variables are imported as globals elsewhere, declared as globals here. * * @global string $pagenow The filename of the current screen. * @global array $wp_importers * @global string $hook_suffix * @global string $plugin_page * @global string $typenow The post type of the current screen. * @global string $taxnow The taxonomy of the current screen. */ global $pagenow, $wp_importers, $hook_suffix, $plugin_page, $typenow, $taxnow; $page_hook = null; $editing = false; if ( isset( $_GET['page'] ) ) { $plugin_page = wp_unslash( $_GET['page'] ); $plugin_page = plugin_basename( $plugin_page ); } if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) { $typenow = $_REQUEST['post_type']; } else { $typenow = ''; } if ( isset( $_REQUEST['taxonomy'] ) && taxonomy_exists( $_REQUEST['taxonomy'] ) ) { $taxnow = $_REQUEST['taxonomy']; } else { $taxnow = ''; } if ( WP_NETWORK_ADMIN ) { require ABSPATH . 'wp-admin/network/menu.php'; } elseif ( WP_USER_ADMIN ) { require ABSPATH . 'wp-admin/user/menu.php'; } else { require ABSPATH . 'wp-admin/menu.php'; } if ( current_user_can( 'manage_options' ) ) { wp_raise_memory_limit( 'admin' ); } /** * Fires as an admin screen or script is being initialized. * * Note, this does not just run on user-facing admin screens. * It runs on admin-ajax.php and admin-post.php as well. * * This is roughly analogous to the more general {@see 'init'} hook, which fires earlier. * * @since 2.5.0 */ do_action( 'admin_init' ); if ( isset( $plugin_page ) ) { if ( ! empty( $typenow ) ) { $the_parent = $pagenow . '?post_type=' . $typenow; } else { $the_parent = $pagenow; } $page_hook = get_plugin_page_hook( $plugin_page, $the_parent ); if ( ! $page_hook ) { $page_hook = get_plugin_page_hook( $plugin_page, $plugin_page ); // Back-compat for plugins using add_management_page(). if ( empty( $page_hook ) && 'edit.php' === $pagenow && get_plugin_page_hook( $plugin_page, 'tools.php' ) ) { // There could be plugin specific params on the URL, so we need the whole query string. if ( ! empty( $_SERVER['QUERY_STRING'] ) ) { $query_string = $_SERVER['QUERY_STRING']; } else { $query_string = 'page=' . $plugin_page; } wp_redirect( admin_url( 'tools.php?' . $query_string ) ); exit; } } unset( $the_parent ); } $hook_suffix = ''; if ( isset( $page_hook ) ) { $hook_suffix = $page_hook; } elseif ( isset( $plugin_page ) ) { $hook_suffix = $plugin_page; } elseif ( isset( $pagenow ) ) { $hook_suffix = $pagenow; } set_current_screen(); // Handle plugin admin pages. if ( isset( $plugin_page ) ) { if ( $page_hook ) { /** * Fires before a particular screen is loaded. * * The load-* hook fires in a number of contexts. This hook is for plugin screens * where a callback is provided when the screen is registered. * * The dynamic portion of the hook name, `$page_hook`, refers to a mixture of plugin * page information including: * 1. The page type. If the plugin page is registered as a submenu page, such as for * Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'. * 2. A separator of '_page_'. * 3. The plugin basename minus the file extension. * * Together, the three parts form the `$page_hook`. Citing the example above, * the hook name used would be 'load-settings_page_pluginbasename'. * * @see get_plugin_page_hook() * * @since 2.1.0 */ do_action( "load-{$page_hook}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores if ( ! isset( $_GET['noheader'] ) ) { require_once ABSPATH . 'wp-admin/admin-header.php'; } /** * Used to call the registered callback for a plugin screen. * * This hook uses a dynamic hook name, `$page_hook`, which refers to a mixture of plugin * page information including: * 1. The page type. If the plugin page is registered as a submenu page, such as for * Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'. * 2. A separator of '_page_'. * 3. The plugin basename minus the file extension. * * Together, the three parts form the `$page_hook`. Citing the example above, * the hook name used would be 'settings_page_pluginbasename'. * * @see get_plugin_page_hook() * * @since 1.5.0 */ do_action( $page_hook ); } else { if ( validate_file( $plugin_page ) ) { wp_die( __( 'Invalid plugin page.' ) ); } if ( ! ( file_exists( WP_PLUGIN_DIR . "/$plugin_page" ) && is_file( WP_PLUGIN_DIR . "/$plugin_page" ) ) && ! ( file_exists( WPMU_PLUGIN_DIR . "/$plugin_page" ) && is_file( WPMU_PLUGIN_DIR . "/$plugin_page" ) ) ) { /* translators: %s: Admin page generated by a plugin. */ wp_die( sprintf( __( 'Cannot load %s.' ), htmlentities( $plugin_page ) ) ); } /** * Fires before a particular screen is loaded. * * The load-* hook fires in a number of contexts. This hook is for plugin screens * where the file to load is directly included, rather than the use of a function. * * The dynamic portion of the hook name, `$plugin_page`, refers to the plugin basename. * * @see plugin_basename() * * @since 1.5.0 */ do_action( "load-{$plugin_page}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores if ( ! isset( $_GET['noheader'] ) ) { require_once ABSPATH . 'wp-admin/admin-header.php'; } if ( file_exists( WPMU_PLUGIN_DIR . "/$plugin_page" ) ) { include WPMU_PLUGIN_DIR . "/$plugin_page"; } else { include WP_PLUGIN_DIR . "/$plugin_page"; } } require_once ABSPATH . 'wp-admin/admin-footer.php'; exit; } elseif ( isset( $_GET['import'] ) ) { $importer = $_GET['import']; if ( ! current_user_can( 'import' ) ) { wp_die( __( 'Sorry, you are not allowed to import content into this site.' ) ); } if ( validate_file( $importer ) ) { wp_redirect( admin_url( 'import.php?invalid=' . $importer ) ); exit; } if ( ! isset( $wp_importers[ $importer ] ) || ! is_callable( $wp_importers[ $importer ][2] ) ) { wp_redirect( admin_url( 'import.php?invalid=' . $importer ) ); exit; } /** * Fires before an importer screen is loaded. * * The dynamic portion of the hook name, `$importer`, refers to the importer slug. * * Possible hook names include: * * - `load-importer-blogger` * - `load-importer-wpcat2tag` * - `load-importer-livejournal` * - `load-importer-mt` * - `load-importer-rss` * - `load-importer-tumblr` * - `load-importer-wordpress` * * @since 3.5.0 */ do_action( "load-importer-{$importer}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores // Used in the HTML title tag. $title = __( 'Import' ); $parent_file = 'tools.php'; $submenu_file = 'import.php'; if ( ! isset( $_GET['noheader'] ) ) { require_once ABSPATH . 'wp-admin/admin-header.php'; } require_once ABSPATH . 'wp-admin/includes/upgrade.php'; define( 'WP_IMPORTING', true ); /** * Filters whether to filter imported data through kses on import. * * Multisite uses this hook to filter all data through kses by default, * as a super administrator may be assisting an untrusted user. * * @since 3.1.0 * * @param bool $force Whether to force data to be filtered through kses. Default false. */ if ( apply_filters( 'force_filtered_html_on_import', false ) ) { kses_init_filters(); // Always filter imported data with kses on multisite. } call_user_func( $wp_importers[ $importer ][2] ); require_once ABSPATH . 'wp-admin/admin-footer.php'; // Make sure rules are flushed. flush_rewrite_rules( false ); exit; } else { /** * Fires before a particular screen is loaded. * * The load-* hook fires in a number of contexts. This hook is for core screens. * * The dynamic portion of the hook name, `$pagenow`, is a global variable * referring to the filename of the current screen, such as 'admin.php', * 'post-new.php' etc. A complete hook for the latter would be * 'load-post-new.php'. * * @since 2.1.0 */ do_action( "load-{$pagenow}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /* * The following hooks are fired to ensure backward compatibility. * In all other cases, 'load-' . $pagenow should be used instead. */ if ( 'page' === $typenow ) { if ( 'post-new.php' === $pagenow ) { do_action( 'load-page-new.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } elseif ( 'post.php' === $pagenow ) { do_action( 'load-page.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } } elseif ( 'edit-tags.php' === $pagenow ) { if ( 'category' === $taxnow ) { do_action( 'load-categories.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } elseif ( 'link_category' === $taxnow ) { do_action( 'load-edit-link-categories.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } } elseif ( 'term.php' === $pagenow ) { do_action( 'load-edit-tags.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } } if ( ! empty( $_REQUEST['action'] ) ) { $action = $_REQUEST['action']; /** * Fires when an 'action' request variable is sent. * * The dynamic portion of the hook name, `$action`, refers to * the action derived from the `GET` or `POST` request. * * @since 2.6.0 */ do_action( "admin_action_{$action}" ); } nav-menus.php 0000644 00000140411 15151241223 0007163 0 ustar 00 <?php /** * WordPress Administration for Navigation Menus * Interface functions * * @version 2.0.0 * * @package WordPress * @subpackage Administration */ /** Load WordPress Administration Bootstrap */ require_once __DIR__ . '/admin.php'; // Load all the nav menu interface functions. require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; if ( ! current_theme_supports( 'menus' ) && ! current_theme_supports( 'widgets' ) ) { wp_die( __( 'Your theme does not support navigation menus or widgets.' ) ); } // Permissions check. if ( ! current_user_can( 'edit_theme_options' ) ) { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>', 403 ); } // Used in the HTML title tag. $title = __( 'Menus' ); wp_enqueue_script( 'nav-menu' ); if ( wp_is_mobile() ) { wp_enqueue_script( 'jquery-touch-punch' ); } // Container for any messages displayed to the user. $messages = array(); // Container that stores the name of the active menu. $nav_menu_selected_title = ''; // The menu id of the current menu being edited. $nav_menu_selected_id = isset( $_REQUEST['menu'] ) ? (int) $_REQUEST['menu'] : 0; // Get existing menu locations assignments. $locations = get_registered_nav_menus(); $menu_locations = get_nav_menu_locations(); $num_locations = count( array_keys( $locations ) ); // Allowed actions: add, update, delete. $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit'; /* * If a JSON blob of navigation menu data is found, expand it and inject it * into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134. */ _wp_expand_nav_menu_post_data(); switch ( $action ) { case 'add-menu-item': check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' ); if ( isset( $_REQUEST['nav-menu-locations'] ) ) { set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_REQUEST['menu-locations'] ) ); } elseif ( isset( $_REQUEST['menu-item'] ) ) { wp_save_nav_menu_items( $nav_menu_selected_id, $_REQUEST['menu-item'] ); } break; case 'move-down-menu-item': // Moving down a menu item is the same as moving up the next in order. check_admin_referer( 'move-menu_item' ); $menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0; if ( is_nav_menu_item( $menu_item_id ) ) { $menus = isset( $_REQUEST['menu'] ) ? array( (int) $_REQUEST['menu'] ) : wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) ); if ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) { $menu_id = (int) $menus[0]; $ordered_menu_items = wp_get_nav_menu_items( $menu_id ); $menu_item_data = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) ); // Set up the data we need in one pass through the array of menu items. $dbids_to_orders = array(); $orders_to_dbids = array(); foreach ( (array) $ordered_menu_items as $ordered_menu_item_object ) { if ( isset( $ordered_menu_item_object->ID ) ) { if ( isset( $ordered_menu_item_object->menu_order ) ) { $dbids_to_orders[ $ordered_menu_item_object->ID ] = $ordered_menu_item_object->menu_order; $orders_to_dbids[ $ordered_menu_item_object->menu_order ] = $ordered_menu_item_object->ID; } } } // Get next in order. if ( isset( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] + 1 ] ) ) { $next_item_id = $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] + 1 ]; $next_item_data = (array) wp_setup_nav_menu_item( get_post( $next_item_id ) ); // If not siblings of same parent, bubble menu item up but keep order. if ( ! empty( $menu_item_data['menu_item_parent'] ) && ( empty( $next_item_data['menu_item_parent'] ) || (int) $next_item_data['menu_item_parent'] !== (int) $menu_item_data['menu_item_parent'] ) ) { if ( in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true ) ) { $parent_db_id = (int) $menu_item_data['menu_item_parent']; } else { $parent_db_id = 0; } $parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) ); if ( ! is_wp_error( $parent_object ) ) { $parent_data = (array) $parent_object; $menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent']; // Reset invalid `menu_item_parent`. $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data ); update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] ); } // Make menu item a child of its next sibling. } else { $next_item_data['menu_order'] = $next_item_data['menu_order'] - 1; $menu_item_data['menu_order'] = $menu_item_data['menu_order'] + 1; $menu_item_data['menu_item_parent'] = $next_item_data['ID']; // Reset invalid `menu_item_parent`. $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data ); update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] ); wp_update_post( $menu_item_data ); wp_update_post( $next_item_data ); } // The item is last but still has a parent, so bubble up. } elseif ( ! empty( $menu_item_data['menu_item_parent'] ) && in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true ) ) { $menu_item_data['menu_item_parent'] = (int) get_post_meta( $menu_item_data['menu_item_parent'], '_menu_item_menu_item_parent', true ); // Reset invalid `menu_item_parent`. $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data ); update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] ); } } } break; case 'move-up-menu-item': check_admin_referer( 'move-menu_item' ); $menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0; if ( is_nav_menu_item( $menu_item_id ) ) { if ( isset( $_REQUEST['menu'] ) ) { $menus = array( (int) $_REQUEST['menu'] ); } else { $menus = wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) ); } if ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) { $menu_id = (int) $menus[0]; $ordered_menu_items = wp_get_nav_menu_items( $menu_id ); $menu_item_data = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) ); // Set up the data we need in one pass through the array of menu items. $dbids_to_orders = array(); $orders_to_dbids = array(); foreach ( (array) $ordered_menu_items as $ordered_menu_item_object ) { if ( isset( $ordered_menu_item_object->ID ) ) { if ( isset( $ordered_menu_item_object->menu_order ) ) { $dbids_to_orders[ $ordered_menu_item_object->ID ] = $ordered_menu_item_object->menu_order; $orders_to_dbids[ $ordered_menu_item_object->menu_order ] = $ordered_menu_item_object->ID; } } } // If this menu item is not first. if ( ! empty( $dbids_to_orders[ $menu_item_id ] ) && ! empty( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] ) ) { // If this menu item is a child of the previous. if ( ! empty( $menu_item_data['menu_item_parent'] ) && in_array( (int) $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ), true ) && isset( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] ) && ( (int) $menu_item_data['menu_item_parent'] === $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] ) ) { if ( in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true ) ) { $parent_db_id = (int) $menu_item_data['menu_item_parent']; } else { $parent_db_id = 0; } $parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) ); if ( ! is_wp_error( $parent_object ) ) { $parent_data = (array) $parent_object; /* * If there is something before the parent and parent a child of it, * make menu item a child also of it. */ if ( ! empty( $dbids_to_orders[ $parent_db_id ] ) && ! empty( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ] ) && ! empty( $parent_data['menu_item_parent'] ) ) { $menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent']; /* * Else if there is something before parent and parent not a child of it, * make menu item a child of that something's parent */ } elseif ( ! empty( $dbids_to_orders[ $parent_db_id ] ) && ! empty( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ] ) ) { $_possible_parent_id = (int) get_post_meta( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ], '_menu_item_menu_item_parent', true ); if ( in_array( $_possible_parent_id, array_keys( $dbids_to_orders ), true ) ) { $menu_item_data['menu_item_parent'] = $_possible_parent_id; } else { $menu_item_data['menu_item_parent'] = 0; } // Else there isn't something before the parent. } else { $menu_item_data['menu_item_parent'] = 0; } // Set former parent's [menu_order] to that of menu-item's. $parent_data['menu_order'] = $parent_data['menu_order'] + 1; // Set menu-item's [menu_order] to that of former parent. $menu_item_data['menu_order'] = $menu_item_data['menu_order'] - 1; // Save changes. update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] ); wp_update_post( $menu_item_data ); wp_update_post( $parent_data ); } // Else this menu item is not a child of the previous. } elseif ( empty( $menu_item_data['menu_order'] ) || empty( $menu_item_data['menu_item_parent'] ) || ! in_array( (int) $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ), true ) || empty( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] ) || $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] !== (int) $menu_item_data['menu_item_parent'] ) { // Just make it a child of the previous; keep the order. $menu_item_data['menu_item_parent'] = (int) $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ]; // Reset invalid `menu_item_parent`. $menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data ); update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] ); wp_update_post( $menu_item_data ); } } } } break; case 'delete-menu-item': $menu_item_id = (int) $_REQUEST['menu-item']; check_admin_referer( 'delete-menu_item_' . $menu_item_id ); if ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) ) { $messages[] = wp_get_admin_notice( __( 'The menu item has been successfully deleted.' ), array( 'id' => 'message', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } break; case 'delete': check_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id ); if ( is_nav_menu( $nav_menu_selected_id ) ) { $deletion = wp_delete_nav_menu( $nav_menu_selected_id ); } else { // Reset the selected menu. $nav_menu_selected_id = 0; unset( $_REQUEST['menu'] ); } if ( ! isset( $deletion ) ) { break; } if ( is_wp_error( $deletion ) ) { $messages[] = wp_get_admin_notice( $deletion->get_error_message(), array( 'id' => 'message', 'additional_classes' => array( 'error' ), 'dismissible' => true, ) ); } else { $messages[] = wp_get_admin_notice( __( 'The menu has been successfully deleted.' ), array( 'id' => 'message', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } break; case 'delete_menus': check_admin_referer( 'nav_menus_bulk_actions' ); foreach ( $_REQUEST['delete_menus'] as $menu_id_to_delete ) { if ( ! is_nav_menu( $menu_id_to_delete ) ) { continue; } $deletion = wp_delete_nav_menu( $menu_id_to_delete ); if ( is_wp_error( $deletion ) ) { $messages[] = wp_get_admin_notice( $deletion->get_error_message(), array( 'id' => 'message', 'additional_classes' => array( 'error' ), 'dismissible' => true, ) ); $deletion_error = true; } } if ( empty( $deletion_error ) ) { $messages[] = wp_get_admin_notice( __( 'Selected menus have been successfully deleted.' ), array( 'id' => 'message', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } break; case 'update': check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); // Merge new and existing menu locations if any new ones are set. $new_menu_locations = array(); if ( isset( $_POST['menu-locations'] ) ) { $new_menu_locations = array_map( 'absint', $_POST['menu-locations'] ); $menu_locations = array_merge( $menu_locations, $new_menu_locations ); } // Add Menu. if ( 0 === $nav_menu_selected_id ) { $new_menu_title = trim( esc_html( $_POST['menu-name'] ) ); if ( $new_menu_title ) { $_nav_menu_selected_id = wp_update_nav_menu_object( 0, array( 'menu-name' => $new_menu_title ) ); if ( is_wp_error( $_nav_menu_selected_id ) ) { $messages[] = wp_get_admin_notice( $_nav_menu_selected_id->get_error_message(), array( 'id' => 'message', 'additional_classes' => array( 'error' ), 'dismissible' => true, ) ); } else { $_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id ); $nav_menu_selected_id = $_nav_menu_selected_id; $nav_menu_selected_title = $_menu_object->name; if ( isset( $_REQUEST['menu-item'] ) ) { wp_save_nav_menu_items( $nav_menu_selected_id, absint( $_REQUEST['menu-item'] ) ); } if ( isset( $_REQUEST['zero-menu-state'] ) || ! empty( $_POST['auto-add-pages'] ) ) { // If there are menu items, add them. wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title ); } if ( isset( $_REQUEST['zero-menu-state'] ) ) { // Auto-save nav_menu_locations. $locations = get_nav_menu_locations(); foreach ( $locations as $location => $menu_id ) { $locations[ $location ] = $nav_menu_selected_id; break; // There should only be 1. } set_theme_mod( 'nav_menu_locations', $locations ); } elseif ( count( $new_menu_locations ) > 0 ) { // If locations have been selected for the new menu, save those. $locations = get_nav_menu_locations(); foreach ( array_keys( $new_menu_locations ) as $location ) { $locations[ $location ] = $nav_menu_selected_id; } set_theme_mod( 'nav_menu_locations', $locations ); } if ( isset( $_REQUEST['use-location'] ) ) { $locations = get_registered_nav_menus(); $menu_locations = get_nav_menu_locations(); if ( isset( $locations[ $_REQUEST['use-location'] ] ) ) { $menu_locations[ $_REQUEST['use-location'] ] = $nav_menu_selected_id; } set_theme_mod( 'nav_menu_locations', $menu_locations ); } wp_redirect( admin_url( 'nav-menus.php?menu=' . $_nav_menu_selected_id ) ); exit; } } else { $messages[] = wp_get_admin_notice( __( 'Please enter a valid menu name.' ), array( 'id' => 'message', 'additional_classes' => array( 'error' ), 'dismissible' => true, ) ); } // Update existing menu. } else { // Remove menu locations that have been unchecked. foreach ( $locations as $location => $description ) { if ( ( empty( $_POST['menu-locations'] ) || empty( $_POST['menu-locations'][ $location ] ) ) && isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] === $nav_menu_selected_id ) { unset( $menu_locations[ $location ] ); } } // Set menu locations. set_theme_mod( 'nav_menu_locations', $menu_locations ); $_menu_object = wp_get_nav_menu_object( $nav_menu_selected_id ); $menu_title = trim( esc_html( $_POST['menu-name'] ) ); if ( ! $menu_title ) { $messages[] = wp_get_admin_notice( __( 'Please enter a valid menu name.' ), array( 'id' => 'message', 'additional_classes' => array( 'error' ), 'dismissible' => true, ) ); $menu_title = $_menu_object->name; } if ( ! is_wp_error( $_menu_object ) ) { $_nav_menu_selected_id = wp_update_nav_menu_object( $nav_menu_selected_id, array( 'menu-name' => $menu_title ) ); if ( is_wp_error( $_nav_menu_selected_id ) ) { $_menu_object = $_nav_menu_selected_id; $messages[] = wp_get_admin_notice( $_nav_menu_selected_id->get_error_message(), array( 'id' => 'message', 'additional_classes' => array( 'error' ), 'dismissible' => true, ) ); } else { $_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id ); $nav_menu_selected_title = $_menu_object->name; } } // Update menu items. if ( ! is_wp_error( $_menu_object ) ) { $messages = array_merge( $messages, wp_nav_menu_update_menu_items( $_nav_menu_selected_id, $nav_menu_selected_title ) ); // If the menu ID changed, redirect to the new URL. if ( $nav_menu_selected_id !== $_nav_menu_selected_id ) { wp_redirect( admin_url( 'nav-menus.php?menu=' . (int) $_nav_menu_selected_id ) ); exit; } } } break; case 'locations': if ( ! $num_locations ) { wp_redirect( admin_url( 'nav-menus.php' ) ); exit; } add_filter( 'screen_options_show_screen', '__return_false' ); if ( isset( $_POST['menu-locations'] ) ) { check_admin_referer( 'save-menu-locations' ); $new_menu_locations = array_map( 'absint', $_POST['menu-locations'] ); $menu_locations = array_merge( $menu_locations, $new_menu_locations ); // Set menu locations. set_theme_mod( 'nav_menu_locations', $menu_locations ); $messages[] = wp_get_admin_notice( __( 'Menu locations updated.' ), array( 'id' => 'message', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } break; } // Get all nav menus. $nav_menus = wp_get_nav_menus(); $menu_count = count( $nav_menus ); // Are we on the add new screen? $add_new_screen = ( isset( $_GET['menu'] ) && 0 === (int) $_GET['menu'] ) ? true : false; $locations_screen = ( isset( $_GET['action'] ) && 'locations' === $_GET['action'] ) ? true : false; $page_count = wp_count_posts( 'page' ); /* * If we have one theme location, and zero menus, we take them right * into editing their first menu. */ if ( 1 === count( get_registered_nav_menus() ) && ! $add_new_screen && empty( $nav_menus ) && ! empty( $page_count->publish ) ) { $one_theme_location_no_menus = true; } else { $one_theme_location_no_menus = false; } $nav_menus_l10n = array( 'oneThemeLocationNoMenus' => $one_theme_location_no_menus, 'moveUp' => __( 'Move up one' ), 'moveDown' => __( 'Move down one' ), 'moveToTop' => __( 'Move to the top' ), /* translators: %s: Previous item name. */ 'moveUnder' => __( 'Move under %s' ), /* translators: %s: Previous item name. */ 'moveOutFrom' => __( 'Move out from under %s' ), /* translators: %s: Previous item name. */ 'under' => __( 'Under %s' ), /* translators: %s: Previous item name. */ 'outFrom' => __( 'Out from under %s' ), /* translators: 1: Item name, 2: Item type, 3: Item index, 4: Total items. */ 'menuFocus' => __( 'Edit %1$s (%2$s, %3$d of %4$d)' ), /* translators: 1: Item name, 2: Item type, 3: Item index, 4: Total items, 5: Item parent. */ 'subMenuFocus' => __( 'Edit %1$s (%2$s, sub-item %3$d of %4$d under %5$s)' ), /* translators: 1: Item name, 2: Item type, 3: Item index, 4: Total items, 5: Item parent, 6: Item depth. */ 'subMenuMoreDepthFocus' => __( 'Edit %1$s (%2$s, sub-item %3$d of %4$d under %5$s, level %6$d)' ), /* translators: %s: Item name. */ 'menuItemDeletion' => __( 'item %s' ), /* translators: %s: Item name. */ 'itemsDeleted' => __( 'Deleted menu item: %s.' ), 'itemAdded' => __( 'Menu item added' ), 'itemRemoved' => __( 'Menu item removed' ), 'movedUp' => __( 'Menu item moved up' ), 'movedDown' => __( 'Menu item moved down' ), 'movedTop' => __( 'Menu item moved to the top' ), 'movedLeft' => __( 'Menu item moved out of submenu' ), 'movedRight' => __( 'Menu item is now a sub-item' ), 'parentUpdated' => __( 'Menu parent updated' ), 'orderUpdated' => __( 'Menu order updated' ), ); wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n ); /* * Redirect to add screen if there are no menus and this users has either zero, * or more than 1 theme locations. */ if ( 0 === $menu_count && ! $add_new_screen && ! $one_theme_location_no_menus ) { wp_redirect( admin_url( 'nav-menus.php?action=edit&menu=0' ) ); } // Get recently edited nav menu. $recently_edited = absint( get_user_option( 'nav_menu_recently_edited' ) ); if ( empty( $recently_edited ) && is_nav_menu( $nav_menu_selected_id ) ) { $recently_edited = $nav_menu_selected_id; } // Use $recently_edited if none are selected. if ( empty( $nav_menu_selected_id ) && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) ) { $nav_menu_selected_id = $recently_edited; } // On deletion of menu, if another menu exists, show it. if ( ! $add_new_screen && $menu_count > 0 && isset( $_GET['action'] ) && 'delete' === $_GET['action'] ) { $nav_menu_selected_id = $nav_menus[0]->term_id; } // Set $nav_menu_selected_id to 0 if no menus. if ( $one_theme_location_no_menus ) { $nav_menu_selected_id = 0; } elseif ( empty( $nav_menu_selected_id ) && ! empty( $nav_menus ) && ! $add_new_screen ) { // If we have no selection yet, and we have menus, set to the first one in the list. $nav_menu_selected_id = $nav_menus[0]->term_id; } // Update the user's setting. if ( $nav_menu_selected_id !== $recently_edited && is_nav_menu( $nav_menu_selected_id ) ) { update_user_meta( $current_user->ID, 'nav_menu_recently_edited', $nav_menu_selected_id ); } // If there's a menu, get its name. if ( ! $nav_menu_selected_title && is_nav_menu( $nav_menu_selected_id ) ) { $_menu_object = wp_get_nav_menu_object( $nav_menu_selected_id ); $nav_menu_selected_title = ! is_wp_error( $_menu_object ) ? $_menu_object->name : ''; } // Generate truncated menu names. foreach ( (array) $nav_menus as $key => $_nav_menu ) { $nav_menus[ $key ]->truncated_name = wp_html_excerpt( $_nav_menu->name, 40, '…' ); } // Retrieve menu locations. if ( current_theme_supports( 'menus' ) ) { $locations = get_registered_nav_menus(); $menu_locations = get_nav_menu_locations(); } /* * Ensure the user will be able to scroll horizontally * by adding a class for the max menu depth. * * @global int $_wp_nav_menu_max_depth */ global $_wp_nav_menu_max_depth; $_wp_nav_menu_max_depth = 0; // Calling wp_get_nav_menu_to_edit generates $_wp_nav_menu_max_depth. if ( is_nav_menu( $nav_menu_selected_id ) ) { $menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array( 'post_status' => 'any' ) ); $edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id ); } /** * @global int $_wp_nav_menu_max_depth * * @since 3.0.0 * * @param string $classes * @return string */ function wp_nav_menu_max_depth( $classes ) { global $_wp_nav_menu_max_depth; return "$classes menu-max-depth-$_wp_nav_menu_max_depth"; } add_filter( 'admin_body_class', 'wp_nav_menu_max_depth' ); wp_nav_menu_setup(); wp_initial_nav_menu_meta_boxes(); if ( ! current_theme_supports( 'menus' ) && ! $num_locations ) { $message_no_theme_support = sprintf( /* translators: %s: URL to Widgets screen. */ __( 'Your theme does not natively support menus, but you can use them in sidebars by adding a “Navigation Menu” widget on the <a href="%s">Widgets</a> screen.' ), admin_url( 'widgets.php' ) ); $messages[] = wp_get_admin_notice( $message_no_theme_support, array( 'id' => 'message', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } if ( ! $locations_screen ) : // Main tab. $overview = '<p>' . __( 'This screen is used for managing your navigation menus.' ) . '</p>'; $overview .= '<p>' . sprintf( /* translators: 1: URL to Widgets screen, 2 and 3: The names of the default themes. */ __( 'Menus can be displayed in locations defined by your theme, even used in sidebars by adding a “Navigation Menu” widget on the <a href="%1$s">Widgets</a> screen. If your theme does not support the navigation menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the documentation link to the side.' ), admin_url( 'widgets.php' ), 'Twenty Twenty', 'Twenty Twenty-One' ) . '</p>'; $overview .= '<p>' . __( 'From this screen you can:' ) . '</p>'; $overview .= '<ul><li>' . __( 'Create, edit, and delete menus' ) . '</li>'; $overview .= '<li>' . __( 'Add, organize, and modify individual menu items' ) . '</li></ul>'; get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => $overview, ) ); $menu_management = '<p>' . __( 'The menu management box at the top of the screen is used to control which menu is opened in the editor below.' ) . '</p>'; $menu_management .= '<ul><li>' . __( 'To edit an existing menu, <strong>choose a menu from the dropdown and click Select</strong>' ) . '</li>'; $menu_management .= '<li>' . __( 'If you have not yet created any menus, <strong>click the ’create a new menu’ link</strong> to get started' ) . '</li></ul>'; $menu_management .= '<p>' . __( 'You can assign theme locations to individual menus by <strong>selecting the desired settings</strong> at the bottom of the menu editor. To assign menus to all theme locations at once, <strong>visit the Manage Locations tab</strong> at the top of the screen.' ) . '</p>'; get_current_screen()->add_help_tab( array( 'id' => 'menu-management', 'title' => __( 'Menu Management' ), 'content' => $menu_management, ) ); $editing_menus = '<p>' . __( 'Each navigation menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below.' ) . '</p>'; $editing_menus .= '<p>' . __( '<strong>Clicking the arrow to the right of any menu item</strong> in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab.' ) . '</p>'; $editing_menus .= '<ul><li>' . __( 'Add one or several items at once by <strong>selecting the checkbox next to each item and clicking Add to Menu</strong>' ) . '</li>'; $editing_menus .= '<li>' . __( 'To add a custom link, <strong>expand the Custom Links section, enter a URL and link text, and click Add to Menu</strong>' ) . '</li>'; $editing_menus .= '<li>' . __( 'To reorganize menu items, <strong>drag and drop items with your mouse or use your keyboard</strong>. Drag or move a menu item a little to the right to make it a submenu' ) . '</li>'; $editing_menus .= '<li>' . __( 'Delete a menu item by <strong>expanding it and clicking the Remove link</strong>' ) . '</li></ul>'; get_current_screen()->add_help_tab( array( 'id' => 'editing-menus', 'title' => __( 'Editing Menus' ), 'content' => $editing_menus, ) ); else : // Locations tab. $locations_overview = '<p>' . __( 'This screen is used for globally assigning menus to locations defined by your theme.' ) . '</p>'; $locations_overview .= '<ul><li>' . __( 'To assign menus to one or more theme locations, <strong>select a menu from each location’s dropdown</strong>. When you are finished, <strong>click Save Changes</strong>' ) . '</li>'; $locations_overview .= '<li>' . __( 'To edit a menu currently assigned to a theme location, <strong>click the adjacent ’Edit’ link</strong>' ) . '</li>'; $locations_overview .= '<li>' . __( 'To add a new menu instead of assigning an existing one, <strong>click the ’Use new menu’ link</strong>. Your new menu will be automatically assigned to that theme location' ) . '</li></ul>'; get_current_screen()->add_help_tab( array( 'id' => 'locations-overview', 'title' => __( 'Overview' ), 'content' => $locations_overview, ) ); endif; get_current_screen()->set_help_sidebar( '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . '<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-menus-screen/">Documentation on Menus</a>' ) . '</p>' . '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' ); // Get the admin header. require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> <h1 class="wp-heading-inline"><?php esc_html_e( 'Menus' ); ?></h1> <?php if ( current_user_can( 'customize' ) ) : $focus = $locations_screen ? array( 'section' => 'menu_locations' ) : array( 'panel' => 'nav_menus' ); printf( ' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>', esc_url( add_query_arg( array( array( 'autofocus' => $focus ), 'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), ), admin_url( 'customize.php' ) ) ), __( 'Manage with Live Preview' ) ); endif; $nav_tab_active_class = ''; $nav_aria_current = ''; if ( ! isset( $_GET['action'] ) || isset( $_GET['action'] ) && 'locations' !== $_GET['action'] ) { $nav_tab_active_class = ' nav-tab-active'; $nav_aria_current = ' aria-current="page"'; } ?> <hr class="wp-header-end"> <nav class="nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>"> <a href="<?php echo esc_url( admin_url( 'nav-menus.php' ) ); ?>" class="nav-tab<?php echo $nav_tab_active_class; ?>"<?php echo $nav_aria_current; ?>><?php esc_html_e( 'Edit Menus' ); ?></a> <?php if ( $num_locations && $menu_count ) { $active_tab_class = ''; $aria_current = ''; if ( $locations_screen ) { $active_tab_class = ' nav-tab-active'; $aria_current = ' aria-current="page"'; } ?> <a href="<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>" class="nav-tab<?php echo $active_tab_class; ?>"<?php echo $aria_current; ?>><?php esc_html_e( 'Manage Locations' ); ?></a> <?php } ?> </nav> <?php foreach ( $messages as $message ) : echo $message . "\n"; endforeach; ?> <?php if ( $locations_screen ) : if ( 1 === $num_locations ) { echo '<p>' . __( 'Your theme supports one menu. Select which menu you would like to use.' ) . '</p>'; } else { echo '<p>' . sprintf( /* translators: %s: Number of menus. */ _n( 'Your theme supports %s menu. Select which menu appears in each location.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n( $num_locations ) ) . '</p>'; } ?> <div id="menu-locations-wrap"> <form method="post" action="<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>"> <table class="widefat fixed" id="menu-locations-table"> <thead> <tr> <th scope="col" class="manage-column column-locations"><?php _e( 'Theme Location' ); ?></th> <th scope="col" class="manage-column column-menus"><?php _e( 'Assigned Menu' ); ?></th> </tr> </thead> <tbody class="menu-locations"> <?php foreach ( $locations as $_location => $_name ) { ?> <tr class="menu-locations-row"> <td class="menu-location-title"><label for="locations-<?php echo $_location; ?>"><?php echo $_name; ?></label></td> <td class="menu-location-menus"> <select name="menu-locations[<?php echo $_location; ?>]" id="locations-<?php echo $_location; ?>"> <option value="0"><?php printf( '— %s —', esc_html__( 'Select a Menu' ) ); ?></option> <?php foreach ( $nav_menus as $menu ) : $data_orig = ''; $selected = isset( $menu_locations[ $_location ] ) && $menu_locations[ $_location ] === $menu->term_id; if ( $selected ) { $data_orig = 'data-orig="true"'; } ?> <option <?php echo $data_orig; ?> <?php selected( $selected ); ?> value="<?php echo $menu->term_id; ?>"> <?php echo wp_html_excerpt( $menu->name, 40, '…' ); ?> </option> <?php endforeach; ?> </select> <div class="locations-row-links"> <?php if ( isset( $menu_locations[ $_location ] ) && 0 !== $menu_locations[ $_location ] ) : ?> <span class="locations-edit-menu-link"> <?php printf( '<a href="%1$s"> <span aria-hidden="true">%2$s</span> <span class="screen-reader-text">%3$s</span> </a>', esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => $menu_locations[ $_location ], ), admin_url( 'nav-menus.php' ) ) ), _x( 'Edit', 'menu' ), /* translators: Hidden accessibility text. */ __( 'Edit selected menu' ) ); ?> </span> <?php endif; ?> <span class="locations-add-menu-link"> <?php printf( '<a href="%1$s">%2$s</a>', esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, 'use-location' => $_location, ), admin_url( 'nav-menus.php' ) ) ), _x( 'Use new menu', 'menu' ) ); ?> </span> </div><!-- .locations-row-links --> </td><!-- .menu-location-menus --> </tr><!-- .menu-locations-row --> <?php } // End foreach. ?> </tbody> </table> <p class="button-controls wp-clearfix"><?php submit_button( __( 'Save Changes' ), 'primary left', 'nav-menu-locations', false ); ?></p> <?php wp_nonce_field( 'save-menu-locations' ); ?> <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> </form> </div><!-- #menu-locations-wrap --> <?php /** * Fires after the menu locations table is displayed. * * @since 3.6.0 */ do_action( 'after_menu_locations_table' ); ?> <?php else : ?> <div class="manage-menus"> <?php if ( $menu_count < 1 ) : ?> <span class="first-menu-message"> <?php _e( 'Create your first menu below.' ); ?> <span class="screen-reader-text"> <?php /* translators: Hidden accessibility text. */ _e( 'Fill in the Menu Name and click the Create Menu button to create your first menu.' ); ?> </span> </span><!-- /first-menu-message --> <?php elseif ( $menu_count < 2 ) : ?> <span class="add-edit-menu-action"> <?php printf( /* translators: %s: URL to create a new menu. */ __( 'Edit your menu below, or <a href="%s">create a new menu</a>. Do not forget to save your changes!' ), esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, ), admin_url( 'nav-menus.php' ) ) ) ); ?> <span class="screen-reader-text"> <?php /* translators: Hidden accessibility text. */ _e( 'Click the Save Menu button to save your changes.' ); ?> </span> </span><!-- /add-edit-menu-action --> <?php else : ?> <form method="get" action="<?php echo esc_url( admin_url( 'nav-menus.php' ) ); ?>"> <input type="hidden" name="action" value="edit" /> <label for="select-menu-to-edit" class="selected-menu"><?php _e( 'Select a menu to edit:' ); ?></label> <select name="menu" id="select-menu-to-edit"> <?php if ( $add_new_screen ) : ?> <option value="0" selected="selected"><?php _e( '— Select —' ); ?></option> <?php endif; ?> <?php foreach ( (array) $nav_menus as $_nav_menu ) : ?> <option value="<?php echo esc_attr( $_nav_menu->term_id ); ?>" <?php selected( $_nav_menu->term_id, $nav_menu_selected_id ); ?>> <?php echo esc_html( $_nav_menu->truncated_name ); if ( ! empty( $menu_locations ) && in_array( $_nav_menu->term_id, $menu_locations, true ) ) { $locations_assigned_to_this_menu = array(); foreach ( array_keys( $menu_locations, $_nav_menu->term_id, true ) as $menu_location_key ) { if ( isset( $locations[ $menu_location_key ] ) ) { $locations_assigned_to_this_menu[] = $locations[ $menu_location_key ]; } } /** * Filters the number of locations listed per menu in the drop-down select. * * @since 3.6.0 * * @param int $locations Number of menu locations to list. Default 3. */ $locations_listed_per_menu = absint( apply_filters( 'wp_nav_locations_listed_per_menu', 3 ) ); $assigned_locations = array_slice( $locations_assigned_to_this_menu, 0, $locations_listed_per_menu ); // Adds ellipses following the number of locations defined in $assigned_locations. if ( ! empty( $assigned_locations ) ) { printf( ' (%1$s%2$s)', implode( ', ', $assigned_locations ), count( $locations_assigned_to_this_menu ) > count( $assigned_locations ) ? ' …' : '' ); } } ?> </option> <?php endforeach; ?> </select> <span class="submit-btn"><input type="submit" class="button" value="<?php esc_attr_e( 'Select' ); ?>"></span> <span class="add-new-menu-action"> <?php printf( /* translators: %s: URL to create a new menu. */ __( 'or <a href="%s">create a new menu</a>. Do not forget to save your changes!' ), esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, ), admin_url( 'nav-menus.php' ) ) ) ); ?> <span class="screen-reader-text"> <?php /* translators: Hidden accessibility text. */ _e( 'Click the Save Menu button to save your changes.' ); ?> </span> </span><!-- /add-new-menu-action --> </form> <?php endif; $metabox_holder_disabled_class = ''; if ( isset( $_GET['menu'] ) && 0 === (int) $_GET['menu'] ) { $metabox_holder_disabled_class = ' metabox-holder-disabled'; } ?> </div><!-- /manage-menus --> <div id="nav-menus-frame" class="wp-clearfix"> <div id="menu-settings-column" class="metabox-holder<?php echo $metabox_holder_disabled_class; ?>"> <div class="clear"></div> <form id="nav-menu-meta" class="nav-menu-meta" method="post" enctype="multipart/form-data"> <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> <input type="hidden" name="action" value="add-menu-item" /> <?php wp_nonce_field( 'add-menu_item', 'menu-settings-column-nonce' ); ?> <h2><?php _e( 'Add menu items' ); ?></h2> <?php do_accordion_sections( 'nav-menus', 'side', null ); ?> </form> </div><!-- /#menu-settings-column --> <div id="menu-management-liquid"> <div id="menu-management"> <form id="update-nav-menu" method="post" enctype="multipart/form-data"> <h2><?php _e( 'Menu structure' ); ?></h2> <div class="menu-edit"> <input type="hidden" name="nav-menu-data"> <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); wp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' ); $menu_name_aria_desc = $add_new_screen ? ' aria-describedby="menu-name-desc"' : ''; if ( $one_theme_location_no_menus ) { $menu_name_val = 'value="' . esc_attr( 'Menu 1' ) . '"'; ?> <input type="hidden" name="zero-menu-state" value="true" /> <?php } else { $menu_name_val = 'value="' . esc_attr( $nav_menu_selected_title ) . '"'; } ?> <input type="hidden" name="action" value="update" /> <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> <div id="nav-menu-header"> <div class="major-publishing-actions wp-clearfix"> <label class="menu-name-label" for="menu-name"><?php _e( 'Menu Name' ); ?></label> <input name="menu-name" id="menu-name" type="text" class="menu-name regular-text menu-item-textbox form-required" required="required" <?php echo $menu_name_val . $menu_name_aria_desc; ?> /> <div class="publishing-action"> <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'primary large menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?> </div><!-- END .publishing-action --> </div><!-- END .major-publishing-actions --> </div><!-- END .nav-menu-header --> <div id="post-body"> <div id="post-body-content" class="wp-clearfix"> <?php if ( ! $add_new_screen ) : ?> <?php $hide_style = ''; if ( isset( $menu_items ) && 0 === count( $menu_items ) ) { $hide_style = 'style="display: none;"'; } if ( $one_theme_location_no_menus ) { $starter_copy = __( 'Edit your default menu by adding or removing items. Drag the items into the order you prefer. Click Create Menu to save your changes.' ); } else { $starter_copy = __( 'Drag the items into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options.' ); } ?> <div class="drag-instructions post-body-plain" <?php echo $hide_style; ?>> <p><?php echo $starter_copy; ?></p> </div> <?php if ( ! $add_new_screen ) : ?> <div id="nav-menu-bulk-actions-top" class="bulk-actions" <?php echo $hide_style; ?>> <label class="bulk-select-button" for="bulk-select-switcher-top"> <input type="checkbox" id="bulk-select-switcher-top" name="bulk-select-switcher-top" class="bulk-select-switcher"> <span class="bulk-select-button-label"><?php _e( 'Bulk Select' ); ?></span> </label> </div> <?php endif; ?> <?php if ( isset( $edit_markup ) && ! is_wp_error( $edit_markup ) ) { echo $edit_markup; } else { ?> <ul class="menu" id="menu-to-edit"></ul> <?php } ?> <?php endif; ?> <?php if ( $add_new_screen ) : ?> <p class="post-body-plain" id="menu-name-desc"><?php _e( 'Give your menu a name, then click Create Menu.' ); ?></p> <?php if ( isset( $_GET['use-location'] ) ) : ?> <input type="hidden" name="use-location" value="<?php echo esc_attr( $_GET['use-location'] ); ?>" /> <?php endif; ?> <?php endif; $no_menus_style = ''; if ( $one_theme_location_no_menus ) { $no_menus_style = 'style="display: none;"'; } ?> <?php if ( ! $add_new_screen ) : ?> <div id="nav-menu-bulk-actions-bottom" class="bulk-actions" <?php echo $hide_style; ?>> <label class="bulk-select-button" for="bulk-select-switcher-bottom"> <input type="checkbox" id="bulk-select-switcher-bottom" name="bulk-select-switcher-top" class="bulk-select-switcher"> <span class="bulk-select-button-label"><?php _e( 'Bulk Select' ); ?></span> </label> <input type="button" class="deletion menu-items-delete disabled" value="<?php esc_attr_e( 'Remove Selected Items' ); ?>"> <div id="pending-menu-items-to-delete"> <p><?php _e( 'List of menu items selected for deletion:' ); ?></p> <ul></ul> </div> </div> <?php endif; ?> <div class="menu-settings" <?php echo $no_menus_style; ?>> <h3><?php _e( 'Menu Settings' ); ?></h3> <?php if ( ! isset( $auto_add ) ) { $auto_add = get_option( 'nav_menu_options' ); if ( ! isset( $auto_add['auto_add'] ) ) { $auto_add = false; } elseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'], true ) ) { $auto_add = true; } else { $auto_add = false; } } ?> <fieldset class="menu-settings-group auto-add-pages"> <legend class="menu-settings-group-name howto"><?php _e( 'Auto add pages' ); ?></legend> <div class="menu-settings-input checkbox-input"> <input type="checkbox"<?php checked( $auto_add ); ?> name="auto-add-pages" id="auto-add-pages" value="1" /> <label for="auto-add-pages"><?php printf( __( 'Automatically add new top-level pages to this menu' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label> </div> </fieldset> <?php if ( current_theme_supports( 'menus' ) ) : ?> <fieldset class="menu-settings-group menu-theme-locations"> <legend class="menu-settings-group-name howto"><?php _e( 'Display location' ); ?></legend> <?php foreach ( $locations as $location => $description ) : $checked = false; if ( isset( $menu_locations[ $location ] ) && 0 !== $nav_menu_selected_id && $menu_locations[ $location ] === $nav_menu_selected_id ) { $checked = true; } ?> <div class="menu-settings-input checkbox-input"> <input type="checkbox"<?php checked( $checked ); ?> name="menu-locations[<?php echo esc_attr( $location ); ?>]" id="locations-<?php echo esc_attr( $location ); ?>" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> <label for="locations-<?php echo esc_attr( $location ); ?>"><?php echo $description; ?></label> <?php if ( ! empty( $menu_locations[ $location ] ) && $menu_locations[ $location ] !== $nav_menu_selected_id ) : ?> <span class="theme-location-set"> <?php printf( /* translators: %s: Menu name. */ _x( '(Currently set to: %s)', 'menu location' ), wp_get_nav_menu_object( $menu_locations[ $location ] )->name ); ?> </span> <?php endif; ?> </div> <?php endforeach; ?> </fieldset> <?php endif; ?> </div> </div><!-- /#post-body-content --> </div><!-- /#post-body --> <div id="nav-menu-footer"> <div class="major-publishing-actions"> <div class="publishing-action"> <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'primary large menu-save', 'save_menu', false, array( 'id' => 'save_menu_footer' ) ); ?> </div><!-- END .publishing-action --> <?php if ( $menu_count > 0 ) : ?> <?php if ( $add_new_screen ) : ?> <span class="cancel-action"> <?php printf( '<a class="submitcancel cancellation menu-cancel" href="%1$s">%2$s</a>', esc_url( admin_url( 'nav-menus.php' ) ), __( 'Cancel' ) ); ?> </span><!-- END .cancel-action --> <?php else : ?> <span class="delete-action"> <?php printf( '<a class="submitdelete deletion menu-delete" href="%1$s">%2$s</a>', esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'delete', 'menu' => $nav_menu_selected_id, ), admin_url( 'nav-menus.php' ) ), 'delete-nav_menu-' . $nav_menu_selected_id ) ), __( 'Delete Menu' ) ); ?> </span><!-- END .delete-action --> <?php endif; ?> <?php endif; ?> </div><!-- END .major-publishing-actions --> </div><!-- /#nav-menu-footer --> </div><!-- /.menu-edit --> </form><!-- /#update-nav-menu --> </div><!-- /#menu-management --> </div><!-- /#menu-management-liquid --> </div><!-- /#nav-menus-frame --> <?php endif; ?> </div><!-- /.wrap--> <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?> images/date-button-2x.gif 0000644 00000001744 15151241223 0011257 0 ustar 00 GIF89a! �a vvv���mmm���ZZZ����������sss������qqq�����������nnn����������������[[[���eeejjj�����搐��������������```������������䶶����XXXaaa���UUU������������kkkDDD��������������ppp���ccc___fffrrr��㱱����hhhYYY��������������^^^iii���lllddd������]]]ooo��������QQQRRR��������٭�����\\\��� !� a , ! @��a������a���,060,���������MI!"�����"!!IM�?IK&!���+I��II?� � % W %������͈I������I�PI�#I��I���IP�I H���$ ڀ��� :��0L�*�Nd�E��2n�1R���( ɲ%K%T�HҠ�I�a��͜]x�l��" I*T�� g����'` T�I� r�D� =��J�bK�T$q@H���$��CΜxsB���$S�L���ÆV�@ t�;�\���$2�hPx9�� ����-8�^퀴iԪE�$�H$b̈a$SHܺy�>+�R��E �ʙgp� �n9\jo����'I�G��@^�˟�� � I(�x bժ &�_ �P�E�A���}���� �2�/$Q"�}�O4p(`Z j�">$a����tЁ=i�I��U^�@�� � ; 0�A �!L$��0V�b�L �E7ܰ� �Î&�@���!�R$�"�e�xPٞ| ; images/arrows.png 0000644 00000000363 15151241223 0010032 0 ustar 00 �PNG IHDR { YKǮ $PLTE �����������������������������������"