����JFIF���������
__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
media-upload.php 0000644 00000007124 15222337115 0007623 0 ustar 00 <?php
/**
* Manage media uploaded file.
*
* There are many filters in here for media. Plugins can extend functionality
* by hooking into the filters.
*
* @package WordPress
* @subpackage Administration
*/
if ( ! isset( $_GET['inline'] ) ) {
define( 'IFRAME_REQUEST', true );
}
/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
if ( ! current_user_can( 'upload_files' ) ) {
wp_die( __( 'Sorry, you are not allowed to upload files.' ), 403 );
}
wp_enqueue_script( 'plupload-handlers' );
wp_enqueue_script( 'image-edit' );
wp_enqueue_script( 'set-post-thumbnail' );
wp_enqueue_style( 'imgareaselect' );
wp_enqueue_script( 'media-gallery' );
header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );
// IDs should be integers.
$ID = isset( $ID ) ? (int) $ID : 0; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
$post_id = isset( $post_id ) ? (int) $post_id : 0;
// Require an ID for the edit screen.
if ( isset( $action ) && 'edit' === $action && ! $ID ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName
wp_die(
'<h1>' . __( 'An error occurred during the upload process.' ) . '</h1>' .
'<p>' . __( 'Invalid item ID. You can view all media items in the <a href="upload.php">Media Library</a>.' ) . '</p>',
403
);
}
if ( ! empty( $_REQUEST['post_id'] ) && ! current_user_can( 'edit_post', $_REQUEST['post_id'] ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to edit this item.' ) . '</p>',
403
);
}
// Upload type: image, video, file, ...?
if ( isset( $_GET['type'] ) ) {
$type = (string) $_GET['type'];
} else {
/**
* Filters the default media upload type in the legacy (pre-3.5.0) media popup.
*
* @since 2.5.0
*
* @param string $type The default media upload type. Possible values include
* 'image', 'audio', 'video', 'file', etc. Default 'file'.
*/
$type = apply_filters( 'media_upload_default_type', 'file' );
}
// Tab: gallery, library, or type-specific.
if ( isset( $_GET['tab'] ) ) {
$tab = (string) $_GET['tab'];
} else {
/**
* Filters the default tab in the legacy (pre-3.5.0) media popup.
*
* @since 2.5.0
*
* @param string $tab The default media popup tab. Default 'type' (From Computer).
*/
$tab = apply_filters( 'media_upload_default_tab', 'type' );
}
$body_id = 'media-upload';
// Let the action code decide how to handle the request.
if ( 'type' === $tab || 'type_url' === $tab || ! array_key_exists( $tab, media_upload_tabs() ) ) {
/**
* Fires inside specific upload-type views in the legacy (pre-3.5.0)
* media popup based on the current tab.
*
* The dynamic portion of the hook name, `$type`, refers to the specific
* media upload type.
*
* The hook only fires if the current `$tab` is 'type' (From Computer),
* 'type_url' (From URL), or, if the tab does not exist (i.e., has not
* been registered via the {@see 'media_upload_tabs'} filter.
*
* Possible hook names include:
*
* - `media_upload_audio`
* - `media_upload_file`
* - `media_upload_image`
* - `media_upload_video`
*
* @since 2.5.0
*/
do_action( "media_upload_{$type}" );
} else {
/**
* Fires inside limited and specific upload-tab views in the legacy
* (pre-3.5.0) media popup.
*
* The dynamic portion of the hook name, `$tab`, refers to the specific
* media upload tab. Possible values include 'library' (Media Library),
* or any custom tab registered via the {@see 'media_upload_tabs'} filter.
*
* @since 2.5.0
*/
do_action( "media_upload_{$tab}" );
}
revision.php 0000644 00000013314 15222337115 0007116 0 ustar 00 <?php
/**
* Revisions administration panel
*
* Requires wp-admin/includes/revision.php.
*
* @package WordPress
* @subpackage Administration
* @since 2.6.0
*/
/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
require ABSPATH . 'wp-admin/includes/revision.php';
/**
* @global int $revision_id Optional. The revision ID.
* @global string $action The action to take. Accepts 'restore', 'view', or 'edit'.
* @global int $from The revision to compare from.
* @global int $to Optional, required if revision missing. The revision to compare to.
*/
$revision_id = ! empty( $_REQUEST['revision'] ) ? absint( $_REQUEST['revision'] ) : 0;
$action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : '';
$from = ! empty( $_REQUEST['from'] ) && is_numeric( $_REQUEST['from'] ) ? absint( $_REQUEST['from'] ) : null;
$to = ! empty( $_REQUEST['to'] ) && is_numeric( $_REQUEST['to'] ) ? absint( $_REQUEST['to'] ) : null;
if ( ! $revision_id ) {
$revision_id = $to;
}
$redirect = 'edit.php';
switch ( $action ) {
case 'restore':
$revision = wp_get_post_revision( $revision_id );
if ( ! $revision ) {
break;
}
if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) {
break;
}
$post = get_post( $revision->post_parent );
if ( ! $post ) {
break;
}
// Don't restore if revisions are disabled and this is not an autosave.
if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) {
$redirect = 'edit.php?post_type=' . $post->post_type;
break;
}
// Don't restore if the post is locked.
if ( wp_check_post_lock( $post->ID ) ) {
break;
}
check_admin_referer( "restore-post_{$revision->ID}" );
/*
* Ensure the global $post remains the same after revision is restored.
* Because wp_insert_post() and wp_transition_post_status() are called
* during the process, plugins can unexpectedly modify $post.
*/
$backup_global_post = clone $post;
wp_restore_post_revision( $revision->ID );
// Restore the global $post as it was before.
$post = $backup_global_post;
$redirect = add_query_arg(
array(
'message' => 5,
'revision' => $revision->ID,
),
get_edit_post_link( $post->ID, 'url' )
);
break;
case 'view':
case 'edit':
default:
$revision = wp_get_post_revision( $revision_id );
if ( ! $revision ) {
break;
}
$post = get_post( $revision->post_parent );
if ( ! $post ) {
break;
}
if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'edit_post', $revision->post_parent ) ) {
break;
}
// Bail if revisions are disabled and this is not an autosave.
if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) {
$redirect = 'edit.php?post_type=' . $post->post_type;
break;
}
$post_edit_link = get_edit_post_link();
$post_title = '<a href="' . esc_url( $post_edit_link ) . '">' . _draft_or_post_title() . '</a>';
/* translators: %s: Post title. */
$h1 = sprintf( __( 'Compare Revisions of “%s”' ), $post_title );
$return_to_post = '<a href="' . esc_url( $post_edit_link ) . '">' . __( '← Go to editor' ) . '</a>';
// Used in the HTML title tag.
$title = __( 'Revisions' );
$redirect = false;
break;
}
// Empty post_type means either malformed object found, or no valid parent was found.
if ( ! $redirect && empty( $post->post_type ) ) {
$redirect = 'edit.php';
}
if ( ! empty( $redirect ) ) {
wp_redirect( $redirect );
exit;
}
// This is so that the correct "Edit" menu item is selected.
if ( ! empty( $post->post_type ) && 'post' !== $post->post_type ) {
$parent_file = 'edit.php?post_type=' . $post->post_type;
} else {
$parent_file = 'edit.php';
}
$submenu_file = $parent_file;
wp_enqueue_script( 'revisions' );
wp_localize_script( 'revisions', '_wpRevisionsSettings', wp_prepare_revisions_for_js( $post, $revision_id, $from ) );
/* Revisions Help Tab */
$revisions_overview = '<p>' . __( 'This screen is used for managing your content revisions.' ) . '</p>';
$revisions_overview .= '<p>' . __( 'Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added.' ) . '</p>';
$revisions_overview .= '<p>' . __( 'From this screen you can review, compare, and restore revisions:' ) . '</p>';
$revisions_overview .= '<ul><li>' . __( 'To navigate between revisions, <strong>drag the slider handle left or right</strong> or <strong>use the Previous or Next buttons</strong>.' ) . '</li>';
$revisions_overview .= '<li>' . __( 'Compare two different revisions by <strong>selecting the “Compare any two revisions” box</strong> to the side.' ) . '</li>';
$revisions_overview .= '<li>' . __( 'To restore a revision, <strong>click Restore This Revision</strong>.' ) . '</li></ul>';
get_current_screen()->add_help_tab(
array(
'id' => 'revisions-overview',
'title' => __( 'Overview' ),
'content' => $revisions_overview,
)
);
$revisions_sidebar = '<p><strong>' . __( 'For more information:' ) . '</strong></p>';
$revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/documentation/article/revisions/">Revisions Management</a>' ) . '</p>';
$revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>';
get_current_screen()->set_help_sidebar( $revisions_sidebar );
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap">
<h1 class="long-header"><?php echo $h1; ?></h1>
<?php echo $return_to_post; ?>
</div>
<?php
wp_print_revision_templates();
require_once ABSPATH . 'wp-admin/admin-footer.php';
plugins.php 0000644 00000074004 15222337115 0006744 0 ustar 00 <?php
/**
* Plugins administration panel.
*
* @package WordPress
* @subpackage Administration
*/
/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
if ( ! current_user_can( 'activate_plugins' ) ) {
wp_die( __( 'Sorry, you are not allowed to manage plugins for this site.' ) );
}
$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
$pagenum = $wp_list_table->get_pagenum();
$action = $wp_list_table->current_action();
$plugin = isset( $_REQUEST['plugin'] ) ? wp_unslash( $_REQUEST['plugin'] ) : '';
$s = isset( $_REQUEST['s'] ) ? urlencode( wp_unslash( $_REQUEST['s'] ) ) : '';
// Clean up request URI from temporary args for screen options/paging uri's to work as expected.
$query_args_to_remove = array(
'error',
'deleted',
'activate',
'activate-multi',
'deactivate',
'deactivate-multi',
'enabled-auto-update',
'disabled-auto-update',
'enabled-auto-update-multi',
'disabled-auto-update-multi',
'_error_nonce',
);
$_SERVER['REQUEST_URI'] = remove_query_arg( $query_args_to_remove, $_SERVER['REQUEST_URI'] );
wp_enqueue_script( 'updates' );
WP_Plugin_Dependencies::initialize();
if ( $action ) {
switch ( $action ) {
case 'activate':
if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
}
if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {
wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
exit;
}
check_admin_referer( 'activate-plugin_' . $plugin );
$result = activate_plugin( $plugin, self_admin_url( 'plugins.php?error=true&plugin=' . urlencode( $plugin ) ), is_network_admin() );
if ( is_wp_error( $result ) ) {
if ( 'unexpected_output' === $result->get_error_code() ) {
$redirect = self_admin_url( 'plugins.php?error=true&charsout=' . strlen( $result->get_error_data() ) . '&plugin=' . urlencode( $plugin ) . "&plugin_status=$status&paged=$page&s=$s" );
wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) );
exit;
} else {
wp_die( $result );
}
}
if ( ! is_network_admin() ) {
$recent = (array) get_option( 'recently_activated' );
unset( $recent[ $plugin ] );
update_option( 'recently_activated', $recent, false );
} else {
$recent = (array) get_site_option( 'recently_activated' );
unset( $recent[ $plugin ] );
update_site_option( 'recently_activated', $recent );
}
if ( isset( $_GET['from'] ) && 'import' === $_GET['from'] ) {
// Overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix.
wp_redirect( self_admin_url( 'import.php?import=' . str_replace( '-importer', '', dirname( $plugin ) ) ) );
} elseif ( isset( $_GET['from'] ) && 'press-this' === $_GET['from'] ) {
wp_redirect( self_admin_url( 'press-this.php' ) );
} else {
// Overrides the ?error=true one above.
wp_redirect( self_admin_url( "plugins.php?activate=true&plugin_status=$status&paged=$page&s=$s" ) );
}
exit;
case 'activate-selected':
if ( ! current_user_can( 'activate_plugins' ) ) {
wp_die( __( 'Sorry, you are not allowed to activate plugins for this site.' ) );
}
check_admin_referer( 'bulk-plugins' );
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
if ( is_network_admin() ) {
foreach ( $plugins as $i => $plugin ) {
// Only activate plugins which are not already network activated.
if ( is_plugin_active_for_network( $plugin ) ) {
unset( $plugins[ $i ] );
}
}
} else {
foreach ( $plugins as $i => $plugin ) {
// Only activate plugins which are not already active and are not network-only when on Multisite.
if ( is_plugin_active( $plugin ) || ( is_multisite() && is_network_only_plugin( $plugin ) ) ) {
unset( $plugins[ $i ] );
}
// Only activate plugins which the user can activate.
if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
unset( $plugins[ $i ] );
}
}
}
if ( empty( $plugins ) ) {
wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
exit;
}
activate_plugins( $plugins, self_admin_url( 'plugins.php?error=true' ), is_network_admin() );
if ( ! is_network_admin() ) {
$recent = (array) get_option( 'recently_activated' );
} else {
$recent = (array) get_site_option( 'recently_activated' );
}
foreach ( $plugins as $plugin ) {
unset( $recent[ $plugin ] );
}
if ( ! is_network_admin() ) {
update_option( 'recently_activated', $recent, false );
} else {
update_site_option( 'recently_activated', $recent );
}
wp_redirect( self_admin_url( "plugins.php?activate-multi=true&plugin_status=$status&paged=$page&s=$s" ) );
exit;
case 'update-selected':
check_admin_referer( 'bulk-plugins' );
if ( isset( $_GET['plugins'] ) ) {
$plugins = explode( ',', wp_unslash( $_GET['plugins'] ) );
} elseif ( isset( $_POST['checked'] ) ) {
$plugins = (array) wp_unslash( $_POST['checked'] );
} else {
$plugins = array();
}
// Used in the HTML title tag.
$title = __( 'Update Plugins' );
$parent_file = 'plugins.php';
wp_enqueue_script( 'updates' );
require_once ABSPATH . 'wp-admin/admin-header.php';
echo '<div class="wrap">';
echo '<h1>' . esc_html( $title ) . '</h1>';
$url = self_admin_url( 'update.php?action=update-selected&plugins=' . urlencode( implode( ',', $plugins ) ) );
$url = wp_nonce_url( $url, 'bulk-update-plugins' );
echo "<iframe src='$url' style='width: 100%; height:100%; min-height:850px;'></iframe>";
echo '</div>';
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
case 'error_scrape':
if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
}
check_admin_referer( 'plugin-activation-error_' . $plugin );
$valid = validate_plugin( $plugin );
if ( is_wp_error( $valid ) ) {
wp_die( $valid );
}
if ( ! WP_DEBUG ) {
error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
}
ini_set( 'display_errors', true ); // Ensure that fatal errors are displayed.
// Go back to "sandbox" scope so we get the same errors as before.
plugin_sandbox_scrape( $plugin );
/** This action is documented in wp-admin/includes/plugin.php */
do_action( "activate_{$plugin}" );
exit;
case 'deactivate':
if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
wp_die( __( 'Sorry, you are not allowed to deactivate this plugin.' ) );
}
check_admin_referer( 'deactivate-plugin_' . $plugin );
if ( ! is_network_admin() && is_plugin_active_for_network( $plugin ) ) {
wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
exit;
}
deactivate_plugins( $plugin, false, is_network_admin() );
if ( ! is_network_admin() ) {
update_option( 'recently_activated', array( $plugin => time() ) + (array) get_option( 'recently_activated' ), false );
} else {
update_site_option( 'recently_activated', array( $plugin => time() ) + (array) get_site_option( 'recently_activated' ) );
}
if ( headers_sent() ) {
echo "<meta http-equiv='refresh' content='" . esc_attr( "0;url=plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) . "' />";
} else {
wp_redirect( self_admin_url( "plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) );
}
exit;
case 'deactivate-selected':
if ( ! current_user_can( 'deactivate_plugins' ) ) {
wp_die( __( 'Sorry, you are not allowed to deactivate plugins for this site.' ) );
}
check_admin_referer( 'bulk-plugins' );
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
// Do not deactivate plugins which are already deactivated.
if ( is_network_admin() ) {
$plugins = array_filter( $plugins, 'is_plugin_active_for_network' );
} else {
$plugins = array_filter( $plugins, 'is_plugin_active' );
$plugins = array_diff( $plugins, array_filter( $plugins, 'is_plugin_active_for_network' ) );
foreach ( $plugins as $i => $plugin ) {
// Only deactivate plugins which the user can deactivate.
if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
unset( $plugins[ $i ] );
}
}
}
if ( empty( $plugins ) ) {
wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
exit;
}
deactivate_plugins( $plugins, false, is_network_admin() );
$deactivated = array();
foreach ( $plugins as $plugin ) {
$deactivated[ $plugin ] = time();
}
if ( ! is_network_admin() ) {
update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ), false );
} else {
update_site_option( 'recently_activated', $deactivated + (array) get_site_option( 'recently_activated' ) );
}
wp_redirect( self_admin_url( "plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page&s=$s" ) );
exit;
case 'delete-selected':
if ( ! current_user_can( 'delete_plugins' ) ) {
wp_die( __( 'Sorry, you are not allowed to delete plugins for this site.' ) );
}
check_admin_referer( 'bulk-plugins' );
// $_POST = from the plugin form; $_GET = from the FTP details screen.
$plugins = isset( $_REQUEST['checked'] ) ? (array) wp_unslash( $_REQUEST['checked'] ) : array();
if ( empty( $plugins ) ) {
wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
exit;
}
$plugins = array_filter( $plugins, 'is_plugin_inactive' ); // Do not allow to delete activated plugins.
if ( empty( $plugins ) ) {
wp_redirect( self_admin_url( "plugins.php?error=true&main=true&plugin_status=$status&paged=$page&s=$s" ) );
exit;
}
// Bail on all if any paths are invalid.
// validate_file() returns truthy for invalid files.
$invalid_plugin_files = array_filter( $plugins, 'validate_file' );
if ( $invalid_plugin_files ) {
wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
exit;
}
require ABSPATH . 'wp-admin/update.php';
$parent_file = 'plugins.php';
if ( ! isset( $_REQUEST['verify-delete'] ) ) {
wp_enqueue_script( 'jquery' );
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap">
<?php
$plugin_info = array();
$have_non_network_plugins = false;
foreach ( (array) $plugins as $plugin ) {
$plugin_slug = dirname( $plugin );
if ( '.' === $plugin_slug ) {
$data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
if ( $data ) {
$plugin_info[ $plugin ] = $data;
$plugin_info[ $plugin ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
if ( ! $plugin_info[ $plugin ]['Network'] ) {
$have_non_network_plugins = true;
}
}
} else {
// Get plugins list from that folder.
$folder_plugins = get_plugins( '/' . $plugin_slug );
if ( $folder_plugins ) {
foreach ( $folder_plugins as $plugin_file => $data ) {
$plugin_info[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $data );
$plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
if ( ! $plugin_info[ $plugin_file ]['Network'] ) {
$have_non_network_plugins = true;
}
}
}
}
}
$plugins_to_delete = count( $plugin_info );
?>
<?php if ( 1 === $plugins_to_delete ) : ?>
<h1><?php _e( 'Delete Plugin' ); ?></h1>
<?php
if ( $have_non_network_plugins && is_network_admin() ) :
$maybe_active_plugin = '<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'This plugin may be active on other sites in the network.' );
wp_admin_notice(
$maybe_active_plugin,
array(
'additional_classes' => array( 'error' ),
)
);
endif;
?>
<p><?php _e( 'You are about to remove the following plugin:' ); ?></p>
<?php else : ?>
<h1><?php _e( 'Delete Plugins' ); ?></h1>
<?php
if ( $have_non_network_plugins && is_network_admin() ) :
$maybe_active_plugins = '<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'These plugins may be active on other sites in the network.' );
wp_admin_notice(
$maybe_active_plugins,
array(
'additional_classes' => array( 'error' ),
)
);
endif;
?>
<p><?php _e( 'You are about to remove the following plugins:' ); ?></p>
<?php endif; ?>
<ul class="ul-disc">
<?php
$data_to_delete = false;
foreach ( $plugin_info as $plugin ) {
if ( $plugin['is_uninstallable'] ) {
/* translators: 1: Plugin name, 2: Plugin author. */
echo '<li>', sprintf( __( '%1$s by %2$s (will also <strong>delete its data</strong>)' ), '<strong>' . $plugin['Name'] . '</strong>', '<em>' . $plugin['AuthorName'] . '</em>' ), '</li>';
$data_to_delete = true;
} else {
/* translators: 1: Plugin name, 2: Plugin author. */
echo '<li>', sprintf( _x( '%1$s by %2$s', 'plugin' ), '<strong>' . $plugin['Name'] . '</strong>', '<em>' . $plugin['AuthorName'] ) . '</em>', '</li>';
}
}
?>
</ul>
<p>
<?php
if ( $data_to_delete ) {
_e( 'Are you sure you want to delete these files and data?' );
} else {
_e( 'Are you sure you want to delete these files?' );
}
?>
</p>
<form method="post" action="<?php echo esc_url( $_SERVER['REQUEST_URI'] ); ?>" style="display:inline;">
<input type="hidden" name="verify-delete" value="1" />
<input type="hidden" name="action" value="delete-selected" />
<?php
foreach ( (array) $plugins as $plugin ) {
echo '<input type="hidden" name="checked[]" value="' . esc_attr( $plugin ) . '" />';
}
?>
<?php wp_nonce_field( 'bulk-plugins' ); ?>
<?php submit_button( $data_to_delete ? __( 'Yes, delete these files and data' ) : __( 'Yes, delete these files' ), '', 'submit', false ); ?>
</form>
<?php
$referer = wp_get_referer();
?>
<form method="post" action="<?php echo $referer ? esc_url( $referer ) : ''; ?>" style="display:inline;">
<?php submit_button( __( 'No, return me to the plugin list' ), '', 'submit', false ); ?>
</form>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
} else {
$plugins_to_delete = count( $plugins );
} // End if verify-delete.
$delete_result = delete_plugins( $plugins );
// Store the result in an option rather than a URL param due to object type & length.
// Cannot use transient/cache, as that could get flushed if any plugin flushes data on uninstall/delete.
update_option( 'plugins_delete_result_' . $user_ID, $delete_result, false );
wp_redirect( self_admin_url( "plugins.php?deleted=$plugins_to_delete&plugin_status=$status&paged=$page&s=$s" ) );
exit;
case 'clear-recent-list':
if ( ! is_network_admin() ) {
update_option( 'recently_activated', array(), false );
} else {
update_site_option( 'recently_activated', array() );
}
break;
case 'resume':
if ( is_multisite() ) {
return;
}
if ( ! current_user_can( 'resume_plugin', $plugin ) ) {
wp_die( __( 'Sorry, you are not allowed to resume this plugin.' ) );
}
check_admin_referer( 'resume-plugin_' . $plugin );
$result = resume_plugin( $plugin, self_admin_url( "plugins.php?error=resuming&plugin_status=$status&paged=$page&s=$s" ) );
if ( is_wp_error( $result ) ) {
wp_die( $result );
}
wp_redirect( self_admin_url( "plugins.php?resume=true&plugin_status=$status&paged=$page&s=$s" ) );
exit;
case 'enable-auto-update':
case 'disable-auto-update':
case 'enable-auto-update-selected':
case 'disable-auto-update-selected':
if ( ! current_user_can( 'update_plugins' ) || ! wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
wp_die( __( 'Sorry, you are not allowed to manage plugins automatic updates.' ) );
}
if ( is_multisite() && ! is_network_admin() ) {
wp_die( __( 'Please connect to your network admin to manage plugins automatic updates.' ) );
}
$redirect = self_admin_url( "plugins.php?plugin_status={$status}&paged={$page}&s={$s}" );
if ( 'enable-auto-update' === $action || 'disable-auto-update' === $action ) {
if ( empty( $plugin ) ) {
wp_redirect( $redirect );
exit;
}
check_admin_referer( 'updates' );
} else {
if ( empty( $_POST['checked'] ) ) {
wp_redirect( $redirect );
exit;
}
check_admin_referer( 'bulk-plugins' );
}
$auto_updates = (array) get_site_option( 'auto_update_plugins', array() );
if ( 'enable-auto-update' === $action ) {
$auto_updates[] = $plugin;
$auto_updates = array_unique( $auto_updates );
$redirect = add_query_arg( array( 'enabled-auto-update' => 'true' ), $redirect );
} elseif ( 'disable-auto-update' === $action ) {
$auto_updates = array_diff( $auto_updates, array( $plugin ) );
$redirect = add_query_arg( array( 'disabled-auto-update' => 'true' ), $redirect );
} else {
$plugins = (array) wp_unslash( $_POST['checked'] );
if ( 'enable-auto-update-selected' === $action ) {
$new_auto_updates = array_merge( $auto_updates, $plugins );
$new_auto_updates = array_unique( $new_auto_updates );
$query_args = array( 'enabled-auto-update-multi' => 'true' );
} else {
$new_auto_updates = array_diff( $auto_updates, $plugins );
$query_args = array( 'disabled-auto-update-multi' => 'true' );
}
// Return early if all selected plugins already have auto-updates enabled or disabled.
// Must use non-strict comparison, so that array order is not treated as significant.
if ( $new_auto_updates == $auto_updates ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
wp_redirect( $redirect );
exit;
}
$auto_updates = $new_auto_updates;
$redirect = add_query_arg( $query_args, $redirect );
}
/** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
$all_items = apply_filters( 'all_plugins', get_plugins() );
// Remove plugins that don't exist or have been deleted since the option was last updated.
$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );
update_site_option( 'auto_update_plugins', $auto_updates );
wp_redirect( $redirect );
exit;
default:
if ( isset( $_POST['checked'] ) ) {
check_admin_referer( 'bulk-plugins' );
$screen = get_current_screen()->id;
$sendback = wp_get_referer();
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
/** This action is documented in wp-admin/edit.php */
$sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $action, $plugins ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
wp_safe_redirect( $sendback );
exit;
}
break;
}
}
$wp_list_table->prepare_items();
wp_enqueue_script( 'plugin-install' );
add_thickbox();
add_screen_option( 'per_page', array( 'default' => 999 ) );
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'<p>' . __( 'Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.' ) . '</p>' .
'<p>' . __( 'The search for installed plugins will search for terms in their name, description, or author.' ) . ' <span id="live-search-desc" class="hide-if-no-js">' . __( 'The search results will be updated as you type.' ) . '</span></p>' .
'<p>' . sprintf(
/* translators: %s: WordPress Plugin Directory URL. */
__( 'If you would like to see more plugins to choose from, click on the “Add Plugin” button and you will be able to browse or search for additional plugins from the <a href="%s">WordPress Plugin Directory</a>. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ),
__( 'https://wordpress.org/plugins/' )
) . '</p>',
)
);
get_current_screen()->add_help_tab(
array(
'id' => 'compatibility-problems',
'title' => __( 'Troubleshooting' ),
'content' =>
'<p>' . __( 'Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue.' ) . '</p>' .
'<p>' . sprintf(
/* translators: %s: WP_PLUGIN_DIR constant value. */
__( 'If something goes wrong with a plugin and you cannot use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated.' ),
'<code>' . WP_PLUGIN_DIR . '</code>'
) . '</p>',
)
);
$help_sidebar_autoupdates = '';
if ( current_user_can( 'update_plugins' ) && wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
get_current_screen()->add_help_tab(
array(
'id' => 'plugins-themes-auto-updates',
'title' => __( 'Auto-updates' ),
'content' =>
'<p>' . __( 'Auto-updates can be enabled or disabled for each individual plugin. 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>' .
'<p>' . __( 'Auto-updates are only available for plugins recognized by WordPress.org, or that include a compatible update system.' ) . '</p>' .
'<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>',
)
);
$help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
}
if ( current_user_can( 'install_plugins' ) ) {
get_current_screen()->add_help_tab(
array(
'id' => 'plugins-dependencies',
'title' => __( 'Dependencies' ),
'content' =>
'<p>' . __( 'Plugin Dependencies aims to make the process of installing and activating add-ons (dependents) and the plugins they rely on (dependencies) consistent and easy.' ) . '</p>' .
'<p>' . __( 'If a required plugin is deleted, a notice will be displayed on the Plugin administration screen informing the user that there is some missing dependencies to install and/or activate. Additionally, each plugin whose dependencies are not met will have an error notice on their plugin row.' ) . '</p>' .
'<p>' . __( 'If a dependent plugin is missing some dependencies, its activation button will be disabled until the required dependencies are activated.' ) . '</p>',
)
);
}
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/manage-plugins/">Documentation on Managing Plugins</a>' ) . '</p>' .
$help_sidebar_autoupdates .
'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);
get_current_screen()->set_screen_reader_content(
array(
'heading_views' => __( 'Filter plugins list' ),
'heading_pagination' => __( 'Plugins list navigation' ),
'heading_list' => __( 'Plugins list' ),
)
);
// Used in the HTML title tag.
$title = __( 'Plugins' );
$parent_file = 'plugins.php';
require_once ABSPATH . 'wp-admin/admin-header.php';
$invalid = validate_active_plugins();
if ( ! empty( $invalid ) ) {
foreach ( $invalid as $plugin_file => $error ) {
$deactivated_message = sprintf(
/* translators: 1: Plugin file, 2: Error message. */
__( 'The plugin %1$s has been deactivated due to an error: %2$s' ),
'<code>' . esc_html( $plugin_file ) . '</code>',
esc_html( $error->get_error_message() )
);
wp_admin_notice(
$deactivated_message,
array(
'id' => 'message',
'additional_classes' => array( 'error' ),
)
);
}
}
// Used by wp_admin_notice() updated notices.
$updated_notice_args = array(
'id' => 'message',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
);
if ( isset( $_GET['error'] ) ) {
if ( isset( $_GET['main'] ) ) {
$errmsg = __( 'You cannot delete a plugin while it is active on the main site.' );
} elseif ( isset( $_GET['charsout'] ) ) {
$errmsg = sprintf(
/* translators: %d: Number of characters. */
_n(
'The plugin generated %d character of <strong>unexpected output</strong> during activation.',
'The plugin generated %d characters of <strong>unexpected output</strong> during activation.',
$_GET['charsout']
),
$_GET['charsout']
);
$errmsg .= ' ' . __( 'If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.' );
} elseif ( 'resuming' === $_GET['error'] ) {
$errmsg = __( 'Plugin could not be resumed because it triggered a <strong>fatal error</strong>.' );
} else {
$errmsg = __( 'Plugin could not be activated because it triggered a <strong>fatal error</strong>.' );
}
if ( ! isset( $_GET['main'] ) && ! isset( $_GET['charsout'] )
&& isset( $_GET['_error_nonce'] ) && wp_verify_nonce( $_GET['_error_nonce'], 'plugin-activation-error_' . $plugin )
) {
$iframe_url = add_query_arg(
array(
'action' => 'error_scrape',
'plugin' => urlencode( $plugin ),
'_wpnonce' => urlencode( $_GET['_error_nonce'] ),
),
admin_url( 'plugins.php' )
);
$errmsg .= '<iframe style="border:0" width="100%" height="70px" src="' . esc_url( $iframe_url ) . '"></iframe>';
}
wp_admin_notice(
$errmsg,
array(
'id' => 'message',
'additional_classes' => array( 'error' ),
)
);
} elseif ( isset( $_GET['deleted'] ) ) {
$delete_result = get_option( 'plugins_delete_result_' . $user_ID );
// Delete it once we're done.
delete_option( 'plugins_delete_result_' . $user_ID );
if ( is_wp_error( $delete_result ) ) {
$plugin_not_deleted_message = sprintf(
/* translators: %s: Error message. */
__( 'Plugin could not be deleted due to an error: %s' ),
esc_html( $delete_result->get_error_message() )
);
wp_admin_notice(
$plugin_not_deleted_message,
array(
'id' => 'message',
'additional_classes' => array( 'error' ),
'dismissible' => true,
)
);
} else {
if ( 1 === (int) $_GET['deleted'] ) {
$plugins_deleted_message = __( 'The selected plugin has been deleted.' );
} else {
$plugins_deleted_message = __( 'The selected plugins have been deleted.' );
}
wp_admin_notice( $plugins_deleted_message, $updated_notice_args );
}
} elseif ( isset( $_GET['activate'] ) ) {
wp_admin_notice( __( 'Plugin activated.' ), $updated_notice_args );
} elseif ( isset( $_GET['activate-multi'] ) ) {
wp_admin_notice( __( 'Selected plugins activated.' ), $updated_notice_args );
} elseif ( isset( $_GET['deactivate'] ) ) {
wp_admin_notice( __( 'Plugin deactivated.' ), $updated_notice_args );
} elseif ( isset( $_GET['deactivate-multi'] ) ) {
wp_admin_notice( __( 'Selected plugins deactivated.' ), $updated_notice_args );
} elseif ( 'update-selected' === $action ) {
wp_admin_notice( __( 'All selected plugins are up to date.' ), $updated_notice_args );
} elseif ( isset( $_GET['resume'] ) ) {
wp_admin_notice( __( 'Plugin resumed.' ), $updated_notice_args );
} elseif ( isset( $_GET['enabled-auto-update'] ) ) {
wp_admin_notice( __( 'Plugin will be auto-updated.' ), $updated_notice_args );
} elseif ( isset( $_GET['disabled-auto-update'] ) ) {
wp_admin_notice( __( 'Plugin will no longer be auto-updated.' ), $updated_notice_args );
} elseif ( isset( $_GET['enabled-auto-update-multi'] ) ) {
wp_admin_notice( __( 'Selected plugins will be auto-updated.' ), $updated_notice_args );
} elseif ( isset( $_GET['disabled-auto-update-multi'] ) ) {
wp_admin_notice( __( 'Selected plugins will no longer be auto-updated.' ), $updated_notice_args );
}
?>
<?php WP_Plugin_Dependencies::display_admin_notice_for_unmet_dependencies(); ?>
<?php WP_Plugin_Dependencies::display_admin_notice_for_circular_dependencies(); ?>
<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>
<?php
if ( ( ! is_multisite() || is_network_admin() ) && current_user_can( 'install_plugins' ) ) {
?>
<a href="<?php echo esc_url( self_admin_url( 'plugin-install.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add Plugin' ); ?></a>
<?php
}
if ( strlen( $s ) ) {
echo '<span class="subtitle">';
printf(
/* translators: %s: Search query. */
__( 'Search results for: %s' ),
'<strong>' . esc_html( urldecode( $s ) ) . '</strong>'
);
echo '</span>';
}
?>
<hr class="wp-header-end">
<?php
/**
* Fires before the plugins list table is rendered.
*
* This hook also fires before the plugins list table is rendered in the Network Admin.
*
* Please note: The 'active' portion of the hook name does not refer to whether the current
* view is for active plugins, but rather all plugins actively-installed.
*
* @since 3.0.0
*
* @param array[] $plugins_all An array of arrays containing information on all installed plugins.
*/
do_action( 'pre_current_active_plugins', $plugins['all'] );
?>
<?php $wp_list_table->views(); ?>
<form class="search-form search-plugins" method="get">
<?php $wp_list_table->search_box( __( 'Search installed plugins' ), 'plugin' ); ?>
</form>
<form method="post" id="bulk-action-form">
<input type="hidden" name="plugin_status" value="<?php echo esc_attr( $status ); ?>" />
<input type="hidden" name="paged" value="<?php echo esc_attr( $page ); ?>" />
<?php $wp_list_table->display(); ?>
</form>
<span class="spinner"></span>
</div>
<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();
wp_print_update_row_templates();
require_once ABSPATH . 'wp-admin/admin-footer.php';
theme-install.php 0000644 00000056611 15222337115 0010035 0 ustar 00 <?php
/**
* Install theme administration panel.
*
* @package WordPress
* @subpackage Administration
*/
/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
require ABSPATH . 'wp-admin/includes/theme-install.php';
$tab = ! empty( $_REQUEST['tab'] ) ? sanitize_text_field( $_REQUEST['tab'] ) : '';
if ( ! current_user_can( 'install_themes' ) ) {
wp_die( __( 'Sorry, you are not allowed to install themes on this site.' ) );
}
if ( is_multisite() && ! is_network_admin() ) {
wp_redirect( network_admin_url( 'theme-install.php' ) );
exit;
}
// Used in the HTML title tag.
$title = __( 'Add Themes' );
$parent_file = 'themes.php';
if ( ! is_network_admin() ) {
$submenu_file = 'themes.php';
}
$installed_themes = search_theme_directories();
if ( false === $installed_themes ) {
$installed_themes = array();
}
foreach ( $installed_themes as $theme_slug => $theme_data ) {
// Ignore child themes.
if ( str_contains( $theme_slug, '/' ) ) {
unset( $installed_themes[ $theme_slug ] );
}
}
wp_localize_script(
'theme',
'_wpThemeSettings',
array(
'themes' => false,
'settings' => array(
'isInstall' => true,
'canInstall' => current_user_can( 'install_themes' ),
'installURI' => current_user_can( 'install_themes' ) ? self_admin_url( 'theme-install.php' ) : null,
'adminUrl' => parse_url( self_admin_url(), PHP_URL_PATH ),
),
'l10n' => array(
'addNew' => __( 'Add Theme' ),
'search' => __( 'Search Themes' ),
'upload' => __( 'Upload Theme' ),
'back' => __( 'Back' ),
'error' => sprintf(
/* translators: %s: Support forums URL. */
__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
__( 'https://wordpress.org/support/forums/' )
),
'tryAgain' => __( 'Try Again' ),
/* translators: %d: Number of themes. */
'themesFound' => __( 'Number of Themes found: %d' ),
'noThemesFound' => __( 'No themes found. Try a different search.' ),
'collapseSidebar' => __( 'Collapse Sidebar' ),
'expandSidebar' => __( 'Expand Sidebar' ),
/* translators: Hidden accessibility text. */
'selectFeatureFilter' => __( 'Select one or more Theme features to filter by' ),
),
'installedThemes' => array_keys( $installed_themes ),
'activeTheme' => get_stylesheet(),
)
);
wp_enqueue_script( 'theme' );
wp_enqueue_script( 'updates' );
if ( $tab ) {
/**
* Fires before each of the tabs are rendered on the Install Themes page.
*
* The dynamic portion of the hook name, `$tab`, refers to the current
* theme installation tab.
*
* Possible hook names include:
*
* - `install_themes_pre_block-themes`
* - `install_themes_pre_dashboard`
* - `install_themes_pre_featured`
* - `install_themes_pre_new`
* - `install_themes_pre_search`
* - `install_themes_pre_updated`
* - `install_themes_pre_upload`
*
* @since 2.8.0
* @since 6.1.0 Added the `install_themes_pre_block-themes` hook name.
*/
do_action( "install_themes_pre_{$tab}" );
}
$help_overview =
'<p>' . sprintf(
/* translators: %s: Theme Directory URL. */
__( 'You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the <a href="%s">WordPress Theme Directory</a>. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses.' ),
__( 'https://wordpress.org/themes/' )
) . '</p>' .
'<p>' . __( 'You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter.' ) . ' <span id="live-search-desc">' . __( 'The search results will be updated as you type.' ) . '</span></p>' .
'<p>' . __( 'Alternately, you can browse the themes that are Popular or Latest. When you find a theme you like, you can preview it or install it.' ) . '</p>' .
'<p>' . sprintf(
/* translators: %s: /wp-content/themes */
__( 'You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your %s directory.' ),
'<code>/wp-content/themes</code>'
) . '</p>';
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' => $help_overview,
)
);
$help_installing =
'<p>' . __( 'Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you are interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look.' ) . '</p>' .
'<p>' . __( 'To install the theme so you can preview it with your site’s content and customize its theme options, click the "Install" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the "Activate" link, or by navigating to your Manage Themes screen and clicking the "Live Preview" link under any installed theme’s thumbnail image.' ) . '</p>';
get_current_screen()->add_help_tab(
array(
'id' => 'installing',
'title' => __( 'Previewing and Installing' ),
'content' => $help_installing,
)
);
// Help tab: Block themes.
$help_block_themes =
'<p>' . __( 'A block theme is a theme that uses blocks for all parts of a site including navigation menus, header, content, and site footer. These themes are built for the features that allow you to edit and customize all parts of your site.' ) . '</p>' .
'<p>' . __( 'With a block theme, you can place and edit blocks without affecting your content by customizing or creating new templates.' ) . '</p>';
get_current_screen()->add_help_tab(
array(
'id' => 'block_themes',
'title' => __( 'Block themes' ),
'content' => $help_block_themes,
)
);
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-themes-screen/#install-themes">Documentation on Adding New Themes</a>' ) . '</p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/block-themes/">Documentation on Block Themes</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>
<?php
/**
* Filters the tabs shown on the Add Themes screen.
*
* This filter is for backward compatibility only, for the suppression of the upload tab.
*
* @since 2.8.0
*
* @param string[] $tabs Associative array of the tabs shown on the Add Themes screen. Default is 'upload'.
*/
$tabs = apply_filters( 'install_themes_tabs', array( 'upload' => __( 'Upload Theme' ) ) );
if ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_themes' ) ) {
echo ' <button type="button" class="upload-view-toggle page-title-action hide-if-no-js" aria-expanded="false">' . __( 'Upload Theme' ) . '</button>';
}
?>
<hr class="wp-header-end">
<?php
wp_admin_notice(
__( 'The Theme Installer screen requires JavaScript.' ),
array(
'additional_classes' => array( 'error', 'hide-if-js' ),
)
);
?>
<div class="upload-theme">
<?php install_themes_upload(); ?>
</div>
<h2 class="screen-reader-text hide-if-no-js">
<?php
/* translators: Hidden accessibility text. */
_e( 'Filter themes list' );
?>
</h2>
<div class="wp-filter hide-if-no-js">
<div class="filter-count">
<span class="count theme-count"></span>
</div>
<ul class="filter-links">
<li><a href="#" data-sort="popular"><?php _ex( 'Popular', 'themes' ); ?></a></li>
<li><a href="#" data-sort="new"><?php _ex( 'Latest', 'themes' ); ?></a></li>
<li><a href="#" data-sort="block-themes"><?php _ex( 'Block Themes', 'themes' ); ?></a></li>
<li><a href="#" data-sort="favorites"><?php _ex( 'Favorites', 'themes' ); ?></a></li>
</ul>
<button type="button" class="button drawer-toggle" aria-expanded="false"><?php _e( 'Feature Filter' ); ?></button>
<form class="search-form"><p class="search-box"></p></form>
<div class="favorites-form">
<?php
$action = 'save_wporg_username_' . get_current_user_id();
if ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), $action ) ) {
$user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' );
update_user_meta( get_current_user_id(), 'wporg_favorites', $user );
} else {
$user = get_user_option( 'wporg_favorites' );
}
?>
<p class="install-help"><?php _e( 'If you have marked themes as favorites on WordPress.org, you can browse them here.' ); ?></p>
<p class="favorites-username">
<label for="wporg-username-input"><?php _e( 'Your WordPress.org username:' ); ?></label>
<input type="hidden" id="wporg-username-nonce" name="_wpnonce" value="<?php echo esc_attr( wp_create_nonce( $action ) ); ?>" />
<input type="search" id="wporg-username-input" value="<?php echo esc_attr( $user ); ?>" />
<input type="button" class="button favorites-form-submit" value="<?php esc_attr_e( 'Get Favorites' ); ?>" />
</p>
</div>
<div class="filter-drawer">
<div class="buttons">
<button type="button" class="apply-filters button"><?php _e( 'Apply Filters' ); ?><span></span></button>
<button type="button" class="clear-filters button" aria-label="<?php esc_attr_e( 'Clear current filters' ); ?>"><?php _e( 'Clear' ); ?></button>
</div>
<?php
// Use the core list, rather than the .org API, due to inconsistencies
// and to ensure tags are translated.
$feature_list = get_theme_feature_list( false );
foreach ( $feature_list as $feature_group => $features ) {
echo '<fieldset class="filter-group">';
echo '<legend>' . esc_html( $feature_group ) . '</legend>';
echo '<div class="filter-group-feature">';
foreach ( $features as $feature => $feature_name ) {
$feature = esc_attr( $feature );
echo '<input type="checkbox" id="filter-id-' . $feature . '" value="' . $feature . '" /> ';
echo '<label for="filter-id-' . $feature . '">' . esc_html( $feature_name ) . '</label>';
}
echo '</div>';
echo '</fieldset>';
}
?>
<div class="buttons">
<button type="button" class="apply-filters button"><?php _e( 'Apply Filters' ); ?><span></span></button>
<button type="button" class="clear-filters button" aria-label="<?php esc_attr_e( 'Clear current filters' ); ?>"><?php _e( 'Clear' ); ?></button>
</div>
<div class="filtered-by">
<span><?php _e( 'Filtering by:' ); ?></span>
<div class="tags"></div>
<button type="button" class="button-link edit-filters"><?php _e( 'Edit Filters' ); ?></button>
</div>
</div>
</div>
<h2 class="screen-reader-text hide-if-no-js">
<?php
/* translators: Hidden accessibility text. */
_e( 'Themes list' );
?>
</h2>
<div class="theme-browser content-filterable"></div>
<div class="theme-install-overlay wp-full-overlay expanded"></div>
<p class="no-themes"><?php _e( 'No themes found. Try a different search.' ); ?></p>
<span class="spinner"></span>
<?php
if ( $tab ) {
/**
* Fires at the top of each of the tabs on the Install Themes page.
*
* The dynamic portion of the hook name, `$tab`, refers to the current
* theme installation tab.
*
* Possible hook names include:
*
* - `install_themes_block-themes`
* - `install_themes_dashboard`
* - `install_themes_featured`
* - `install_themes_new`
* - `install_themes_search`
* - `install_themes_updated`
* - `install_themes_upload`
*
* @since 2.8.0
* @since 6.1.0 Added the `install_themes_block-themes` hook name.
*
* @param int $paged Number of the current page of results being viewed.
*/
do_action( "install_themes_{$tab}", $paged );
}
?>
</div>
<script id="tmpl-theme" type="text/template">
<# if ( data.screenshot_url ) { #>
<div class="theme-screenshot">
<img src="{{ data.screenshot_url }}?ver={{ data.version }}" alt="" />
</div>
<# } else { #>
<div class="theme-screenshot blank"></div>
<# } #>
<# if ( data.installed ) { #>
<?php
wp_admin_notice(
_x( 'Installed', 'theme' ),
array(
'type' => 'success',
'additional_classes' => array( 'notice-alt' ),
)
);
?>
<# } #>
<# if ( ! data.compatible_wp || ! data.compatible_php ) { #>
<div class="notice notice-error notice-alt"><p>
<# if ( ! data.compatible_wp && ! data.compatible_php ) { #>
<?php
_e( 'This theme does not work with your versions of WordPress and PHP.' );
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
printf(
/* 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
} elseif ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } else if ( ! data.compatible_wp ) { #>
<?php
_e( 'This theme does not work with your version of WordPress.' );
if ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
?>
<# } else if ( ! data.compatible_php ) { #>
<?php
_e( 'This theme does not work with your version of PHP.' );
if ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } #>
</p></div>
<# } #>
<span class="more-details"><?php _ex( 'Details & Preview', 'theme' ); ?></span>
<div class="theme-author">
<?php
/* translators: %s: Theme author name. */
printf( __( 'By %s' ), '{{ data.author }}' );
?>
</div>
<div class="theme-id-container">
<h3 class="theme-name">{{ data.name }}</h3>
<div class="theme-actions">
<# if ( data.installed ) { #>
<# if ( data.compatible_wp && data.compatible_php ) { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
?>
<# if ( data.activate_url ) { #>
<# if ( ! data.active ) { #>
<a class="button button-primary activate" href="{{ data.activate_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
<# } else { #>
<button class="button button-primary disabled"><?php _ex( 'Activated', 'theme' ); ?></button>
<# } #>
<# } #>
<# if ( data.customize_url ) { #>
<# if ( ! data.active ) { #>
<# if ( ! data.block_theme ) { #>
<a class="button load-customize" href="{{ data.customize_url }}"><?php _e( 'Live Preview' ); ?></a>
<# } #>
<# } else { #>
<a class="button load-customize" href="{{ data.customize_url }}"><?php _e( 'Customize' ); ?></a>
<# } #>
<# } else { #>
<button class="button preview install-theme-preview"><?php _e( 'Preview' ); ?></button>
<# } #>
<# } else { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
?>
<# if ( data.activate_url ) { #>
<a class="button button-primary disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
<# } #>
<# if ( data.customize_url ) { #>
<a class="button disabled"><?php _e( 'Live Preview' ); ?></a>
<# } else { #>
<button class="button disabled"><?php _e( 'Preview' ); ?></button>
<# } #>
<# } #>
<# } else { #>
<# if ( data.compatible_wp && data.compatible_php ) { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Install %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary theme-install" data-name="{{ data.name }}" data-slug="{{ data.id }}" href="{{ data.install_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Install' ); ?></a>
<button class="button preview install-theme-preview"><?php _e( 'Preview' ); ?></button>
<# } else { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Cannot Install %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary disabled" data-name="{{ data.name }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Install', 'theme' ); ?></a>
<button class="button disabled"><?php _e( 'Preview' ); ?></button>
<# } #>
<# } #>
</div>
</div>
</script>
<script id="tmpl-theme-preview" type="text/template">
<div class="wp-full-overlay-sidebar">
<div class="wp-full-overlay-header">
<button class="close-full-overlay"><span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e( 'Close' );
?>
</span></button>
<button class="previous-theme"><span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e( 'Previous theme' );
?>
</span></button>
<button class="next-theme"><span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e( 'Next theme' );
?>
</span></button>
<# if ( data.installed ) { #>
<# if ( data.compatible_wp && data.compatible_php ) { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
?>
<# if ( ! data.active ) { #>
<a class="button button-primary activate" href="{{ data.activate_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
<# } else { #>
<button class="button button-primary disabled"><?php _ex( 'Activated', 'theme' ); ?></button>
<# } #>
<# } else { #>
<a class="button button-primary disabled" ><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
<# } #>
<# } else { #>
<# if ( data.compatible_wp && data.compatible_php ) { #>
<a href="{{ data.install_url }}" class="button button-primary theme-install" data-name="{{ data.name }}" data-slug="{{ data.id }}"><?php _e( 'Install' ); ?></a>
<# } else { #>
<a class="button button-primary disabled" ><?php _ex( 'Cannot Install', 'theme' ); ?></a>
<# } #>
<# } #>
</div>
<div class="wp-full-overlay-sidebar-content">
<div class="install-theme-info">
<h3 class="theme-name">{{ data.name }}</h3>
<span class="theme-by">
<?php
/* translators: %s: Theme author name. */
printf( __( 'By %s' ), '{{ data.author }}' );
?>
</span>
<div class="theme-screenshot">
<img class="theme-screenshot" src="{{ data.screenshot_url }}?ver={{ data.version }}" alt="" />
</div>
<div class="theme-details">
<# if ( data.rating ) { #>
<div class="theme-rating">
{{{ data.stars }}}
<a class="num-ratings" href="{{ data.reviews_url }}">
<?php
/* translators: %s: Number of ratings. */
printf( __( '(%s ratings)' ), '{{ data.num_ratings }}' );
?>
</a>
</div>
<# } else { #>
<span class="no-rating"><?php _e( 'This theme has not been rated yet.' ); ?></span>
<# } #>
<div class="theme-version">
<?php
/* translators: %s: Theme version. */
printf( __( 'Version: %s' ), '{{ data.version }}' );
?>
</div>
<# if ( ! data.compatible_wp || ! data.compatible_php ) { #>
<div class="notice notice-error notice-alt notice-large"><p>
<# if ( ! data.compatible_wp && ! data.compatible_php ) { #>
<?php
_e( 'This theme does not work with your versions of WordPress and PHP.' );
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
printf(
/* 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
} elseif ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } else if ( ! data.compatible_wp ) { #>
<?php
_e( 'This theme does not work with your version of WordPress.' );
if ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
?>
<# } else if ( ! data.compatible_php ) { #>
<?php
_e( 'This theme does not work with your version of PHP.' );
if ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } #>
</p></div>
<# } #>
<div class="theme-description">{{{ data.description }}}</div>
</div>
</div>
</div>
<div class="wp-full-overlay-footer">
<button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
<span class="collapse-sidebar-arrow" aria-hidden="true"></span>
<span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
</button>
</div>
</div>
<div class="wp-full-overlay-main">
<iframe src="{{ data.preview_url }}" title="<?php esc_attr_e( 'Preview' ); ?>"></iframe>
</div>
</script>
<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();
require_once ABSPATH . 'wp-admin/admin-footer.php';
edit-form-blocks.php 0000644 00000035143 15222337115 0010425 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 ), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) ),
'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(), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) . ');'
);
// 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, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) );
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, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) ),
'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, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $initial_edits, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
);
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>
link.php 0000644 00000005615 15222337115 0006222 0 ustar 00 <?php
/**
* Manage link administration actions.
*
* This page is accessed by the link management pages and handles the forms and
* Ajax processes for link actions.
*
* @package WordPress
* @subpackage Administration
*/
/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.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;
if ( ! current_user_can( 'manage_links' ) ) {
wp_link_manager_disabled_message();
}
if ( ! empty( $_POST['deletebookmarks'] ) ) {
$action = 'deletebookmarks';
}
if ( ! empty( $_POST['move'] ) ) {
$action = 'move';
}
if ( ! empty( $_POST['linkcheck'] ) ) {
$linkcheck = $_POST['linkcheck'];
}
$this_file = admin_url( 'link-manager.php' );
switch ( $action ) {
case 'deletebookmarks':
check_admin_referer( 'bulk-bookmarks' );
// For each link id (in $linkcheck[]) change category to selected value.
if ( count( $linkcheck ) === 0 ) {
wp_redirect( $this_file );
exit;
}
$deleted = 0;
foreach ( $linkcheck as $link_id ) {
$link_id = (int) $link_id;
if ( wp_delete_link( $link_id ) ) {
++$deleted;
}
}
wp_redirect( "$this_file?deleted=$deleted" );
exit;
case 'move':
check_admin_referer( 'bulk-bookmarks' );
// For each link id (in $linkcheck[]) change category to selected value.
if ( count( $linkcheck ) === 0 ) {
wp_redirect( $this_file );
exit;
}
$all_links = implode( ',', $linkcheck );
/*
* Should now have an array of links we can change:
* $q = $wpdb->query("update $wpdb->links SET link_category='$category' WHERE link_id IN ($all_links)");
*/
wp_redirect( $this_file );
exit;
case 'add':
check_admin_referer( 'add-bookmark' );
$redir = wp_get_referer();
if ( add_link() ) {
$redir = add_query_arg( 'added', 'true', $redir );
}
wp_redirect( $redir );
exit;
case 'save':
$link_id = (int) $_POST['link_id'];
check_admin_referer( 'update-bookmark_' . $link_id );
edit_link( $link_id );
wp_redirect( $this_file );
exit;
case 'delete':
$link_id = (int) $_GET['link_id'];
check_admin_referer( 'delete-bookmark_' . $link_id );
wp_delete_link( $link_id );
wp_redirect( $this_file );
exit;
case 'edit':
wp_enqueue_script( 'link' );
wp_enqueue_script( 'xfn' );
if ( wp_is_mobile() ) {
wp_enqueue_script( 'jquery-touch-punch' );
}
$parent_file = 'link-manager.php';
$submenu_file = 'link-manager.php';
// Used in the HTML title tag.
$title = __( 'Edit Link' );
$link_id = (int) $_GET['link_id'];
$link = get_link_to_edit( $link_id );
if ( ! $link ) {
wp_die( __( 'Link not found.' ) );
}
require ABSPATH . 'wp-admin/edit-link-form.php';
require_once ABSPATH . 'wp-admin/admin-footer.php';
break;
default:
break;
}
widgets.php 0000644 00000002130 15222337115 0006720 0 ustar 00 <?php
/**
* Widget administration screen.
*
* @package WordPress
* @subpackage Administration
*/
/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
/** WordPress Administration Widgets API */
require_once ABSPATH . 'wp-admin/includes/widgets.php';
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
);
}
if ( ! current_theme_supports( 'widgets' ) ) {
wp_die( __( 'The theme you are currently using is not widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please <a href="https://developer.wordpress.org/themes/functionality/widgets/">follow these instructions</a>.' ) );
}
// Used in the HTML title tag.
$title = __( 'Widgets' );
$parent_file = 'themes.php';
if ( wp_use_widgets_block_editor() ) {
require ABSPATH . 'wp-admin/widgets-form-blocks.php';
} else {
require ABSPATH . 'wp-admin/widgets-form.php';
}
themes.php 0000644 00000137663 15222337115 0006563 0 ustar 00 <?php
/**
* Themes administration panel.
*
* @package WordPress
* @subpackage Administration
*/
/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
if ( ! current_user_can( 'switch_themes' ) && ! 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
);
}
if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) {
if ( 'activate' === $_GET['action'] ) {
check_admin_referer( 'switch-theme_' . $_GET['stylesheet'] );
$theme = wp_get_theme( $_GET['stylesheet'] );
if ( ! $theme->exists() || ! $theme->is_allowed() ) {
wp_die(
'<h1>' . __( 'An error occurred.' ) . '</h1>' .
'<p>' . __( 'The requested theme does not exist.' ) . '</p>',
403
);
}
switch_theme( $theme->get_stylesheet() );
wp_redirect( admin_url( 'themes.php?activated=true' ) );
exit;
} elseif ( 'resume' === $_GET['action'] ) {
check_admin_referer( 'resume-theme_' . $_GET['stylesheet'] );
$theme = wp_get_theme( $_GET['stylesheet'] );
if ( ! current_user_can( 'resume_theme', $_GET['stylesheet'] ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to resume this theme.' ) . '</p>',
403
);
}
$result = resume_theme( $theme->get_stylesheet(), self_admin_url( 'themes.php?error=resuming' ) );
if ( is_wp_error( $result ) ) {
wp_die( $result );
}
wp_redirect( admin_url( 'themes.php?resumed=true' ) );
exit;
} elseif ( 'delete' === $_GET['action'] ) {
check_admin_referer( 'delete-theme_' . $_GET['stylesheet'] );
$theme = wp_get_theme( $_GET['stylesheet'] );
if ( ! current_user_can( 'delete_themes' ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to delete this item.' ) . '</p>',
403
);
}
if ( ! $theme->exists() ) {
wp_die(
'<h1>' . __( 'An error occurred while deleting the theme.' ) . '</h1>' .
'<p>' . __( 'The requested theme does not exist.' ) . '</p>',
403
);
}
$active = wp_get_theme();
if ( $active->get( 'Template' ) === $_GET['stylesheet'] ) {
wp_redirect( admin_url( 'themes.php?delete-active-child=true' ) );
} else {
delete_theme( $_GET['stylesheet'] );
wp_redirect( admin_url( 'themes.php?deleted=true' ) );
}
exit;
} elseif ( 'enable-auto-update' === $_GET['action'] ) {
if ( ! ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) ) {
wp_die( __( 'Sorry, you are not allowed to enable themes automatic updates.' ) );
}
check_admin_referer( 'updates' );
$all_items = wp_get_themes();
$auto_updates = (array) get_site_option( 'auto_update_themes', array() );
$auto_updates[] = $_GET['stylesheet'];
$auto_updates = array_unique( $auto_updates );
// Remove themes that have been deleted since the site option was last updated.
$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );
update_site_option( 'auto_update_themes', $auto_updates );
wp_redirect( admin_url( 'themes.php?enabled-auto-update=true' ) );
exit;
} elseif ( 'disable-auto-update' === $_GET['action'] ) {
if ( ! ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) ) {
wp_die( __( 'Sorry, you are not allowed to disable themes automatic updates.' ) );
}
check_admin_referer( 'updates' );
$all_items = wp_get_themes();
$auto_updates = (array) get_site_option( 'auto_update_themes', array() );
$auto_updates = array_diff( $auto_updates, array( $_GET['stylesheet'] ) );
// Remove themes that have been deleted since the site option was last updated.
$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );
update_site_option( 'auto_update_themes', $auto_updates );
wp_redirect( admin_url( 'themes.php?disabled-auto-update=true' ) );
exit;
}
}
// Used in the HTML title tag.
$title = __( 'Themes' );
$parent_file = 'themes.php';
// Help tab: Overview.
if ( current_user_can( 'switch_themes' ) ) {
$help_overview = '<p>' . __( 'This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties.' ) . '</p>' .
'<p>' . __( 'From this screen you can:' ) . '</p>' .
'<ul><li>' . __( 'Hover or tap to see Activate and Live Preview buttons' ) . '</li>' .
'<li>' . __( 'Click on the theme to see the theme name, version, author, description, tags, and the Delete link' ) . '</li>' .
'<li>' . __( 'Click Customize for the active theme or Live Preview for any other theme to see a live preview' ) . '</li></ul>' .
'<p>' . __( 'The active theme is displayed highlighted as the first theme.' ) . '</p>' .
'<p>' . __( 'The search for installed themes will search for terms in their name, description, author, or tag.' ) . ' <span id="live-search-desc">' . __( 'The search results will be updated as you type.' ) . '</span></p>';
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' => $help_overview,
)
);
} // End if 'switch_themes'.
// Help tab: Adding Themes.
if ( current_user_can( 'install_themes' ) ) {
if ( is_multisite() ) {
$help_install = '<p>' . __( 'Installing themes on Multisite can only be done from the Network Admin section.' ) . '</p>';
} else {
$help_install = '<p>' . sprintf(
/* translators: %s: https://wordpress.org/themes/ */
__( 'If you would like to see more themes to choose from, click on the “Add Theme” button and you will be able to browse or search for additional themes from the <a href="%s">WordPress Theme Directory</a>. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ),
__( 'https://wordpress.org/themes/' )
) . '</p>';
}
get_current_screen()->add_help_tab(
array(
'id' => 'adding-themes',
'title' => __( 'Adding Themes' ),
'content' => $help_install,
)
);
} // End if 'install_themes'.
// Help tab: Previewing and Customizing.
if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
$help_customize =
'<p>' . __( 'Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way.' ) . '</p>' .
'<p>' . __( 'The theme being previewed is fully interactive — navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Activate & Publish button above the menu.' ) . '</p>' .
'<p>' . __( 'When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again.' ) . '</p>';
get_current_screen()->add_help_tab(
array(
'id' => 'customize-preview-themes',
'title' => __( 'Previewing and Customizing' ),
'content' => $help_customize,
)
);
} // End if 'edit_theme_options' && 'customize'.
$help_sidebar_autoupdates = '';
// Help tab: Auto-updates.
if ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) {
$help_tab_autoupdates =
'<p>' . __( 'Auto-updates can be enabled or disabled for each individual theme. Themes 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>' .
'<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>';
} // End if 'update_themes' && 'wp_is_auto_update_enabled_for_type'.
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/work-with-themes/">Documentation on Using Themes</a>' ) . '</p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-themes-screen/">Documentation on Managing Themes</a>' ) . '</p>' .
$help_sidebar_autoupdates .
'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);
if ( current_user_can( 'switch_themes' ) ) {
$themes = wp_prepare_themes_for_js();
} else {
$themes = wp_prepare_themes_for_js( array( wp_get_theme() ) );
}
$theme = ! empty( $_REQUEST['theme'] ) ? sanitize_text_field( $_REQUEST['theme'] ) : '';
$search = ! empty( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : '';
wp_localize_script(
'theme',
'_wpThemeSettings',
array(
'themes' => $themes,
'settings' => array(
'canInstall' => ( ! is_multisite() && current_user_can( 'install_themes' ) ),
'installURI' => ( ! is_multisite() && current_user_can( 'install_themes' ) ) ? admin_url( 'theme-install.php' ) : null,
'confirmDelete' => __( "Are you sure you want to delete this theme?\n\nClick 'Cancel' to go back, 'OK' to confirm the delete." ),
'adminUrl' => parse_url( admin_url(), PHP_URL_PATH ),
),
'l10n' => array(
'addNew' => __( 'Add Theme' ),
'search' => __( 'Search installed themes' ),
/* translators: %d: Number of themes. */
'themesFound' => __( 'Number of Themes found: %d' ),
'noThemesFound' => __( 'No themes found. Try a different search.' ),
),
)
);
add_thickbox();
wp_enqueue_script( 'theme' );
wp_enqueue_script( 'updates' );
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap">
<h1 class="wp-heading-inline"><?php esc_html_e( 'Themes' ); ?>
<span class="title-count theme-count"><?php echo ! empty( $_GET['search'] ) ? __( '…' ) : count( $themes ); ?></span>
</h1>
<?php if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>
<a href="<?php echo esc_url( admin_url( 'theme-install.php' ) ); ?>" class="hide-if-no-js page-title-action"><?php echo esc_html__( 'Add Theme' ); ?></a>
<?php endif; ?>
<hr class="wp-header-end">
<form class="search-form search-themes"><p class="search-box"></p></form>
<?php
if ( ! validate_current_theme() || isset( $_GET['broken'] ) ) {
wp_admin_notice(
__( 'The active theme is broken. Reverting to the default theme.' ),
array(
'id' => 'message1',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
} elseif ( isset( $_GET['activated'] ) ) {
if ( isset( $_GET['previewed'] ) ) {
wp_admin_notice(
__( 'Settings saved and theme activated.' ) . ' <a href="' . esc_url( home_url( '/' ) ) . '">' . __( 'Visit site' ) . '</a>',
array(
'id' => 'message2',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
} else {
wp_admin_notice(
__( 'New theme activated.' ) . ' <a href="' . esc_url( home_url( '/' ) ) . '">' . __( 'Visit site' ) . '</a>',
array(
'id' => 'message2',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
}
} elseif ( isset( $_GET['deleted'] ) ) {
wp_admin_notice(
__( 'Theme deleted.' ),
array(
'id' => 'message3',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
} elseif ( isset( $_GET['delete-active-child'] ) ) {
wp_admin_notice(
__( 'You cannot delete a theme while it has an active child theme.' ),
array(
'id' => 'message4',
'additional_classes' => array( 'error' ),
)
);
} elseif ( isset( $_GET['resumed'] ) ) {
wp_admin_notice(
__( 'Theme resumed.' ),
array(
'id' => 'message5',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
} elseif ( isset( $_GET['error'] ) && 'resuming' === $_GET['error'] ) {
wp_admin_notice(
__( 'Theme could not be resumed because it triggered a <strong>fatal error</strong>.' ),
array(
'id' => 'message6',
'additional_classes' => array( 'error' ),
)
);
} elseif ( isset( $_GET['enabled-auto-update'] ) ) {
wp_admin_notice(
__( 'Theme will be auto-updated.' ),
array(
'id' => 'message7',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
} elseif ( isset( $_GET['disabled-auto-update'] ) ) {
wp_admin_notice(
__( 'Theme will no longer be auto-updated.' ),
array(
'id' => 'message8',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
}
$current_theme = wp_get_theme();
if ( $current_theme->errors() && ( ! is_multisite() || current_user_can( 'manage_network_themes' ) ) ) {
wp_admin_notice(
'<strong>' . __( 'Error:' ) . '</strong> ' . $current_theme->errors()->get_error_message(),
array(
'additional_classes' => array( 'error' ),
)
);
}
$current_theme_actions = array();
if ( is_array( $submenu ) && isset( $submenu['themes.php'] ) ) {
$forbidden_paths = array(
'themes.php',
'theme-editor.php',
'site-editor.php',
'edit.php?post_type=wp_navigation',
);
foreach ( (array) $submenu['themes.php'] as $item ) {
$class = '';
if ( in_array( $item[2], $forbidden_paths, true ) || str_starts_with( $item[2], 'customize.php' ) ) {
continue;
}
// 0 = name, 1 = capability, 2 = file.
if ( 0 === strcmp( $self, $item[2] ) && empty( $parent_file )
|| $parent_file && $item[2] === $parent_file
) {
$class = ' current';
}
if ( ! empty( $submenu[ $item[2] ] ) ) {
$submenu[ $item[2] ] = array_values( $submenu[ $item[2] ] ); // Re-index.
$menu_hook = get_plugin_page_hook( $submenu[ $item[2] ][0][2], $item[2] );
if ( file_exists( WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}" ) || ! empty( $menu_hook ) ) {
$current_theme_actions[] = "<a class='button$class' href='admin.php?page={$submenu[$item[2]][0][2]}'>{$item[0]}</a>";
} else {
$current_theme_actions[] = "<a class='button$class' href='{$submenu[$item[2]][0][2]}'>{$item[0]}</a>";
}
} elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) {
$menu_file = $item[2];
if ( current_user_can( 'customize' ) ) {
if ( 'custom-header' === $menu_file ) {
$current_theme_actions[] = "<a class='button hide-if-no-customize$class' href='customize.php?autofocus[control]=header_image'>{$item[0]}</a>";
} elseif ( 'custom-background' === $menu_file ) {
$current_theme_actions[] = "<a class='button hide-if-no-customize$class' href='customize.php?autofocus[control]=background_image'>{$item[0]}</a>";
}
}
$pos = strpos( $menu_file, '?' );
if ( false !== $pos ) {
$menu_file = substr( $menu_file, 0, $pos );
}
if ( file_exists( ABSPATH . "wp-admin/$menu_file" ) ) {
$current_theme_actions[] = "<a class='button$class' href='{$item[2]}'>{$item[0]}</a>";
} else {
$current_theme_actions[] = "<a class='button$class' href='themes.php?page={$item[2]}'>{$item[0]}</a>";
}
}
}
}
$class_name = 'theme-browser';
if ( ! empty( $_GET['search'] ) ) {
$class_name .= ' search-loading';
}
?>
<div class="<?php echo esc_attr( $class_name ); ?>">
<div class="themes wp-clearfix">
<?php
/*
* This PHP is synchronized with the tmpl-theme template below!
*/
foreach ( $themes as $theme ) :
$aria_action = $theme['id'] . '-action';
$aria_name = $theme['id'] . '-name';
$active_class = '';
if ( $theme['active'] ) {
$active_class = ' active';
}
?>
<div class="theme<?php echo $active_class; ?>">
<?php if ( ! empty( $theme['screenshot'][0] ) ) { ?>
<div class="theme-screenshot">
<img src="<?php echo esc_url( $theme['screenshot'][0] . '?ver=' . $theme['version'] ); ?>" alt="" />
</div>
<?php } else { ?>
<div class="theme-screenshot blank"></div>
<?php } ?>
<?php if ( $theme['hasUpdate'] ) : ?>
<?php
if ( $theme['updateResponse']['compatibleWP'] && $theme['updateResponse']['compatiblePHP'] ) :
if ( $theme['hasPackage'] ) {
$new_version_available = __( 'New version available. <button class="button-link" type="button">Update now</button>' );
} else {
$new_version_available = __( 'New version available.' );
}
wp_admin_notice(
$new_version_available,
array(
'type' => 'warning',
'additional_classes' => array( 'notice-alt', 'inline', 'update-message' ),
)
);
else :
$theme_update_error = '';
if ( ! $theme['updateResponse']['compatibleWP'] && ! $theme['updateResponse']['compatiblePHP'] ) {
$theme_update_error .= sprintf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
$theme['name']
);
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
$theme_update_error .= 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>', false );
} elseif ( current_user_can( 'update_core' ) ) {
$theme_update_error .= sprintf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
$theme_update_error .= sprintf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>', false );
}
} elseif ( ! $theme['updateResponse']['compatibleWP'] ) {
$theme_update_error .= sprintf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
$theme['name']
);
if ( current_user_can( 'update_core' ) ) {
$theme_update_error .= sprintf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
} elseif ( ! $theme['updateResponse']['compatiblePHP'] ) {
$theme_update_error .= sprintf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
$theme['name']
);
if ( current_user_can( 'update_php' ) ) {
$theme_update_error .= sprintf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>', false );
}
}
wp_admin_notice(
$theme_update_error,
array(
'type' => 'error',
'additional_classes' => array( 'notice-alt', 'inline', 'update-message' ),
)
);
endif;
endif;
if ( ! $theme['compatibleWP'] || ! $theme['compatiblePHP'] ) {
$message = '';
if ( ! $theme['compatibleWP'] && ! $theme['compatiblePHP'] ) {
$message = __( 'This theme does not work with your versions of WordPress and PHP.' );
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
$message .= 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
$message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
} elseif ( current_user_can( 'update_core' ) ) {
$message .= sprintf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
$message .= sprintf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
$message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
}
} elseif ( ! $theme['compatibleWP'] ) {
$message .= __( 'This theme does not work with your version of WordPress.' );
if ( current_user_can( 'update_core' ) ) {
$message .= sprintf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
} elseif ( ! $theme['compatiblePHP'] ) {
$message .= __( 'This theme does not work with your version of PHP.' );
if ( current_user_can( 'update_php' ) ) {
$message .= sprintf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
$message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
}
}
wp_admin_notice(
$message,
array(
'type' => 'error',
'additional_classes' => array( 'inline', 'notice-alt' ),
)
);
}
/* translators: %s: Theme name. */
$details_aria_label = sprintf( _x( 'View Theme Details for %s', 'theme' ), $theme['name'] );
?>
<button type="button" class="more-details" id="<?php echo esc_attr( $aria_action ); ?>"
aria-label="<?php echo esc_attr( $details_aria_label ); ?>"
><?php _e( 'Theme Details' ); ?></button>
<div class="theme-author">
<?php
/* translators: %s: Theme author name. */
printf( __( 'By %s' ), $theme['author'] );
?>
</div>
<div class="theme-id-container">
<?php if ( $theme['active'] ) { ?>
<h2 class="theme-name" id="<?php echo esc_attr( $aria_name ); ?>">
<span><?php _ex( 'Active:', 'theme' ); ?></span> <?php echo $theme['name']; ?>
</h2>
<?php } else { ?>
<h2 class="theme-name" id="<?php echo esc_attr( $aria_name ); ?>"><?php echo $theme['name']; ?></h2>
<?php } ?>
<div class="theme-actions">
<?php if ( $theme['active'] ) { ?>
<?php
if ( $theme['actions']['customize'] && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
/* translators: %s: Theme name. */
$customize_aria_label = sprintf( _x( 'Customize %s', 'theme' ), $theme['name'] );
?>
<a class="button button-primary customize load-customize hide-if-no-customize"
href="<?php echo esc_url( $theme['actions']['customize'] ); ?>"
aria-label="<?php echo esc_attr( $customize_aria_label ); ?>"
><?php _e( 'Customize' ); ?></a>
<?php } ?>
<?php } elseif ( $theme['compatibleWP'] && $theme['compatiblePHP'] ) { ?>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button activate"
href="<?php echo esc_url( $theme['actions']['activate'] ); ?>"
aria-label="<?php echo esc_attr( $aria_label ); ?>"
><?php _e( 'Activate' ); ?></a>
<?php
// Only classic themes require the "customize" capability.
if ( current_user_can( 'edit_theme_options' ) && ( $theme['blockTheme'] || current_user_can( 'customize' ) ) ) {
/* translators: %s: Theme name. */
$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary load-customize hide-if-no-customize"
href="<?php echo esc_url( $theme['actions']['customize'] ); ?>"
aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>"
><?php _e( 'Live Preview' ); ?></a>
<?php } ?>
<?php } else { ?>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button disabled"
aria-label="<?php echo esc_attr( $aria_label ); ?>"
><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
<?php
if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
/* translators: %s: Theme name. */
$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary hide-if-no-customize disabled"
aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>"
><?php _e( 'Live Preview' ); ?></a>
<?php } ?>
<?php } ?>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<div class="theme-overlay" tabindex="0" role="dialog" aria-label="<?php esc_attr_e( 'Theme Details' ); ?>"></div>
<p class="no-themes"><?php _e( 'No themes found. Try a different search.' ); ?></p>
<?php
// List broken themes, if any.
$broken_themes = wp_get_themes( array( 'errors' => true ) );
if ( ! is_multisite() && $broken_themes ) {
?>
<div class="broken-themes">
<h3><?php _e( 'Broken Themes' ); ?></h3>
<p><?php _e( 'The following themes are installed but incomplete.' ); ?></p>
<?php
$can_resume = current_user_can( 'resume_themes' );
$can_delete = current_user_can( 'delete_themes' );
$can_install = current_user_can( 'install_themes' );
?>
<table>
<tr>
<th><?php _ex( 'Name', 'theme name' ); ?></th>
<th><?php _e( 'Description' ); ?></th>
<?php if ( $can_resume ) { ?>
<td></td>
<?php } ?>
<?php if ( $can_delete ) { ?>
<td></td>
<?php } ?>
<?php if ( $can_install ) { ?>
<td></td>
<?php } ?>
</tr>
<?php
foreach ( $broken_themes as $broken_theme ) :
?>
<tr>
<td><?php echo $broken_theme->get( 'Name' ) ? $broken_theme->display( 'Name' ) : esc_html( $broken_theme->get_stylesheet() ); ?></td>
<td><?php echo $broken_theme->errors()->get_error_message(); ?></td>
<?php
if ( $can_resume ) {
if ( 'theme_paused' === $broken_theme->errors()->get_error_code() ) {
$stylesheet = $broken_theme->get_stylesheet();
$resume_url = add_query_arg(
array(
'action' => 'resume',
'stylesheet' => urlencode( $stylesheet ),
),
admin_url( 'themes.php' )
);
$resume_url = wp_nonce_url( $resume_url, 'resume-theme_' . $stylesheet );
?>
<td><a href="<?php echo esc_url( $resume_url ); ?>" class="button resume-theme"><?php _e( 'Resume' ); ?></a></td>
<?php
} else {
?>
<td></td>
<?php
}
}
if ( $can_delete ) {
$stylesheet = $broken_theme->get_stylesheet();
$delete_url = add_query_arg(
array(
'action' => 'delete',
'stylesheet' => urlencode( $stylesheet ),
),
admin_url( 'themes.php' )
);
$delete_url = wp_nonce_url( $delete_url, 'delete-theme_' . $stylesheet );
?>
<td><a href="<?php echo esc_url( $delete_url ); ?>" class="button delete-theme"><?php _e( 'Delete' ); ?></a></td>
<?php
}
if ( $can_install && 'theme_no_parent' === $broken_theme->errors()->get_error_code() ) {
$parent_theme_name = $broken_theme->get( 'Template' );
$parent_theme = themes_api( 'theme_information', array( 'slug' => urlencode( $parent_theme_name ) ) );
if ( ! is_wp_error( $parent_theme ) ) {
$install_url = add_query_arg(
array(
'action' => 'install-theme',
'theme' => urlencode( $parent_theme_name ),
),
admin_url( 'update.php' )
);
$install_url = wp_nonce_url( $install_url, 'install-theme_' . $parent_theme_name );
?>
<td><a href="<?php echo esc_url( $install_url ); ?>" class="button install-theme"><?php _e( 'Install Parent Theme' ); ?></a></td>
<?php
}
}
?>
</tr>
<?php
endforeach;
?>
</table>
</div>
<?php
}
?>
</div><!-- .wrap -->
<?php
/**
* Returns the JavaScript template used to display the auto-update setting for a theme.
*
* @since 5.5.0
*
* @return string The template for displaying the auto-update setting link.
*/
function wp_theme_auto_update_setting_template() {
$notice = wp_get_admin_notice(
'',
array(
'type' => 'error',
'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ),
)
);
$template = '
<div class="theme-autoupdate">
<# if ( data.autoupdate.supported ) { #>
<# if ( data.autoupdate.forced === false ) { #>
' . __( 'Auto-updates disabled' ) . '
<# } else if ( data.autoupdate.forced ) { #>
' . __( 'Auto-updates enabled' ) . '
<# } else if ( data.autoupdate.enabled ) { #>
<button type="button" class="toggle-auto-update button-link" data-slug="{{ data.id }}" data-wp-action="disable">
<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span><span class="label">' . __( 'Disable auto-updates' ) . '</span>
</button>
<# } else { #>
<button type="button" class="toggle-auto-update button-link" data-slug="{{ data.id }}" data-wp-action="enable">
<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span><span class="label">' . __( 'Enable auto-updates' ) . '</span>
</button>
<# } #>
<# } #>
<# if ( data.hasUpdate ) { #>
<# if ( data.autoupdate.supported && data.autoupdate.enabled ) { #>
<span class="auto-update-time">
<# } else { #>
<span class="auto-update-time hidden">
<# } #>
<br />' . wp_get_auto_update_message() . '</span>
<# } #>
' . $notice . '
</div>
';
/**
* Filters the JavaScript template used to display the auto-update setting for a theme (in the overlay).
*
* See {@see wp_prepare_themes_for_js()} for the properties of the `data` object.
*
* @since 5.5.0
*
* @param string $template The template for displaying the auto-update setting link.
*/
return apply_filters( 'theme_auto_update_setting_template', $template );
}
/*
* The tmpl-theme template is synchronized with PHP above!
*/
?>
<script id="tmpl-theme" type="text/template">
<# if ( data.screenshot[0] ) { #>
<div class="theme-screenshot">
<img src="{{ data.screenshot[0] }}?ver={{ data.version }}" alt="" />
</div>
<# } else { #>
<div class="theme-screenshot blank"></div>
<# } #>
<# if ( data.hasUpdate ) { #>
<# if ( data.updateResponse.compatibleWP && data.updateResponse.compatiblePHP ) { #>
<div class="update-message notice inline notice-warning notice-alt"><p>
<# if ( data.hasPackage ) { #>
<?php _e( 'New version available. <button class="button-link" type="button">Update now</button>' ); ?>
<# } else { #>
<?php _e( 'New version available.' ); ?>
<# } #>
</p></div>
<# } else { #>
<div class="update-message notice inline notice-error notice-alt"><p>
<# if ( ! data.updateResponse.compatibleWP && ! data.updateResponse.compatiblePHP ) { #>
<?php
printf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
'{{{ data.name }}}'
);
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
printf(
/* 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
} elseif ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } else if ( ! data.updateResponse.compatibleWP ) { #>
<?php
printf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
'{{{ data.name }}}'
);
if ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
?>
<# } else if ( ! data.updateResponse.compatiblePHP ) { #>
<?php
printf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
'{{{ data.name }}}'
);
if ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } #>
</p></div>
<# } #>
<# } #>
<# if ( ! data.compatibleWP || ! data.compatiblePHP ) { #>
<div class="notice notice-error notice-alt"><p>
<# if ( ! data.compatibleWP && ! data.compatiblePHP ) { #>
<?php
_e( 'This theme does not work with your versions of WordPress and PHP.' );
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
printf(
/* 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
} elseif ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } else if ( ! data.compatibleWP ) { #>
<?php
_e( 'This theme does not work with your version of WordPress.' );
if ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
?>
<# } else if ( ! data.compatiblePHP ) { #>
<?php
_e( 'This theme does not work with your version of PHP.' );
if ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } #>
</p></div>
<# } #>
<?php
/* translators: %s: Theme name. */
$details_aria_label = sprintf( _x( 'View Theme Details for %s', 'theme' ), '{{ data.name }}' );
?>
<button type="button" class="more-details" id="{{ data.id }}-action"
aria-label="<?php echo esc_attr( $details_aria_label ); ?>"
><?php _e( 'Theme Details' ); ?></button>
<div class="theme-author">
<?php
/* translators: %s: Theme author name. */
printf( __( 'By %s' ), '{{{ data.author }}}' );
?>
</div>
<div class="theme-id-container">
<# if ( data.active ) { #>
<h2 class="theme-name" id="{{ data.id }}-name">
<span><?php _ex( 'Active:', 'theme' ); ?></span> {{{ data.name }}}
</h2>
<# } else { #>
<h2 class="theme-name" id="{{ data.id }}-name">{{{ data.name }}}</h2>
<# } #>
<div class="theme-actions">
<# if ( data.active ) { #>
<# if ( data.actions.customize ) { #>
<?php
/* translators: %s: Theme name. */
$customize_aria_label = sprintf( _x( 'Customize %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary customize load-customize hide-if-no-customize"
href="{{{ data.actions.customize }}}"
aria-label="<?php echo esc_attr( $customize_aria_label ); ?>"
><?php _e( 'Customize' ); ?></a>
<# } #>
<# } else { #>
<# if ( data.compatibleWP && data.compatiblePHP ) { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button activate"
href="{{{ data.actions.activate }}}"
aria-label="<?php echo esc_attr( $aria_label ); ?>"
><?php _e( 'Activate' ); ?></a>
<?php
/* translators: %s: Theme name. */
$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary load-customize hide-if-no-customize"
href="{{{ data.actions.customize }}}"
aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>"
><?php _e( 'Live Preview' ); ?></a>
<# } else { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button disabled"
aria-label="<?php echo esc_attr( $aria_label ); ?>"
><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
<?php
/* translators: %s: Theme name. */
$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary hide-if-no-customize disabled"
aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>"
><?php _e( 'Live Preview' ); ?></a>
<# } #>
<# } #>
</div>
</div>
</script>
<script id="tmpl-theme-single" type="text/template">
<div class="theme-backdrop"></div>
<div class="theme-wrap wp-clearfix" role="document">
<div class="theme-header">
<button class="left dashicons dashicons-no"><span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e( 'Show previous theme' );
?>
</span></button>
<button class="right dashicons dashicons-no"><span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e( 'Show next theme' );
?>
</span></button>
<button class="close dashicons dashicons-no"><span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e( 'Close details dialog' );
?>
</span></button>
</div>
<div class="theme-about wp-clearfix">
<div class="theme-screenshots">
<# if ( data.screenshot[0] ) { #>
<div class="screenshot"><img src="{{ data.screenshot[0] }}?ver={{ data.version }}" alt="" /></div>
<# } else { #>
<div class="screenshot blank"></div>
<# } #>
</div>
<div class="theme-info">
<# if ( data.active ) { #>
<span class="current-label"><?php _e( 'Active Theme' ); ?></span>
<# } #>
<h2 class="theme-name">{{{ data.name }}}<span class="theme-version">
<?php
/* translators: %s: Theme version. */
printf( __( 'Version: %s' ), '{{ data.version }}' );
?>
</span></h2>
<p class="theme-author">
<?php
/* translators: %s: Theme author link. */
printf( __( 'By %s' ), '{{{ data.authorAndUri }}}' );
?>
</p>
<# if ( ! data.compatibleWP || ! data.compatiblePHP ) { #>
<div class="notice notice-error notice-alt notice-large"><p>
<# if ( ! data.compatibleWP && ! data.compatiblePHP ) { #>
<?php
_e( 'This theme does not work with your versions of WordPress and PHP.' );
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
printf(
/* 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
} elseif ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } else if ( ! data.compatibleWP ) { #>
<?php
_e( 'This theme does not work with your version of WordPress.' );
if ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
?>
<# } else if ( ! data.compatiblePHP ) { #>
<?php
_e( 'This theme does not work with your version of PHP.' );
if ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } #>
</p></div>
<# } #>
<# if ( data.hasUpdate ) { #>
<# if ( data.updateResponse.compatibleWP && data.updateResponse.compatiblePHP ) { #>
<div class="notice notice-warning notice-alt notice-large">
<h3 class="notice-title"><?php _e( 'Update Available' ); ?></h3>
{{{ data.update }}}
</div>
<# } else { #>
<div class="notice notice-error notice-alt notice-large">
<h3 class="notice-title"><?php _e( 'Update Incompatible' ); ?></h3>
<p>
<# if ( ! data.updateResponse.compatibleWP && ! data.updateResponse.compatiblePHP ) { #>
<?php
printf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
'{{{ data.name }}}'
);
if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
printf(
/* 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>.' ),
self_admin_url( 'update-core.php' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
} elseif ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
} elseif ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } else if ( ! data.updateResponse.compatibleWP ) { #>
<?php
printf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
'{{{ data.name }}}'
);
if ( current_user_can( 'update_core' ) ) {
printf(
/* translators: %s: URL to WordPress Updates screen. */
' ' . __( '<a href="%s">Please update WordPress</a>.' ),
self_admin_url( 'update-core.php' )
);
}
?>
<# } else if ( ! data.updateResponse.compatiblePHP ) { #>
<?php
printf(
/* translators: %s: Theme name. */
__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
'{{{ data.name }}}'
);
if ( current_user_can( 'update_php' ) ) {
printf(
/* translators: %s: URL to Update PHP page. */
' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
esc_url( wp_get_update_php_url() )
);
wp_update_php_annotation( '</p><p><em>', '</em>' );
}
?>
<# } #>
</p>
</div>
<# } #>
<# } #>
<# if ( data.actions.autoupdate ) { #>
<?php echo wp_theme_auto_update_setting_template(); ?>
<# } #>
<p class="theme-description">{{{ data.description }}}</p>
<# if ( data.parent ) { #>
<p class="parent-theme">
<?php
/* translators: %s: Theme name. */
printf( __( 'This is a child theme of %s.' ), '<strong>{{{ data.parent }}}</strong>' );
?>
</p>
<# } #>
<# if ( data.tags ) { #>
<p class="theme-tags"><span><?php _e( 'Tags:' ); ?></span> {{{ data.tags }}}</p>
<# } #>
</div>
</div>
<div class="theme-actions">
<div class="active-theme">
<a class="button button-primary customize load-customize hide-if-no-customize"
href="{{{ data.actions.customize }}}"
><?php _e( 'Customize' ); ?></a>
<?php echo implode( ' ', $current_theme_actions ); ?>
</div>
<div class="inactive-theme">
<# if ( data.compatibleWP && data.compatiblePHP ) { #>
<?php
/* translators: %s: Theme name. */
$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary load-customize hide-if-no-customize"
href="{{{ data.actions.customize }}}"
aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>"
><?php _e( 'Live Preview' ); ?></a>
<# if ( data.actions.activate ) { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button activate"
href="{{{ data.actions.activate }}}"
aria-label="<?php echo esc_attr( $aria_label ); ?>"
><?php _e( 'Activate' ); ?></a>
<# } #>
<# } else { #>
<?php
/* translators: %s: Theme name. */
$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button button-primary hide-if-no-customize disabled"
aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>"
><?php _e( 'Live Preview' ); ?></a>
<# if ( data.actions.activate ) { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button disabled"
aria-label="<?php echo esc_attr( $aria_label ); ?>"
><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
<# } #>
<# } #>
</div>
<# if ( ! data.active && data.actions['delete'] ) { #>
<?php
/* translators: %s: Theme name. */
$aria_label = sprintf( _x( 'Delete %s', 'theme' ), '{{ data.name }}' );
?>
<a class="button delete-theme"
href="{{{ data.actions['delete'] }}}"
aria-label="<?php echo esc_attr( $aria_label ); ?>"
><?php _e( 'Delete' ); ?></a>
<# } #>
</div>
</div>
</script>
<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();
wp_print_update_row_templates();
wp_localize_script(
'updates',
'_wpUpdatesItemCounts',
array(
'totals' => wp_get_update_data(),
)
);
require_once ABSPATH . 'wp-admin/admin-footer.php';
admin-header.php 0000644 00000022170 15222337115 0007576 0 ustar 00 <?php
/**
* WordPress Administration Template Header
*
* @package WordPress
* @subpackage Administration
*/
// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );
if ( ! defined( 'WP_ADMIN' ) ) {
require_once __DIR__ . '/admin.php';
}
/**
* In case admin-header.php is included in a function.
*
* @global string $title The title of the current screen.
* @global string $hook_suffix
* @global WP_Screen $current_screen WordPress current screen object.
* @global WP_Locale $wp_locale WordPress date and time locale object.
* @global string $pagenow The filename of the current screen.
* @global string $update_title
* @global int $total_update_count
* @global string $parent_file
* @global string $typenow The post type of the current screen.
*/
global $title, $hook_suffix, $current_screen, $wp_locale, $pagenow,
$update_title, $total_update_count, $parent_file, $typenow;
// Catch plugins that include admin-header.php before admin.php completes.
if ( empty( $current_screen ) ) {
set_current_screen();
}
get_admin_page_title();
$title = strip_tags( $title );
if ( is_network_admin() ) {
/* translators: Network admin screen title. %s: Network title. */
$admin_title = sprintf( __( 'Network Admin: %s' ), get_network()->site_name );
} elseif ( is_user_admin() ) {
/* translators: User dashboard screen title. %s: Network title. */
$admin_title = sprintf( __( 'User Dashboard: %s' ), get_network()->site_name );
} else {
$admin_title = get_bloginfo( 'name' );
}
if ( $admin_title === $title ) {
/* translators: Admin screen title. %s: Admin screen name. */
$admin_title = sprintf( __( '%s — WordPress' ), $title );
} else {
$screen_title = $title;
if ( 'post' === $current_screen->base && 'add' !== $current_screen->action ) {
$post_title = get_the_title();
if ( ! empty( $post_title ) ) {
$post_type_obj = get_post_type_object( $typenow );
$screen_title = sprintf(
/* translators: Editor admin screen title. 1: "Edit item" text for the post type, 2: Post title. */
__( '%1$s “%2$s”' ),
$post_type_obj->labels->edit_item,
$post_title
);
}
}
/* translators: Admin screen title. 1: Admin screen name, 2: Network or site name. */
$admin_title = sprintf( __( '%1$s ‹ %2$s — WordPress' ), $screen_title, $admin_title );
}
if ( wp_is_recovery_mode() ) {
/* translators: %s: Admin screen title. */
$admin_title = sprintf( __( 'Recovery Mode — %s' ), $admin_title );
}
/**
* Filters the title tag content for an admin page.
*
* @since 3.1.0
*
* @param string $admin_title The page title, with extra context added.
* @param string $title The original page title.
*/
$admin_title = apply_filters( 'admin_title', $admin_title, $title );
wp_user_settings();
_wp_admin_html_begin();
?>
<title><?php echo esc_html( $admin_title ); ?></title>
<?php
wp_enqueue_style( 'colors' );
wp_enqueue_script( 'utils' );
wp_enqueue_script( 'svg-painter' );
$admin_body_class = preg_replace( '/[^a-z0-9_-]+/i', '-', $hook_suffix );
?>
<script type="text/javascript">
addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(function(){func();});else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>',
pagenow = '<?php echo esc_js( $current_screen->id ); ?>',
typenow = '<?php echo esc_js( $current_screen->post_type ); ?>',
adminpage = '<?php echo esc_js( $admin_body_class ); ?>',
thousandsSeparator = '<?php echo esc_js( $wp_locale->number_format['thousands_sep'] ); ?>',
decimalPoint = '<?php echo esc_js( $wp_locale->number_format['decimal_point'] ); ?>',
isRtl = <?php echo (int) is_rtl(); ?>;
</script>
<?php
/**
* Fires when enqueuing scripts for all admin pages.
*
* @since 2.8.0
*
* @param string $hook_suffix The current admin page.
*/
do_action( 'admin_enqueue_scripts', $hook_suffix );
/**
* Fires when styles are printed for a specific admin page based on $hook_suffix.
*
* @since 2.6.0
*/
do_action( "admin_print_styles-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/**
* Fires when styles are printed for all admin pages.
*
* @since 2.6.0
*/
do_action( 'admin_print_styles' );
/**
* Fires when scripts are printed for a specific admin page based on $hook_suffix.
*
* @since 2.1.0
*/
do_action( "admin_print_scripts-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/**
* Fires when scripts are printed for all admin pages.
*
* @since 2.1.0
*/
do_action( 'admin_print_scripts' );
/**
* Fires in head section for a specific admin page.
*
* The dynamic portion of the hook name, `$hook_suffix`, refers to the hook suffix
* for the admin page.
*
* @since 2.1.0
*/
do_action( "admin_head-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/**
* Fires in head section for all admin pages.
*
* @since 2.1.0
*/
do_action( 'admin_head' );
if ( 'f' === get_user_setting( 'mfold' ) ) {
$admin_body_class .= ' folded';
}
if ( ! get_user_setting( 'unfold' ) ) {
$admin_body_class .= ' auto-fold';
}
if ( is_admin_bar_showing() ) {
$admin_body_class .= ' admin-bar';
}
if ( is_rtl() ) {
$admin_body_class .= ' rtl';
}
if ( $current_screen->post_type ) {
$admin_body_class .= ' post-type-' . $current_screen->post_type;
}
if ( $current_screen->taxonomy ) {
$admin_body_class .= ' taxonomy-' . $current_screen->taxonomy;
}
$admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', (float) get_bloginfo( 'version' ) );
$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', get_bloginfo( 'version' ) ) );
$admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' );
$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );
if ( wp_is_mobile() ) {
$admin_body_class .= ' mobile';
}
if ( is_multisite() ) {
$admin_body_class .= ' multisite';
}
if ( is_network_admin() ) {
$admin_body_class .= ' network-admin';
}
$admin_body_class .= ' no-customize-support svg';
if ( $current_screen->is_block_editor() ) {
$admin_body_class .= ' block-editor-page wp-embed-responsive';
}
$admin_body_class .= ' wp-theme-' . sanitize_html_class( get_template() );
if ( is_child_theme() ) {
$admin_body_class .= ' wp-child-theme-' . sanitize_html_class( get_stylesheet() );
}
$error_get_last = error_get_last();
// Print a CSS class to make PHP errors visible.
if ( $error_get_last && WP_DEBUG && WP_DEBUG_DISPLAY && ini_get( 'display_errors' )
// Don't print the class for PHP notices in wp-config.php, as they happen before WP_DEBUG takes effect,
// and should not be displayed with the `error_reporting` level previously set in wp-load.php.
&& ( E_NOTICE !== $error_get_last['type'] || 'wp-config.php' !== wp_basename( $error_get_last['file'] ) )
) {
$admin_body_class .= ' php-error';
}
unset( $error_get_last );
?>
</head>
<?php
/**
* Filters the CSS classes for the body tag in the admin.
*
* This filter differs from the {@see 'post_class'} and {@see 'body_class'} filters
* in two important ways:
*
* 1. `$classes` is a space-separated string of class names instead of an array.
* 2. Not all core admin classes are filterable, notably: wp-admin, wp-core-ui,
* and no-js cannot be removed.
*
* @since 2.3.0
*
* @param string $classes Space-separated list of CSS classes.
*/
$admin_body_classes = apply_filters( 'admin_body_class', '' );
$admin_body_classes = ltrim( $admin_body_classes . ' ' . $admin_body_class );
?>
<body class="wp-admin wp-core-ui no-js <?php echo esc_attr( $admin_body_classes ); ?>">
<script type="text/javascript">
document.body.className = document.body.className.replace('no-js','js');
</script>
<?php
// Make sure the customize body classes are correct as early as possible.
if ( current_user_can( 'customize' ) ) {
wp_customize_support_script();
}
?>
<div id="wpwrap">
<?php require ABSPATH . 'wp-admin/menu-header.php'; ?>
<div id="wpcontent">
<?php
/**
* Fires at the beginning of the content section in an admin page.
*
* @since 3.0.0
*/
do_action( 'in_admin_header' );
?>
<div id="wpbody" role="main">
<?php
unset( $blog_name, $total_update_count, $update_title );
$current_screen->set_parentage( $parent_file );
?>
<div id="wpbody-content">
<?php
$current_screen->render_screen_meta();
if ( is_network_admin() ) {
/**
* Prints network admin screen notices.
*
* @since 3.1.0
*/
do_action( 'network_admin_notices' );
} elseif ( is_user_admin() ) {
/**
* Prints user admin screen notices.
*
* @since 3.1.0
*/
do_action( 'user_admin_notices' );
} else {
/**
* Prints admin screen notices.
*
* @since 3.1.0
*/
do_action( 'admin_notices' );
}
/**
* Prints generic admin screen notices.
*
* @since 3.1.0
*/
do_action( 'all_admin_notices' );
if ( 'options-general.php' === $parent_file ) {
require ABSPATH . 'wp-admin/options-head.php';
}
link-manager.php 0000644 00000010411 15222337115 0007620 0 ustar 00 <?php
/**
* Link Management 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 edit the links for this site.' ) );
}
$wp_list_table = _get_list_table( 'WP_Links_List_Table' );
// Handle bulk deletes.
$doaction = $wp_list_table->current_action();
if ( $doaction && isset( $_REQUEST['linkcheck'] ) ) {
check_admin_referer( 'bulk-bookmarks' );
$redirect_to = admin_url( 'link-manager.php' );
$bulklinks = (array) $_REQUEST['linkcheck'];
if ( 'delete' === $doaction ) {
foreach ( $bulklinks as $link_id ) {
$link_id = (int) $link_id;
wp_delete_link( $link_id );
}
$redirect_to = add_query_arg( 'deleted', count( $bulklinks ), $redirect_to );
} else {
$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, $bulklinks ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
}
wp_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();
// Used in the HTML title tag.
$title = __( 'Links' );
$this_file = 'link-manager.php';
$parent_file = $this_file;
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'<p>' . sprintf(
/* translators: %s: URL to Widgets screen. */
__( 'You can add links here to be displayed on your site, usually using <a href="%s">Widgets</a>. By default, links to several sites in the WordPress community are included as examples.' ),
'widgets.php'
) . '</p>' .
'<p>' . __( 'Links may be separated into Link Categories; these are different than the categories used on your posts.' ) . '</p>' .
'<p>' . __( 'You can customize the display of this screen using the Screen Options tab and/or the dropdown filters above the links table.' ) . '</p>',
)
);
get_current_screen()->add_help_tab(
array(
'id' => 'deleting-links',
'title' => __( 'Deleting Links' ),
'content' =>
'<p>' . __( 'If you delete a link, it will be removed permanently, as Links do not have a Trash function yet.' ) . '</p>',
)
);
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://codex.wordpress.org/Links_Screen">Documentation on Managing Links</a>' ) . '</p>' .
'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);
get_current_screen()->set_screen_reader_content(
array(
'heading_list' => __( 'Links list' ),
)
);
require_once ABSPATH . 'wp-admin/admin-header.php';
if ( ! current_user_can( 'manage_links' ) ) {
wp_die( __( 'Sorry, you are not allowed to edit the links for this site.' ) );
}
?>
<div class="wrap nosubsub">
<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>
<?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
if ( isset( $_REQUEST['deleted'] ) ) {
$deleted = (int) $_REQUEST['deleted'];
/* translators: %s: Number of links. */
$deleted_message = sprintf( _n( '%s link deleted.', '%s links deleted.', $deleted ), $deleted );
wp_admin_notice(
$deleted_message,
array(
'id' => 'message',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'deleted' ), $_SERVER['REQUEST_URI'] );
}
?>
<form id="posts-filter" method="get">
<?php $wp_list_table->search_box( __( 'Search Links' ), 'link' ); ?>
<?php $wp_list_table->display(); ?>
<div id="ajax-response"></div>
</form>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
options-permalink.php 0000644 00000052336 15222337115 0010742 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>
<?php $permalink_structure_title = __( 'Permalink structure' ); ?>
<tr>
<th scope="row"><?php echo $permalink_structure_title; ?></th>
<td>
<fieldset class="structure-selection">
<legend class="screen-reader-text"><?php echo $permalink_structure_title; ?></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'; ?>
load-scripts.php 0000644 00000004026 15222337115 0007664 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' );
$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;
}
require ABSPATH . 'wp-admin/includes/noop.php';
require ABSPATH . WPINC . '/script-loader.php';
require ABSPATH . WPINC . '/version.php';
$expires_offset = 31536000; // 1 year.
$out = '';
$wp_scripts = new WP_Scripts();
wp_default_scripts( $wp_scripts );
wp_default_packages_vendor( $wp_scripts );
wp_default_packages_scripts( $wp_scripts );
$etag = $wp_scripts->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_scripts->registered ) ) {
continue;
}
$path = ABSPATH . $wp_scripts->registered[ $handle ]->src;
$out .= get_file( $path ) . "\n";
}
header( "Etag: $etag" );
header( 'Content-Type: application/javascript; 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;
admin-post.php 0000644 00000003745 15222337115 0007342 0 ustar 00 <?php
/**
* WordPress Generic Request (POST/GET) Handler
*
* Intended for form submission handling in themes and plugins.
*
* @package WordPress
* @subpackage Administration
*/
/** We are located in WordPress Administration Screens */
if ( ! defined( 'WP_ADMIN' ) ) {
define( 'WP_ADMIN', true );
}
/** Load WordPress Bootstrap */
require_once dirname( __DIR__ ) . '/wp-load.php';
/** Allow for cross-domain requests (from the front end). */
send_origin_headers();
require_once ABSPATH . 'wp-admin/includes/admin.php';
nocache_headers();
/** This action is documented in wp-admin/admin.php */
do_action( 'admin_init' );
$action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : '';
// Reject invalid parameters.
if ( ! is_scalar( $action ) ) {
wp_die( '', 400 );
}
if ( ! is_user_logged_in() ) {
if ( empty( $action ) ) {
/**
* Fires on a non-authenticated admin post request where no action is supplied.
*
* @since 2.6.0
*/
do_action( 'admin_post_nopriv' );
} else {
// If no action is registered, return a Bad Request response.
if ( ! has_action( "admin_post_nopriv_{$action}" ) ) {
wp_die( '', 400 );
}
/**
* Fires on a non-authenticated admin post request for the given action.
*
* The dynamic portion of the hook name, `$action`, refers to the given
* request action.
*
* @since 2.6.0
*/
do_action( "admin_post_nopriv_{$action}" );
}
} else {
if ( empty( $action ) ) {
/**
* Fires on an authenticated admin post request where no action is supplied.
*
* @since 2.6.0
*/
do_action( 'admin_post' );
} else {
// If no action is registered, return a Bad Request response.
if ( ! has_action( "admin_post_{$action}" ) ) {
wp_die( '', 400 );
}
/**
* Fires on an authenticated admin post request for the given action.
*
* The dynamic portion of the hook name, `$action`, refers to the given
* request action.
*
* @since 2.6.0
*/
do_action( "admin_post_{$action}" );
}
}
ms-users.php 0000644 00000000327 15222337115 0007036 0 ustar 00 <?php
/**
* Multisite users administration panel.
*
* @package WordPress
* @subpackage Multisite
* @since 3.0.0
*/
require_once __DIR__ . '/admin.php';
wp_redirect( network_admin_url( 'users.php' ) );
exit;
media-new.php 0000644 00000006314 15222337115 0007130 0 ustar 00 <?php
/**
* Manage media uploaded file.
*
* There are many filters in here for media. Plugins can extend functionality
* by hooking into the filters.
*
* @package WordPress
* @subpackage Administration
*/
/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
if ( ! current_user_can( 'upload_files' ) ) {
wp_die( __( 'Sorry, you are not allowed to upload files.' ) );
}
wp_enqueue_script( 'plupload-handlers' );
$post_id = 0;
if ( isset( $_REQUEST['post_id'] ) ) {
$post_id = absint( $_REQUEST['post_id'] );
if ( ! get_post( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) {
$post_id = 0;
}
}
if ( $_POST ) {
if ( isset( $_POST['html-upload'] ) && ! empty( $_FILES ) ) {
check_admin_referer( 'media-form' );
// Upload File button was clicked.
$upload_id = media_handle_upload( 'async-upload', $post_id );
if ( is_wp_error( $upload_id ) ) {
wp_die( $upload_id );
}
}
wp_redirect( admin_url( 'upload.php' ) );
exit;
}
// Used in the HTML title tag.
$title = __( 'Upload New Media' );
$parent_file = 'upload.php';
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'<p>' . __( 'You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share. There are three options for uploading files:' ) . '</p>' .
'<ul>' .
'<li>' . __( '<strong>Drag and drop</strong> your files into the area below. Multiple files are allowed.' ) . '</li>' .
'<li>' . __( 'Clicking <strong>Select Files</strong> opens a navigation window showing you files in your operating system. Selecting <strong>Open</strong> after clicking on the file you want activates a progress bar on the uploader screen.' ) . '</li>' .
'<li>' . __( 'Revert to the <strong>Browser Uploader</strong> by clicking the link below the drag and drop box.' ) . '</li>' .
'</ul>',
)
);
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/media-add-new-screen/">Documentation on Uploading Media Files</a>' ) . '</p>' .
'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);
require_once ABSPATH . 'wp-admin/admin-header.php';
$form_class = 'wp-upload-form media-upload-form type-form validate';
if ( get_user_setting( 'uploader' ) || isset( $_GET['browser-uploader'] ) ) {
$form_class .= ' html-uploader';
}
?>
<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>
<form enctype="multipart/form-data" method="post" action="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="<?php echo esc_attr( $form_class ); ?>" id="file-form">
<?php media_upload_form(); ?>
<script type="text/javascript">
var post_id = <?php echo absint( $post_id ); ?>, shortform = 3;
</script>
<input type="hidden" name="post_id" id="post_id" value="<?php echo absint( $post_id ); ?>" />
<?php wp_nonce_field( 'media-form' ); ?>
<div id="media-items" class="hide-if-no-js"></div>
</form>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
user-new.php 0000644 00000060057 15222337115 0007033 0 ustar 00 <?php
/**
* New User Administration Screen.
*
* @package WordPress
* @subpackage Administration
*/
/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
if ( is_multisite() ) {
if ( ! current_user_can( 'create_users' ) && ! current_user_can( 'promote_users' ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to add users to this network.' ) . '</p>',
403
);
}
} elseif ( ! current_user_can( 'create_users' ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to create users.' ) . '</p>',
403
);
}
if ( is_multisite() ) {
add_filter( 'wpmu_signup_user_notification_email', 'admin_created_user_email' );
}
if ( isset( $_REQUEST['action'] ) && 'adduser' === $_REQUEST['action'] ) {
check_admin_referer( 'add-user', '_wpnonce_add-user' );
$user_details = null;
$user_email = wp_unslash( $_REQUEST['email'] );
if ( str_contains( $user_email, '@' ) ) {
$user_details = get_user_by( 'email', $user_email );
} else {
if ( current_user_can( 'manage_network_users' ) ) {
$user_details = get_user_by( 'login', $user_email );
} else {
wp_redirect( add_query_arg( array( 'update' => 'enter_email' ), 'user-new.php' ) );
die();
}
}
if ( ! $user_details ) {
wp_redirect( add_query_arg( array( 'update' => 'does_not_exist' ), 'user-new.php' ) );
die();
}
if ( ! current_user_can( 'promote_user', $user_details->ID ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to add users to this network.' ) . '</p>',
403
);
}
// Adding an existing user to this blog.
$new_user_email = array();
$redirect = 'user-new.php';
$username = $user_details->user_login;
$user_id = $user_details->ID;
if ( array_key_exists( $blog_id, get_blogs_of_user( $user_id ) ) ) {
$redirect = add_query_arg( array( 'update' => 'addexisting' ), 'user-new.php' );
} else {
if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) {
wp_ensure_editable_role( $_REQUEST['role'] );
$result = add_existing_user_to_blog(
array(
'user_id' => $user_id,
'role' => $_REQUEST['role'],
)
);
if ( ! is_wp_error( $result ) ) {
$redirect = add_query_arg(
array(
'update' => 'addnoconfirmation',
'user_id' => $user_id,
),
'user-new.php'
);
} else {
$redirect = add_query_arg( array( 'update' => 'could_not_add' ), 'user-new.php' );
}
} else {
$newuser_key = wp_generate_password( 20, false );
add_option(
'new_user_' . $newuser_key,
array(
'user_id' => $user_id,
'email' => $user_details->user_email,
'role' => $_REQUEST['role'],
)
);
$roles = get_editable_roles();
$role = $roles[ $_REQUEST['role'] ];
/**
* Fires immediately after an existing user is invited to join the site, but before the notification is sent.
*
* @since 4.4.0
*
* @param int $user_id The invited user's ID.
* @param array $role Array containing role information for the invited user.
* @param string $newuser_key The key of the invitation.
*/
do_action( 'invite_user', $user_id, $role, $newuser_key );
$switched_locale = switch_to_user_locale( $user_id );
if ( '' !== get_option( 'blogname' ) ) {
$site_title = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
} else {
$site_title = parse_url( home_url(), PHP_URL_HOST );
}
/* translators: 1: Site title, 2: Site URL, 3: User role, 4: Activation URL. */
$message = __(
'Hi,
You\'ve been invited to join \'%1$s\' at
%2$s with the role of %3$s.
Please click the following link to confirm the invite:
%4$s'
);
$new_user_email['to'] = $user_details->user_email;
$new_user_email['subject'] = sprintf(
/* translators: Joining confirmation notification email subject. %s: Site title. */
__( '[%s] Joining Confirmation' ),
$site_title
);
$new_user_email['message'] = sprintf(
$message,
get_option( 'blogname' ),
home_url(),
wp_specialchars_decode( translate_user_role( $role['name'] ) ),
home_url( "/newbloguser/$newuser_key/" )
);
$new_user_email['headers'] = '';
/**
* Filters the contents of the email sent when an existing user is invited to join the site.
*
* @since 5.6.0
*
* @param array $new_user_email {
* Used to build wp_mail().
*
* @type string $to The email address of the invited user.
* @type string $subject The subject of the email.
* @type string $message The content of the email.
* @type string $headers Headers.
* }
* @param int $user_id The invited user's ID.
* @param array $role Array containing role information for the invited user.
* @param string $newuser_key The key of the invitation.
*
*/
$new_user_email = apply_filters( 'invited_user_email', $new_user_email, $user_id, $role, $newuser_key );
wp_mail(
$new_user_email['to'],
$new_user_email['subject'],
$new_user_email['message'],
$new_user_email['headers']
);
if ( $switched_locale ) {
restore_previous_locale();
}
$redirect = add_query_arg( array( 'update' => 'add' ), 'user-new.php' );
}
}
wp_redirect( $redirect );
die();
} elseif ( isset( $_REQUEST['action'] ) && 'createuser' === $_REQUEST['action'] ) {
check_admin_referer( 'create-user', '_wpnonce_create-user' );
if ( ! current_user_can( 'create_users' ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to create users.' ) . '</p>',
403
);
}
if ( ! is_multisite() ) {
$user_id = edit_user();
if ( is_wp_error( $user_id ) ) {
$add_user_errors = $user_id;
} else {
if ( current_user_can( 'list_users' ) ) {
$redirect = 'users.php?update=add&id=' . $user_id;
} else {
$redirect = add_query_arg( 'update', 'add', 'user-new.php' );
}
wp_redirect( $redirect );
die();
}
} else {
// Adding a new user to this site.
$new_user_email = wp_unslash( $_REQUEST['email'] );
$user_details = wpmu_validate_user_signup( $_REQUEST['user_login'], $new_user_email );
if ( is_wp_error( $user_details['errors'] ) && $user_details['errors']->has_errors() ) {
$add_user_errors = $user_details['errors'];
} else {
/** This filter is documented in wp-includes/user.php */
$new_user_login = apply_filters( 'pre_user_login', sanitize_user( wp_unslash( $_REQUEST['user_login'] ), true ) );
if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) {
add_filter( 'wpmu_signup_user_notification', '__return_false' ); // Disable confirmation email.
add_filter( 'wpmu_welcome_user_notification', '__return_false' ); // Disable welcome email.
}
wp_ensure_editable_role( $_REQUEST['role'] );
wpmu_signup_user(
$new_user_login,
$new_user_email,
array(
'add_to_blog' => get_current_blog_id(),
'new_role' => $_REQUEST['role'],
)
);
if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) {
$key = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE user_login = %s AND user_email = %s", $new_user_login, $new_user_email ) );
$new_user = wpmu_activate_signup( $key );
if ( is_wp_error( $new_user ) ) {
$redirect = add_query_arg( array( 'update' => 'addnoconfirmation' ), 'user-new.php' );
} elseif ( ! is_user_member_of_blog( $new_user['user_id'] ) ) {
$redirect = add_query_arg( array( 'update' => 'created_could_not_add' ), 'user-new.php' );
} else {
$redirect = add_query_arg(
array(
'update' => 'addnoconfirmation',
'user_id' => $new_user['user_id'],
),
'user-new.php'
);
}
} else {
$redirect = add_query_arg( array( 'update' => 'newuserconfirmation' ), 'user-new.php' );
}
wp_redirect( $redirect );
die();
}
}
}
// Used in the HTML title tag.
$title = __( 'Add User' );
$parent_file = 'users.php';
$do_both = false;
if ( is_multisite() && current_user_can( 'promote_users' ) && current_user_can( 'create_users' ) ) {
$do_both = true;
}
$help = '<p>' . __( 'To add a new user to your site, fill in the form on this screen and click the Add User button at the bottom.' ) . '</p>';
if ( is_multisite() ) {
$help .= '<p>' . __( 'Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user’s name to Edit the user profile under Network Admin > All Users.' ) . '</p>' .
'<p>' . __( 'New users will receive an email letting them know they’ve been added as a user for your site. This email will also contain their password. Check the box if you do not want the user to receive a welcome email.' ) . '</p>';
} else {
$help .= '<p>' . __( 'New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added.' ) . '</p>' .
'<p>' . __( 'By default, new users will receive an email letting them know they’ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you do not want to send the new user a welcome email.' ) . '</p>';
}
$help .= '<p>' . __( 'Remember to click the Add User button at the bottom of this screen when you are finished.' ) . '</p>';
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' => $help,
)
);
get_current_screen()->add_help_tab(
array(
'id' => 'user-roles',
'title' => __( 'User Roles' ),
'content' => '<p>' . __( 'Here is a basic overview of the different user roles and the permissions associated with each one:' ) . '</p>' .
'<ul>' .
'<li>' . __( 'Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content.' ) . '</li>' .
'<li>' . __( 'Contributors can write and manage their posts but not publish posts or upload media files.' ) . '</li>' .
'<li>' . __( 'Authors can publish and manage their own posts, and are able to upload files.' ) . '</li>' .
'<li>' . __( 'Editors can publish posts, manage posts as well as manage other people’s posts, etc.' ) . '</li>' .
'<li>' . __( 'Administrators have access to all the administration features.' ) . '</li>' .
'</ul>',
)
);
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/users-add-new-screen/">Documentation on Adding New Users</a>' ) . '</p>' .
'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);
wp_enqueue_script( 'wp-ajax-response' );
wp_enqueue_script( 'user-profile' );
/**
* Filters whether to enable user auto-complete for non-super admins in Multisite.
*
* @since 3.4.0
*
* @param bool $enable Whether to enable auto-complete for non-super admins. Default false.
*/
if ( is_multisite() && current_user_can( 'promote_users' ) && ! wp_is_large_network( 'users' )
&& ( current_user_can( 'manage_network_users' ) || apply_filters( 'autocomplete_users_for_site_admins', false ) )
) {
wp_enqueue_script( 'user-suggest' );
}
require_once ABSPATH . 'wp-admin/admin-header.php';
if ( isset( $_GET['update'] ) ) {
$messages = array();
if ( is_multisite() ) {
$edit_link = '';
if ( ( isset( $_GET['user_id'] ) ) ) {
$user_id_new = absint( $_GET['user_id'] );
if ( $user_id_new ) {
$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_id_new ) ) );
}
}
switch ( $_GET['update'] ) {
case 'newuserconfirmation':
$messages[] = __( 'Invitation email sent to new user. A confirmation link must be clicked before their account is created.' );
break;
case 'add':
$messages[] = __( 'Invitation email sent to user. A confirmation link must be clicked for them to be added to your site.' );
break;
case 'addnoconfirmation':
$message = __( 'User has been added to your site.' );
if ( $edit_link ) {
$message .= sprintf( ' <a href="%s">%s</a>', $edit_link, __( 'Edit user' ) );
}
$messages[] = $message;
break;
case 'addexisting':
$messages[] = __( 'That user is already a member of this site.' );
break;
case 'could_not_add':
$add_user_errors = new WP_Error( 'could_not_add', __( 'That user could not be added to this site.' ) );
break;
case 'created_could_not_add':
$add_user_errors = new WP_Error( 'created_could_not_add', __( 'User has been created, but could not be added to this site.' ) );
break;
case 'does_not_exist':
$add_user_errors = new WP_Error( 'does_not_exist', __( 'The requested user does not exist.' ) );
break;
case 'enter_email':
$add_user_errors = new WP_Error( 'enter_email', __( 'Please enter a valid email address.' ) );
break;
}
} else {
if ( 'add' === $_GET['update'] ) {
$messages[] = __( 'User added.' );
}
}
}
?>
<div class="wrap">
<h1 id="add-new-user">
<?php
if ( current_user_can( 'create_users' ) ) {
_e( 'Add User' );
} elseif ( current_user_can( 'promote_users' ) ) {
_e( 'Add Existing User' );
}
?>
</h1>
<?php
if ( isset( $errors ) && is_wp_error( $errors ) ) :
$error_message = '';
foreach ( $errors->get_error_messages() as $err ) {
$error_message .= "<li>$err</li>\n";
}
wp_admin_notice(
'<ul>' . $error_message . '</ul>',
array(
'additional_classes' => array( 'error' ),
'paragraph_wrap' => false,
)
);
endif;
if ( ! empty( $messages ) ) {
foreach ( $messages as $msg ) {
wp_admin_notice(
$msg,
array(
'id' => 'message',
'additional_classes' => array( 'updated' ),
'dismissible' => true,
)
);
}
}
?>
<?php
if ( isset( $add_user_errors ) && is_wp_error( $add_user_errors ) ) :
$error_message = '';
foreach ( $add_user_errors->get_error_messages() as $message ) {
$error_message .= "<p>$message</p>\n";
}
wp_admin_notice(
$error_message,
array(
'additional_classes' => array( 'error' ),
'paragraph_wrap' => false,
)
);
endif;
?>
<div id="ajax-response"></div>
<?php
if ( is_multisite() && current_user_can( 'promote_users' ) ) {
if ( $do_both ) {
echo '<h2 id="add-existing-user">' . __( 'Add Existing User' ) . '</h2>';
}
if ( ! current_user_can( 'manage_network_users' ) ) {
echo '<p>' . __( 'Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '</p>';
$label = __( 'Email' );
$type = 'email';
} else {
echo '<p>' . __( 'Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '</p>';
$label = __( 'Email or Username' );
$type = 'text';
}
?>
<form method="post" name="adduser" id="adduser" class="validate" novalidate="novalidate"
<?php
/**
* Fires inside the adduser form tag.
*
* @since 3.0.0
*/
do_action( 'user_new_form_tag' );
?>
>
<input name="action" type="hidden" value="adduser" />
<?php wp_nonce_field( 'add-user', '_wpnonce_add-user' ); ?>
<table class="form-table" role="presentation">
<tr class="form-field form-required">
<th scope="row"><label for="adduser-email"><?php echo esc_html( $label ); ?></label></th>
<td><input name="email" type="<?php echo esc_attr( $type ); ?>" id="adduser-email" class="wp-suggest-user" value="" /></td>
</tr>
<tr class="form-field">
<th scope="row"><label for="adduser-role"><?php _e( 'Role' ); ?></label></th>
<td><select name="role" id="adduser-role">
<?php wp_dropdown_roles( get_option( 'default_role' ) ); ?>
</select>
</td>
</tr>
<?php if ( current_user_can( 'manage_network_users' ) ) { ?>
<tr>
<th scope="row"><?php _e( 'Skip Confirmation Email' ); ?></th>
<td>
<input type="checkbox" name="noconfirmation" id="adduser-noconfirmation" value="1" />
<label for="adduser-noconfirmation"><?php _e( 'Add the user without sending an email that requires their confirmation' ); ?></label>
</td>
</tr>
<?php } ?>
</table>
<?php
/**
* Fires at the end of the new user form.
*
* Passes a contextual string to make both types of new user forms
* uniquely targetable. Contexts are 'add-existing-user' (Multisite),
* and 'add-new-user' (single site and network admin).
*
* @since 3.7.0
*
* @param string $type A contextual string specifying which type of new user form the hook follows.
*/
do_action( 'user_new_form', 'add-existing-user' );
?>
<?php submit_button( __( 'Add Existing User' ), 'primary', 'adduser', true, array( 'id' => 'addusersub' ) ); ?>
</form>
<?php
} // End if is_multisite().
if ( current_user_can( 'create_users' ) ) {
if ( $do_both ) {
echo '<h2 id="create-new-user">' . __( 'Add User' ) . '</h2>';
}
?>
<p><?php _e( 'Create a brand new user and add them to this site.' ); ?></p>
<form method="post" name="createuser" id="createuser" class="validate" novalidate="novalidate"
<?php
/** This action is documented in wp-admin/user-new.php */
do_action( 'user_new_form_tag' );
?>
>
<input name="action" type="hidden" value="createuser" />
<?php wp_nonce_field( 'create-user', '_wpnonce_create-user' ); ?>
<?php
// Load up the passed data, else set to a default.
$creating = isset( $_POST['createuser'] );
$new_user_login = $creating && isset( $_POST['user_login'] ) ? wp_unslash( $_POST['user_login'] ) : '';
$new_user_firstname = $creating && isset( $_POST['first_name'] ) ? wp_unslash( $_POST['first_name'] ) : '';
$new_user_lastname = $creating && isset( $_POST['last_name'] ) ? wp_unslash( $_POST['last_name'] ) : '';
$new_user_email = $creating && isset( $_POST['email'] ) ? wp_unslash( $_POST['email'] ) : '';
$new_user_uri = $creating && isset( $_POST['url'] ) ? wp_unslash( $_POST['url'] ) : '';
$new_user_role = $creating && isset( $_POST['role'] ) ? wp_unslash( $_POST['role'] ) : '';
$new_user_send_notification = $creating && ! isset( $_POST['send_user_notification'] ) ? false : true;
$new_user_ignore_pass = $creating && isset( $_POST['noconfirmation'] ) ? wp_unslash( $_POST['noconfirmation'] ) : '';
?>
<table class="form-table" role="presentation">
<tr class="form-field form-required">
<th scope="row"><label for="user_login"><?php _e( 'Username' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
<td><input name="user_login" type="text" id="user_login" value="<?php echo esc_attr( $new_user_login ); ?>" aria-required="true" autocapitalize="none" autocorrect="off" autocomplete="off" maxlength="60" /></td>
</tr>
<tr class="form-field form-required">
<th scope="row"><label for="email"><?php _e( 'Email' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
<td><input name="email" type="email" id="email" value="<?php echo esc_attr( $new_user_email ); ?>" /></td>
</tr>
<?php if ( ! is_multisite() ) { ?>
<tr class="form-field">
<th scope="row"><label for="first_name"><?php _e( 'First Name' ); ?> </label></th>
<td><input name="first_name" type="text" id="first_name" value="<?php echo esc_attr( $new_user_firstname ); ?>" /></td>
</tr>
<tr class="form-field">
<th scope="row"><label for="last_name"><?php _e( 'Last Name' ); ?> </label></th>
<td><input name="last_name" type="text" id="last_name" value="<?php echo esc_attr( $new_user_lastname ); ?>" /></td>
</tr>
<tr class="form-field">
<th scope="row"><label for="url"><?php _e( 'Website' ); ?></label></th>
<td><input name="url" type="url" id="url" class="code" value="<?php echo esc_attr( $new_user_uri ); ?>" /></td>
</tr>
<?php
$languages = get_available_languages();
if ( $languages ) :
?>
<tr class="form-field user-language-wrap">
<th scope="row">
<label for="locale">
<?php /* translators: The user language selection field label. */ ?>
<?php _e( 'Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span>
</label>
</th>
<td>
<?php
wp_dropdown_languages(
array(
'name' => 'locale',
'id' => 'locale',
'selected' => 'site-default',
'languages' => $languages,
'show_available_translations' => false,
'show_option_site_default' => true,
)
);
?>
</td>
</tr>
<?php endif; ?>
<tr class="form-field form-required user-pass1-wrap">
<th scope="row">
<label for="pass1">
<?php _e( 'Password' ); ?>
<span class="description hide-if-js"><?php _e( '(required)' ); ?></span>
</label>
</th>
<td>
<input type="hidden" value=" " /><!-- #24364 workaround -->
<button type="button" class="button wp-generate-pw hide-if-no-js"><?php _e( 'Generate password' ); ?></button>
<div class="wp-pwd">
<?php $initial_password = wp_generate_password( 24 ); ?>
<div class="password-input-wrapper">
<input type="password" name="pass1" id="pass1" class="regular-text" autocomplete="new-password" spellcheck="false" data-reveal="1" data-pw="<?php echo esc_attr( $initial_password ); ?>" 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>
</div>
</td>
</tr>
<tr class="form-field form-required user-pass2-wrap hide-if-js">
<th scope="row"><label for="pass2"><?php _e( 'Repeat Password' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
<td>
<input type="password" name="pass2" id="pass2" autocomplete="new-password" spellcheck="false" aria-describedby="pass2-desc" />
<p class="description" id="pass2-desc"><?php _e( 'Type the password again.' ); ?></p>
</td>
</tr>
<tr class="pw-weak">
<th><?php _e( 'Confirm Password' ); ?></th>
<td>
<label>
<input type="checkbox" name="pw_weak" class="pw-checkbox" />
<?php _e( 'Confirm use of weak password' ); ?>
</label>
</td>
</tr>
<tr>
<th scope="row"><?php _e( 'Send User Notification' ); ?></th>
<td>
<input type="checkbox" name="send_user_notification" id="send_user_notification" value="1" <?php checked( $new_user_send_notification ); ?> />
<label for="send_user_notification"><?php _e( 'Send the new user an email about their account' ); ?></label>
</td>
</tr>
<?php } // End if ! is_multisite(). ?>
<?php if ( current_user_can( 'promote_users' ) ) { ?>
<tr class="form-field">
<th scope="row"><label for="role"><?php _e( 'Role' ); ?></label></th>
<td><select name="role" id="role">
<?php
if ( ! $new_user_role ) {
$new_user_role = get_option( 'default_role' );
}
wp_dropdown_roles( $new_user_role );
?>
</select>
</td>
</tr>
<?php } ?>
<?php if ( is_multisite() && current_user_can( 'manage_network_users' ) ) { ?>
<tr>
<th scope="row"><?php _e( 'Skip Confirmation Email' ); ?></th>
<td>
<input type="checkbox" name="noconfirmation" id="noconfirmation" value="1" <?php checked( $new_user_ignore_pass ); ?> />
<label for="noconfirmation"><?php _e( 'Add the user without sending an email that requires their confirmation' ); ?></label>
</td>
</tr>
<?php } ?>
</table>
<?php
/** This action is documented in wp-admin/user-new.php */
do_action( 'user_new_form', 'add-new-user' );
?>
<?php submit_button( __( 'Add User' ), 'primary', 'createuser', true, array( 'id' => 'createusersub' ) ); ?>
</form>
<?php } // End if current_user_can( 'create_users' ). ?>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
menu-header.php 0000644 00000023513 15222337115 0007454 0 ustar 00 <?php
/**
* Displays Administration Menu.
*
* @package WordPress
* @subpackage Administration
*/
// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
/**
* The current page.
*
* @global string $self
*/
$self = preg_replace( '|^.*/wp-admin/network/|i', '', $_SERVER['PHP_SELF'] );
$self = preg_replace( '|^.*/wp-admin/|i', '', $self );
$self = preg_replace( '|^.*/plugins/|i', '', $self );
$self = preg_replace( '|^.*/mu-plugins/|i', '', $self );
/**
* For when admin-header is included from within a function.
*
* @global array $menu
* @global array $submenu
* @global string $parent_file
* @global string $submenu_file
*/
global $menu, $submenu, $parent_file, $submenu_file;
/**
* Filters the parent file of an admin menu sub-menu item.
*
* Allows plugins to move sub-menu items around.
*
* @since MU (3.0.0)
*
* @param string $parent_file The parent file.
*/
$parent_file = apply_filters( 'parent_file', $parent_file );
/**
* Filters the file of an admin menu sub-menu item.
*
* @since 4.4.0
*
* @param string $submenu_file The submenu file.
* @param string $parent_file The submenu item's parent file.
*/
$submenu_file = apply_filters( 'submenu_file', $submenu_file, $parent_file );
get_admin_page_parent();
/**
* Display menu.
*
* @access private
* @since 2.7.0
*
* @global string $self
* @global string $parent_file
* @global string $submenu_file
* @global string $plugin_page
* @global string $typenow The post type of the current screen.
*
* @param array $menu
* @param array $submenu
* @param bool $submenu_as_parent
*/
function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) {
global $self, $parent_file, $submenu_file, $plugin_page, $typenow;
$first = true;
// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes, 5 = hookname, 6 = icon_url.
foreach ( $menu as $key => $item ) {
$admin_is_parent = false;
$class = array();
$aria_attributes = '';
$aria_hidden = '';
$is_separator = false;
if ( $first ) {
$class[] = 'wp-first-item';
$first = false;
}
$submenu_items = array();
if ( ! empty( $submenu[ $item[2] ] ) ) {
$class[] = 'wp-has-submenu';
$submenu_items = $submenu[ $item[2] ];
}
if ( ( $parent_file && $item[2] === $parent_file ) || ( empty( $typenow ) && $self === $item[2] ) ) {
if ( ! empty( $submenu_items ) ) {
$class[] = 'wp-has-current-submenu wp-menu-open';
} else {
$class[] = 'current';
$aria_attributes .= 'aria-current="page"';
}
} else {
$class[] = 'wp-not-current-submenu';
if ( ! empty( $submenu_items ) ) {
$aria_attributes .= 'data-ariahaspopup';
}
}
if ( ! empty( $item[4] ) ) {
$class[] = esc_attr( $item[4] );
}
$class = $class ? ' class="' . implode( ' ', $class ) . '"' : '';
$id = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : '';
$img = '';
$img_style = '';
$img_class = ' dashicons-before';
if ( str_contains( $class, 'wp-menu-separator' ) ) {
$is_separator = true;
}
/*
* If the string 'none' (previously 'div') is passed instead of a URL, don't output
* the default menu image so an icon can be added to div.wp-menu-image as background
* with CSS. Dashicons and base64-encoded data:image/svg_xml URIs are also handled
* as special cases.
*/
if ( ! empty( $item[6] ) ) {
$img = '<img src="' . esc_url( $item[6] ) . '" alt="" />';
if ( 'none' === $item[6] || 'div' === $item[6] ) {
$img = '<br />';
} elseif ( str_starts_with( $item[6], 'data:image/svg+xml;base64,' ) ) {
$img = '<br />';
// The value is base64-encoded data, so esc_attr() is used here instead of esc_url().
$img_style = ' style="background-image:url(\'' . esc_attr( $item[6] ) . '\')"';
$img_class = ' svg';
} elseif ( str_starts_with( $item[6], 'dashicons-' ) ) {
$img = '<br />';
$img_class = ' dashicons-before ' . sanitize_html_class( $item[6] );
}
}
$title = wptexturize( $item[0] );
// Hide separators from screen readers.
if ( $is_separator ) {
$aria_hidden = ' aria-hidden="true"';
}
echo "\n\t<li$class$id$aria_hidden>";
if ( $is_separator ) {
echo '<div class="separator"></div>';
} elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) {
$submenu_items = array_values( $submenu_items ); // Re-index.
$menu_hook = get_plugin_page_hook( $submenu_items[0][2], $item[2] );
$menu_file = $submenu_items[0][2];
$pos = strpos( $menu_file, '?' );
if ( false !== $pos ) {
$menu_file = substr( $menu_file, 0, $pos );
}
if ( ! empty( $menu_hook )
|| ( ( 'index.php' !== $submenu_items[0][2] )
&& file_exists( WP_PLUGIN_DIR . "/$menu_file" )
&& ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) )
) {
$admin_is_parent = true;
echo "<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>";
} else {
echo "\n\t<a href='{$submenu_items[0][2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>";
}
} elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) {
$menu_hook = get_plugin_page_hook( $item[2], 'admin.php' );
$menu_file = $item[2];
$pos = strpos( $menu_file, '?' );
if ( false !== $pos ) {
$menu_file = substr( $menu_file, 0, $pos );
}
if ( ! empty( $menu_hook )
|| ( ( 'index.php' !== $item[2] )
&& file_exists( WP_PLUGIN_DIR . "/$menu_file" )
&& ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) )
) {
$admin_is_parent = true;
echo "\n\t<a href='admin.php?page={$item[2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
} else {
echo "\n\t<a href='{$item[2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
}
}
if ( ! empty( $submenu_items ) ) {
echo "\n\t<ul class='wp-submenu wp-submenu-wrap'>";
echo "<li class='wp-submenu-head' aria-hidden='true'>{$item[0]}</li>";
$first = true;
// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes.
foreach ( $submenu_items as $sub_key => $sub_item ) {
if ( ! current_user_can( $sub_item[1] ) ) {
continue;
}
$class = array();
$aria_attributes = '';
if ( $first ) {
$class[] = 'wp-first-item';
$first = false;
}
$menu_file = $item[2];
$pos = strpos( $menu_file, '?' );
if ( false !== $pos ) {
$menu_file = substr( $menu_file, 0, $pos );
}
// Handle current for post_type=post|page|foo pages, which won't match $self.
$self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing';
if ( isset( $submenu_file ) ) {
if ( $submenu_file === $sub_item[2] ) {
$class[] = 'current';
$aria_attributes .= ' aria-current="page"';
}
/*
* If plugin_page is set the parent must either match the current page or not physically exist.
* This allows plugin pages with the same hook to exist under different parents.
*/
} elseif (
( ! isset( $plugin_page ) && $self === $sub_item[2] )
|| ( isset( $plugin_page ) && $plugin_page === $sub_item[2]
&& ( $item[2] === $self_type || $item[2] === $self || file_exists( $menu_file ) === false ) )
) {
$class[] = 'current';
$aria_attributes .= ' aria-current="page"';
}
if ( ! empty( $sub_item[4] ) ) {
$class[] = esc_attr( $sub_item[4] );
}
$class = $class ? ' class="' . implode( ' ', $class ) . '"' : '';
$menu_hook = get_plugin_page_hook( $sub_item[2], $item[2] );
$sub_file = $sub_item[2];
$pos = strpos( $sub_file, '?' );
if ( false !== $pos ) {
$sub_file = substr( $sub_file, 0, $pos );
}
$title = wptexturize( $sub_item[0] );
if ( ! empty( $menu_hook )
|| ( ( 'index.php' !== $sub_item[2] )
&& file_exists( WP_PLUGIN_DIR . "/$sub_file" )
&& ! file_exists( ABSPATH . "/wp-admin/$sub_file" ) )
) {
// If admin.php is the current page or if the parent exists as a file in the plugins or admin directory.
if ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/{$item[2]}" ) ) || file_exists( $menu_file ) ) {
$sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] );
} else {
$sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' );
}
$sub_item_url = esc_url( $sub_item_url );
echo "<li$class><a href='$sub_item_url'$class$aria_attributes>$title</a></li>";
} else {
echo "<li$class><a href='{$sub_item[2]}'$class$aria_attributes>$title</a></li>";
}
}
echo '</ul>';
}
echo '</li>';
}
echo '<li id="collapse-menu" class="hide-if-no-js">' .
'<button type="button" id="collapse-button" aria-label="' . esc_attr__( 'Collapse Main Menu' ) . '" aria-expanded="true">' .
'<span class="collapse-button-icon" aria-hidden="true"></span>' .
'<span class="collapse-button-label">' . __( 'Collapse Menu' ) . '</span>' .
'</button></li>';
}
?>
<div id="adminmenumain" role="navigation" aria-label="<?php esc_attr_e( 'Main menu' ); ?>">
<a href="#wpbody-content" class="screen-reader-shortcut"><?php _e( 'Skip to main content' ); ?></a>
<a href="#wp-toolbar" class="screen-reader-shortcut"><?php _e( 'Skip to toolbar' ); ?></a>
<div id="adminmenuback"></div>
<div id="adminmenuwrap">
<ul id="adminmenu">
<?php
_wp_menu_output( $menu, $submenu );
/**
* Fires after the admin menu has been output.
*
* @since 2.5.0
*/
do_action( 'adminmenu' );
?>
</ul>
</div>
</div>
options-writing.php 0000644 00000022153 15222337115 0010435 0 ustar 00 <?php
/**
* Writing 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 = __( 'Writing Settings' );
$parent_file = 'options-general.php';
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' => '<p>' . __( 'You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links.' ) . '</p>' .
'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>',
)
);
/** This filter is documented in wp-admin/options.php */
if ( apply_filters( 'enable_post_by_email_configuration', true ) ) {
get_current_screen()->add_help_tab(
array(
'id' => 'options-postemail',
'title' => __( 'Post Via Email' ),
'content' => '<p>' . __( 'Post via email settings allow you to send your WordPress installation an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it’s a good idea to keep this address very secret.' ) . '</p>',
)
);
}
/** This filter is documented in wp-admin/options-writing.php */
if ( apply_filters( 'enable_update_services_configuration', true ) ) {
get_current_screen()->add_help_tab(
array(
'id' => 'options-services',
'title' => __( 'Update Services' ),
'content' => '<p>' . __( 'If desired, WordPress will automatically alert various services of your new posts.' ) . '</p>',
)
);
}
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-writing-screen/">Documentation on Writing Settings</a>' ) . '</p>' .
'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);
wp_enqueue_script( 'user-profile' );
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( 'writing' ); ?>
<table class="form-table" role="presentation">
<?php if ( get_site_option( 'initial_db_version' ) < 32453 ) : ?>
<?php $formatting_title = __( 'Formatting' ); ?>
<tr>
<th scope="row"><?php echo $formatting_title; ?></th>
<td><fieldset><legend class="screen-reader-text"><span><?php echo $formatting_title; ?></span></legend>
<label for="use_smilies">
<input name="use_smilies" type="checkbox" id="use_smilies" value="1" <?php checked( '1', get_option( 'use_smilies' ) ); ?> />
<?php _e( 'Convert emoticons like <code>:-)</code> and <code>:-P</code> to graphics on display' ); ?></label><br />
<label for="use_balanceTags"><input name="use_balanceTags" type="checkbox" id="use_balanceTags" value="1" <?php checked( '1', get_option( 'use_balanceTags' ) ); ?> /> <?php _e( 'WordPress should correct invalidly nested XHTML automatically' ); ?></label>
</fieldset></td>
</tr>
<?php endif; ?>
<tr>
<th scope="row"><label for="default_category"><?php _e( 'Default Post Category' ); ?></label></th>
<td>
<?php
wp_dropdown_categories(
array(
'hide_empty' => 0,
'name' => 'default_category',
'orderby' => 'name',
'selected' => get_option( 'default_category' ),
'hierarchical' => true,
)
);
?>
</td>
</tr>
<?php
$post_formats = get_post_format_strings();
unset( $post_formats['standard'] );
?>
<tr>
<th scope="row"><label for="default_post_format"><?php _e( 'Default Post Format' ); ?></label></th>
<td>
<select name="default_post_format" id="default_post_format">
<option value="0"><?php echo get_post_format_string( 'standard' ); ?></option>
<?php foreach ( $post_formats as $format_slug => $format_name ) : ?>
<option<?php selected( get_option( 'default_post_format' ), $format_slug ); ?> value="<?php echo esc_attr( $format_slug ); ?>"><?php echo esc_html( $format_name ); ?></option>
<?php endforeach; ?>
</select>
</td>
</tr>
<?php
if ( get_option( 'link_manager_enabled' ) ) :
?>
<tr>
<th scope="row"><label for="default_link_category"><?php _e( 'Default Link Category' ); ?></label></th>
<td>
<?php
wp_dropdown_categories(
array(
'hide_empty' => 0,
'name' => 'default_link_category',
'orderby' => 'name',
'selected' => get_option( 'default_link_category' ),
'hierarchical' => true,
'taxonomy' => 'link_category',
)
);
?>
</td>
</tr>
<?php endif; ?>
<?php
do_settings_fields( 'writing', 'default' );
do_settings_fields( 'writing', 'remote_publishing' ); // A deprecated section.
?>
</table>
<?php
/** This filter is documented in wp-admin/options.php */
if ( apply_filters( 'enable_post_by_email_configuration', true ) ) {
?>
<h2 class="title"><?php _e( 'Post via email' ); ?></h2>
<p>
<?php
printf(
/* translators: 1, 2, 3: Examples of random email addresses. */
__( 'To post to WordPress by email, you must set up a secret email account with POP3 access. Any mail received at this address will be posted, so it’s a good idea to keep this address very secret. Here are three random strings you could use: %1$s, %2$s, %3$s.' ),
sprintf( '<kbd>%s</kbd>', wp_generate_password( 8, false ) ),
sprintf( '<kbd>%s</kbd>', wp_generate_password( 8, false ) ),
sprintf( '<kbd>%s</kbd>', wp_generate_password( 8, false ) )
);
?>
</p>
<table class="form-table" role="presentation">
<tr>
<th scope="row"><label for="mailserver_url"><?php _e( 'Mail Server' ); ?></label></th>
<td><input name="mailserver_url" type="text" id="mailserver_url" value="<?php form_option( 'mailserver_url' ); ?>" class="regular-text code" />
<label for="mailserver_port"><?php _e( 'Port' ); ?></label>
<input name="mailserver_port" type="text" id="mailserver_port" value="<?php form_option( 'mailserver_port' ); ?>" class="small-text" />
</td>
</tr>
<tr>
<th scope="row"><label for="mailserver_login"><?php _e( 'Login Name' ); ?></label></th>
<td><input name="mailserver_login" type="text" id="mailserver_login" value="<?php form_option( 'mailserver_login' ); ?>" class="regular-text ltr" /></td>
</tr>
<tr class="mailserver-pass-wrap">
<th scope="row">
<label for="mailserver_pass">
<?php _e( 'Password' ); ?>
</label>
</th>
<td>
<input type="hidden" value=" " /><!-- #24364 workaround -->
<span class="wp-pwd">
<input type="text" name="mailserver_pass" id="mailserver_pass" class="regular-text ltr" autocomplete="off" data-reveal="1" data-pw="<?php echo esc_attr( get_option( 'mailserver_pass' ) ); ?>" />
<button type="button" class="button wp-hide-pw hide-if-no-js" data-toggle="0" data-start-masked="1" aria-label="<?php esc_attr_e( 'Hide password' ); ?>">
<span class="dashicons dashicons-visibility" aria-hidden="true"></span>
</button>
</span>
</td>
</tr>
<tr>
<th scope="row"><label for="default_email_category"><?php _e( 'Default Mail Category' ); ?></label></th>
<td>
<?php
wp_dropdown_categories(
array(
'hide_empty' => 0,
'name' => 'default_email_category',
'orderby' => 'name',
'selected' => get_option( 'default_email_category' ),
'hierarchical' => true,
)
);
?>
</td>
</tr>
<?php do_settings_fields( 'writing', 'post_via_email' ); ?>
</table>
<?php } ?>
<?php
/**
* Filters whether to enable the Update Services section in the Writing settings screen.
*
* @since 3.0.0
*
* @param bool $enable Whether to enable the Update Services settings area. Default true.
*/
if ( apply_filters( 'enable_update_services_configuration', true ) ) {
?>
<h2 class="title"><?php _e( 'Update Services' ); ?></h2>
<?php if ( '1' === get_option( 'blog_public' ) ) : ?>
<p><label for="ping_sites">
<?php
printf(
/* translators: %s: Documentation URL. */
__( 'When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see the <a href="%s">Update Services</a> documentation article. Separate multiple service URLs with line breaks.' ),
__( 'https://developer.wordpress.org/advanced-administration/wordpress/update-services/' )
);
?>
</label></p>
<textarea name="ping_sites" id="ping_sites" class="large-text code" rows="3"><?php echo esc_textarea( get_option( 'ping_sites' ) ); ?></textarea>
<?php else : ?>
<p>
<?php
printf(
/* translators: 1: Documentation URL, 2: URL to Reading Settings screen. */
__( 'WordPress is not notifying any <a href="%1$s">Update Services</a> because of your site’s <a href="%2$s">visibility settings</a>.' ),
__( 'https://developer.wordpress.org/advanced-administration/wordpress/update-services/' ),
'options-reading.php'
);
?>
</p>
<?php endif; ?>
<?php } // enable_update_services_configuration ?>
<?php do_settings_sections( 'writing' ); ?>
<?php submit_button(); ?>
</form>
</div>
<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
network.php 0000644 00000012622 15222337115 0006752 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'; ?>
admin-functions.php 0000644 00000000737 15222337115 0010363 0 ustar 00 <?php
/**
* Administration Functions
*
* This file is deprecated, use 'wp-admin/includes/admin.php' instead.
*
* @deprecated 2.5.0
* @package WordPress
* @subpackage Administration
*/
// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
_deprecated_file( basename( __FILE__ ), '2.5.0', 'wp-admin/includes/admin.php' );
/** WordPress Administration API: Includes all Administration functions. */
require_once ABSPATH . 'wp-admin/includes/admin.php';
plugin-install.php 0000644 00000015724 15222337115 0010231 0 ustar 00 <?php
/**
* Install plugin administration panel.
*
* @package WordPress
* @subpackage Administration
*/
// TODO: Route this page via a specific iframe handler instead of the do_action below.
if ( ! defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' === $_GET['tab'] ) ) {
define( 'IFRAME_REQUEST', true );
}
/**
* WordPress Administration Bootstrap.
*/
require_once __DIR__ . '/admin.php';
if ( ! current_user_can( 'install_plugins' ) ) {
wp_die( __( 'Sorry, you are not allowed to install plugins on this site.' ) );
}
if ( is_multisite() && ! is_network_admin() ) {
wp_redirect( network_admin_url( 'plugin-install.php' ) );
exit;
}
$wp_list_table = _get_list_table( 'WP_Plugin_Install_List_Table' );
$pagenum = $wp_list_table->get_pagenum();
if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) {
$location = remove_query_arg( '_wp_http_referer', wp_unslash( $_SERVER['REQUEST_URI'] ) );
if ( ! empty( $_REQUEST['paged'] ) ) {
$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );
}
wp_redirect( $location );
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;
}
// Used in the HTML title tag.
$title = __( 'Add Plugins' );
$parent_file = 'plugins.php';
wp_enqueue_script( 'plugin-install' );
if ( 'plugin-information' !== $tab ) {
add_thickbox();
}
$body_id = $tab;
wp_enqueue_script( 'updates' );
/**
* Fires before each tab on the Install Plugins screen is loaded.
*
* The dynamic portion of the hook name, `$tab`, allows for targeting
* individual tabs.
*
* Possible hook names include:
*
* - `install_plugins_pre_beta`
* - `install_plugins_pre_favorites`
* - `install_plugins_pre_featured`
* - `install_plugins_pre_plugin-information`
* - `install_plugins_pre_popular`
* - `install_plugins_pre_recommended`
* - `install_plugins_pre_search`
* - `install_plugins_pre_upload`
*
* @since 2.7.0
*/
do_action( "install_plugins_pre_{$tab}" );
/*
* Call the pre upload action on every non-upload plugin installation screen
* because the form is always displayed on these screens.
*/
if ( 'upload' !== $tab ) {
/** This action is documented in wp-admin/plugin-install.php */
do_action( 'install_plugins_pre_upload' );
}
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'<p>' . sprintf(
/* translators: %s: https://wordpress.org/plugins/ */
__( 'Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official <a href="%s">WordPress Plugin Directory</a> are compatible with the license WordPress uses.' ),
__( 'https://wordpress.org/plugins/' )
) . '</p>' .
'<p>' . __( 'You can find new plugins to install by searching or browsing the directory right here in your own Plugins section.' ) . ' <span id="live-search-desc" class="hide-if-no-js">' . __( 'The search results will be updated as you type.' ) . '</span></p>',
)
);
get_current_screen()->add_help_tab(
array(
'id' => 'adding-plugins',
'title' => __( 'Adding Plugins' ),
'content' =>
'<p>' . __( 'If you know what you are looking for, Search is your best bet. The Search screen has options to search the WordPress Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labeled with that tag.' ) . '</p>' .
'<p>' . __( 'If you just want to get an idea of what’s available, you can browse Featured and Popular plugins by using the links above the plugins list. These sections rotate regularly.' ) . '</p>' .
'<p>' . __( 'You can also browse a user’s favorite plugins, by using the Favorites link above the plugins list and entering their WordPress.org username.' ) . '</p>' .
'<p>' . __( 'If you want to install a plugin that you’ve downloaded elsewhere, click the Upload Plugin button above the plugins list. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin.' ) . '</p>',
)
);
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-add-new-screen/">Documentation on Installing Plugins</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 plugins list' ),
'heading_pagination' => __( 'Plugins list navigation' ),
'heading_list' => __( 'Plugins list' ),
)
);
/**
* WordPress Administration Template Header.
*/
require_once ABSPATH . 'wp-admin/admin-header.php';
WP_Plugin_Dependencies::initialize();
WP_Plugin_Dependencies::display_admin_notice_for_unmet_dependencies();
WP_Plugin_Dependencies::display_admin_notice_for_circular_dependencies();
?>
<div class="wrap <?php echo esc_attr( "plugin-install-tab-$tab" ); ?>">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>
<?php
if ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_plugins' ) ) {
printf(
' <a href="%s" class="upload-view-toggle page-title-action"><span class="upload">%s</span><span class="browse">%s</span></a>',
( 'upload' === $tab ) ? self_admin_url( 'plugin-install.php' ) : self_admin_url( 'plugin-install.php?tab=upload' ),
__( 'Upload Plugin' ),
__( 'Browse Plugins' )
);
}
?>
<hr class="wp-header-end">
<?php
/*
* Output the upload plugin form on every non-upload plugin installation screen, so it can be
* displayed via JavaScript rather then opening up the devoted upload plugin page.
*/
if ( 'upload' !== $tab ) {
?>
<div class="upload-plugin-wrap">
<?php
/** This action is documented in wp-admin/plugin-install.php */
do_action( 'install_plugins_upload' );
?>
</div>
<?php
$wp_list_table->views();
}
/**
* Fires after the plugins list table in each tab of the Install Plugins screen.
*
* The dynamic portion of the hook name, `$tab`, allows for targeting
* individual tabs.
*
* Possible hook names include:
*
* - `install_plugins_beta`
* - `install_plugins_favorites`
* - `install_plugins_featured`
* - `install_plugins_plugin-information`
* - `install_plugins_popular`
* - `install_plugins_recommended`
* - `install_plugins_search`
* - `install_plugins_upload`
*
* @since 2.7.0
*
* @param int $paged The current page number of the plugins list table.
*/
do_action( "install_plugins_{$tab}", $paged );
?>
<span class="spinner"></span>
</div>
<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();
/**
* WordPress Administration Template Footer.
*/
require_once ABSPATH . 'wp-admin/admin-footer.php';
ms-admin.php 0000644 00000000304 15222337115 0006760 0 ustar 00 <?php
/**
* Multisite administration panel.
*
* @package WordPress
* @subpackage Multisite
* @since 3.0.0
*/
require_once __DIR__ . '/admin.php';
wp_redirect( network_admin_url() );
exit;
admin.php 0000644 00000030546 15222337115 0006356 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 ) ) {
$blog_count = 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 ( $blog_count <= 50 || ( $blog_count > 50 && mt_rand( 0, (int) ( $blog_count / 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( $blog_count );
}
}
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}" );
}
my-sites.php 0000644 00000011372 15222337115 0007034 0 ustar 00 <?php
/**
* My Sites dashboard.
*
* @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( 'read' ) ) {
wp_die( __( 'Sorry, you are not allowed to access this page.' ) );
}
$action = isset( $_POST['action'] ) ? $_POST['action'] : 'splash';
$blogs = get_blogs_of_user( $current_user->ID );
$updated = false;
if ( 'updateblogsettings' === $action && isset( $_POST['primary_blog'] ) ) {
check_admin_referer( 'update-my-sites' );
$blog = get_site( (int) $_POST['primary_blog'] );
if ( $blog && isset( $blog->domain ) ) {
update_user_meta( $current_user->ID, 'primary_blog', (int) $_POST['primary_blog'] );
$updated = true;
} else {
wp_die( __( 'The primary site you chose does not exist.' ) );
}
}
// Used in the HTML title tag.
$title = __( 'My Sites' );
$parent_file = 'index.php';
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'<p>' . __( 'This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. They can use the links under each site to visit either the front end or the dashboard for that site.' ) . '</p>',
)
);
get_current_screen()->set_help_sidebar(
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
'<p>' . __( '<a href="https://codex.wordpress.org/Dashboard_My_Sites_Screen">Documentation on My Sites</a>' ) . '</p>' .
'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);
require_once ABSPATH . 'wp-admin/admin-header.php';
if ( $updated ) {
wp_admin_notice(
'<strong>' . __( 'Settings saved.' ) . '</strong>',
array(
'type' => 'success',
'dismissible' => true,
'id' => 'message',
)
);
}
?>
<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>
<?php
if ( in_array( get_site_option( 'registration' ), array( 'all', 'blog' ), true ) ) {
/** This filter is documented in wp-login.php */
$sign_up_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) );
printf( ' <a href="%s" class="page-title-action">%s</a>', esc_url( $sign_up_url ), esc_html__( 'Add New Site' ) );
}
if ( empty( $blogs ) ) :
wp_admin_notice(
'<strong>' . __( 'You must be a member of at least one site to use this page.' ) . '</strong>',
array(
'type' => 'error',
'dismissible' => true,
)
);
?>
<?php
else :
?>
<hr class="wp-header-end">
<form id="myblogs" method="post">
<?php
choose_primary_blog();
/**
* Fires before the sites list on the My Sites screen.
*
* @since 3.0.0
*/
do_action( 'myblogs_allblogs_options' );
?>
<br clear="all" />
<ul class="my-sites striped">
<?php
/**
* Filters the settings HTML markup in the Global Settings section on the My Sites screen.
*
* By default, the Global Settings section is hidden. Passing a non-empty
* string to this filter will enable the section, and allow new settings
* to be added, either globally or for specific sites.
*
* @since MU (3.0.0)
*
* @param string $settings_html The settings HTML markup. Default empty.
* @param string $context Context of the setting (global or site-specific). Default 'global'.
*/
$settings_html = apply_filters( 'myblogs_options', '', 'global' );
if ( $settings_html ) {
echo '<h3>' . __( 'Global Settings' ) . '</h3>';
echo $settings_html;
}
reset( $blogs );
foreach ( $blogs as $user_blog ) {
switch_to_blog( $user_blog->userblog_id );
echo '<li>';
echo "<h3>{$user_blog->blogname}</h3>";
$actions = "<a href='" . esc_url( home_url() ) . "'>" . __( 'Visit' ) . '</a>';
if ( current_user_can( 'read' ) ) {
$actions .= " | <a href='" . esc_url( admin_url() ) . "'>" . __( 'Dashboard' ) . '</a>';
}
/**
* Filters the row links displayed for each site on the My Sites screen.
*
* @since MU (3.0.0)
*
* @param string $actions The HTML site link markup.
* @param object $user_blog An object containing the site data.
*/
$actions = apply_filters( 'myblogs_blog_actions', $actions, $user_blog );
echo "<p class='my-sites-actions'>" . $actions . '</p>';
/** This filter is documented in wp-admin/my-sites.php */
echo apply_filters( 'myblogs_options', '', $user_blog );
echo '</li>';
restore_current_blog();
}
?>
</ul>
<?php
if ( count( $blogs ) > 1 || has_action( 'myblogs_allblogs_options' ) || has_filter( 'myblogs_options' ) ) {
?>
<input type="hidden" name="action" value="updateblogsettings" />
<?php
wp_nonce_field( 'update-my-sites' );
submit_button();
}
?>
</form>
<?php endif; ?>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
credits.php 0000644 00000010603 15222337115 0006713 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' ) );
$header_alt_text = sprintf(
/* translators: %s: Version number. */
__( 'WordPress %s' ),
$display_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-image">
<img src="images/about-release-logo.svg?ver=6.9" alt="<?php echo esc_attr( $header_alt_text ); ?>" />
</div>
<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' );
post-new.php 0000644 00000005320 15222337115 0007032 0 ustar 00 <?php
/**
* New Post Administration Screen.
*
* @package WordPress
* @subpackage Administration
*/
/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
/**
* @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;
if ( ! isset( $_GET['post_type'] ) ) {
$post_type = 'post';
} elseif ( in_array( $_GET['post_type'], get_post_types( array( 'show_ui' => true ) ), true ) ) {
$post_type = $_GET['post_type'];
} else {
wp_die( __( 'Invalid post type.' ) );
}
$post_type_object = get_post_type_object( $post_type );
if ( 'post' === $post_type ) {
$parent_file = 'edit.php';
$submenu_file = 'post-new.php';
} elseif ( 'attachment' === $post_type ) {
if ( wp_redirect( admin_url( 'media-new.php' ) ) ) {
exit;
}
} else {
$submenu_file = "post-new.php?post_type=$post_type";
if ( isset( $post_type_object ) && $post_type_object->show_in_menu && true !== $post_type_object->show_in_menu ) {
$parent_file = $post_type_object->show_in_menu;
// What if there isn't a post-new.php item for this post type?
if ( ! isset( $_registered_pages[ get_plugin_page_hookname( "post-new.php?post_type=$post_type", $post_type_object->show_in_menu ) ] ) ) {
if ( isset( $_registered_pages[ get_plugin_page_hookname( "edit.php?post_type=$post_type", $post_type_object->show_in_menu ) ] ) ) {
// Fall back to edit.php for that post type, if it exists.
$submenu_file = "edit.php?post_type=$post_type";
} else {
// Otherwise, give up and highlight the parent.
$submenu_file = $parent_file;
}
}
} else {
$parent_file = "edit.php?post_type=$post_type";
}
}
$title = $post_type_object->labels->add_new_item;
$editing = true;
if ( ! current_user_can( $post_type_object->cap->edit_posts ) || ! current_user_can( $post_type_object->cap->create_posts ) ) {
wp_die(
'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
'<p>' . __( 'Sorry, you are not allowed to create posts as this user.' ) . '</p>',
403
);
}
$post = get_default_post_to_edit( $post_type, true );
$post_ID = $post->ID;
/** This filter is documented in wp-admin/post.php */
if ( apply_filters( 'replace_editor', false, $post ) !== true ) {
if ( use_block_editor_for_post( $post ) ) {
require ABSPATH . 'wp-admin/edit-form-blocks.php';
} else {
wp_enqueue_script( 'autosave' );
require ABSPATH . 'wp-admin/edit-form-advanced.php';
}
} else {
// Flag that we're not loading the block editor.
$current_screen = get_current_screen();
$current_screen->is_block_editor( false );
}
require_once ABSPATH . 'wp-admin/admin-footer.php';
load-styles.php 0000644 00000005663 15222337115 0007530 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;
erase-personal-data.php 0000644 00000016521 15222337115 0011112 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';
async-upload.php 0000644 00000012744 15222337115 0007665 0 ustar 00 <?php
/**
* Server-side file upload handler from wp-plupload or other asynchronous upload methods.
*
* @package WordPress
* @subpackage Administration
*/
if ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {
define( 'DOING_AJAX', true );
}
if ( ! defined( 'WP_ADMIN' ) ) {
define( 'WP_ADMIN', true );
}
/** Load WordPress Bootstrap */
require_once dirname( __DIR__ ) . '/wp-load.php';
require_once ABSPATH . 'wp-admin/admin.php';
header( 'Content-Type: text/plain; charset=' . get_option( 'blog_charset' ) );
if ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {
require ABSPATH . 'wp-admin/includes/ajax-actions.php';
send_nosniff_header();
nocache_headers();
wp_ajax_upload_attachment();
die( '0' );
}
if ( ! current_user_can( 'upload_files' ) ) {
wp_die( __( 'Sorry, you are not allowed to upload files.' ) );
}
// Just fetch the detail form for that attachment.
if ( isset( $_REQUEST['attachment_id'] ) && (int) $_REQUEST['attachment_id'] && $_REQUEST['fetch'] ) {
$id = (int) $_REQUEST['attachment_id'];
$post = get_post( $id );
if ( 'attachment' !== $post->post_type ) {
wp_die( __( 'Invalid post type.' ) );
}
switch ( $_REQUEST['fetch'] ) {
case 3:
?>
<div class="media-item-wrapper">
<div class="attachment-details">
<?php
$thumb_url = wp_get_attachment_image_src( $id, 'thumbnail', true );
if ( $thumb_url ) {
echo '<img class="pinkynail" src="' . esc_url( $thumb_url[0] ) . '" alt="" />';
}
// Title shouldn't ever be empty, but use filename just in case.
$file = get_attached_file( $post->ID );
$file_url = wp_get_attachment_url( $post->ID );
$title = $post->post_title ? $post->post_title : wp_basename( $file );
?>
<div class="filename new">
<span class="media-list-title word-wrap-break-word"><strong><?php echo esc_html( wp_html_excerpt( $title, 60, '…' ) ); ?></strong></span>
<span class="media-list-subtitle word-wrap-break-word"><?php echo esc_html( wp_basename( $file ) ); ?></span>
<div class="attachment-tools">
<?php
if ( current_user_can( 'edit_post', $id ) ) {
echo '<a class="edit-attachment" href="' . esc_url( get_edit_post_link( $id ) ) . '">' . _x( 'Edit', 'media item' ) . '</a>';
} else {
echo '<span class="edit-attachment">' . _x( 'Success', 'media item' ) . '</span>';
}
?>
<span class="media-item-copy-container copy-to-clipboard-container edit-attachment">
<button type="button" class="button button-small copy-attachment-url"
data-clipboard-text="<?php echo esc_url( $file_url ); ?>"
><?php _e( 'Copy URL to clipboard' ); ?></button>
<span class="success hidden" aria-hidden="true"><?php _e( 'Copied!' ); ?></span>
</span>
</div>
</div>
</div>
</div>
<?php
break;
case 2:
add_filter( 'attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2 );
echo get_media_item(
$id,
array(
'send' => false,
'delete' => true,
)
);
break;
default:
add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 );
echo get_media_item( $id );
break;
}
exit;
}
check_admin_referer( 'media-form' );
$post_id = 0;
if ( isset( $_REQUEST['post_id'] ) ) {
$post_id = absint( $_REQUEST['post_id'] );
if ( ! get_post( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) {
$post_id = 0;
}
}
$id = media_handle_upload( 'async-upload', $post_id );
if ( is_wp_error( $id ) ) {
$button_unique_id = uniqid( 'dismiss-' );
$error_description_id = uniqid( 'error-description-' );
$message = sprintf(
'%s <strong>%s</strong><br />%s',
sprintf(
'<button type="button" id="%1$s" class="dismiss button-link" aria-describedby="%2$s">%3$s</button>',
esc_attr( $button_unique_id ),
esc_attr( $error_description_id ),
__( 'Dismiss' )
),
sprintf(
/* translators: %s: Name of the file that failed to upload. */
__( '“%s” has failed to upload.' ),
esc_html( $_FILES['async-upload']['name'] )
),
esc_html( $id->get_error_message() )
);
wp_admin_notice(
$message,
array(
'id' => $error_description_id,
'additional_classes' => array( 'error-div', 'error' ),
'paragraph_wrap' => false,
)
);
$speak_message = sprintf(
/* translators: %s: Name of the file that failed to upload. */
__( '%s has failed to upload.' ),
$_FILES['async-upload']['name']
);
echo '<script>_.delay(function() {wp.a11y.speak(' . wp_json_encode( $speak_message, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) . ");}, 1500);jQuery( 'button#{$button_unique_id}' ).on( 'click', function() {jQuery(this).parents('div.media-item').slideUp(200, function(){jQuery(this).remove();wp.a11y.speak( wp.i18n.__( 'Error dismissed.' ) );jQuery( '#plupload-browse-button' ).trigger( 'focus' );})});</script>\n";
exit;
}
if ( $_REQUEST['short'] ) {
// Short form response - attachment ID only.
echo $id;
} else {
// Long form response - big chunk of HTML.
$type = $_REQUEST['type'];
/**
* Filters the returned ID of an uploaded attachment.
*
* The dynamic portion of the hook name, `$type`, refers to the attachment type.
*
* Possible hook names include:
*
* - `async_upload_audio`
* - `async_upload_file`
* - `async_upload_image`
* - `async_upload_video`
*
* @since 2.5.0
*
* @param int $id Uploaded attachment ID.
*/
echo apply_filters( "async_upload_{$type}", $id );
}
ms-upgrade-network.php 0000644 00000000333 15222337115 0011010 0 ustar 00 <?php
/**
* Multisite upgrade administration panel.
*
* @package WordPress
* @subpackage Multisite
* @since 3.0.0
*/
require_once __DIR__ . '/admin.php';
wp_redirect( network_admin_url( 'upgrade.php' ) );
exit;
export-personal-data.php 0000644 00000017405 15222337115 0011336 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';
authorize-application.php 0000644 00000024137 15222337115 0011600 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';
import.php 0000644 00000017126 15222337115 0006577 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';
images/w-logo-white.png 0000644 00000012423 15222337115 0011044 0 ustar 00 �PNG
IHDR � � �� �PLTE �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������yx �tRNS
!"#$%&'(*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������������������������������������������������������������������������������������������������xD� �IDATx��]i@U��(���b�99�C��V*i���H�/�JeHE��|!>��W�6�R{6)8�ٳ��"�9��T�d�x��}�=��Ϲpo��{�^g�{��k�����u8��MML[�~����7oX�*-q�@ǭ�ڍI�-����BAnv7����uE�e+Zt�k�q@��d�7�3���S*`��Jp�4g�ן�^��_����&���1����
��34l|Rn�y��/i]<�]��]Ԡ�D
l!��b`Ԛ�T�]�
=ʞ�b���v�PD�Q��d�����?e�S�#��}�61;j
�S�~a�i�9��R:�J�9�TI瓛���q'��_�
��#B�.��89���ݽU��uL�s�s���N��Z���M�&suIT��Mw�җn�t�
l�gT����%�E�
�Wl)�N/��(���J{^�|oX���7�|��9.�yw铝@�eZ�U>��s�������> ���m�'ޛ� k���/�\_��j�(���h�v,��kl��iJ����ڄ^܈��@�%����U���X[x��YZ��G?vY�S\l�f�ʹ��X
[ו�`m������*uhW0��k3�$�n���ӿ2��|���J[��v��b>ׯ.�
��Eӗ�zf�R�V�*m���S��0���M��(Sz�e����(m�f|����� �M���]qC�y8��7��51.�?�_6��|�T*ni���� s��;��J)�C�����S��]��������Zō�:��M��^�X����}���}ۊ�k���u '�?*no��9)���S|�MN���Z�#�x�쵳/gb�B��iU�G�Eb�6��&ӆ}��3��R<�ܩWҾM#��-���h�8F��<�^�2� @��e��ϕ�;���������i���X�Bt���� ��b��"�߰�Gly7��_�Й����k�4`�i�������l�����e���\� �;H��J��\t{����� �A6��W$BE�Rdj��<����l��ѭ�
ћ��T���j$����'���G������J> ��1�
?�>�8}p��b�B�έ��%���ԁ�g���V��6� �����Z��⅕iK��L3l@�;���2w��+��{�?r\tܼE�˟W)�L�4��]����e��2��v>�kx�8�@o���)̴��Fݽ���M���m���>�`��N���Vݧ#k�ݒg��i�^�=��k��f�/g9Z�31�Mn��h�o���=,=�cz�찤��6<z�G"�E�?w�,�Bʸ>����'��R������U�k[�O>J4i#����KI�_�.Qmg@Ֆ-�B0D��JR���Ș��zɔ/h
���u�҈V�YKZ�i�,��8"a�6�����R���R���
�W�s>U��5��g��_�ã�s,Eo��d���4�<D&����}��TEF��V��5E��ԏ ��8���u���ߛІ�cX�j|���
��~��DiQ�����Nw��~U_�T���(/�,�� �!���C��п�P{��`��p����@�ɲ<�2>-�e�8�Ő@Y��{�@�ph<)� �/�#��[mP6��T�~>B��o�[����� ���bFSz7��\YKae`V�O�A���)1�\ӼV��>�S?N�o`K?bp��>.FR�v��9�'�oMv��/S���|
��eww���M�3N��� &R;�P~��ck��Nh���� H�'$������+�j�kA�|_#_ 1�����«ƺk��~J��1���(�'�&�O 6"cp;D1PBp�6#��V��=J����~��͝�>�x�d�ZG�⸄b(�n:[0��r���l��A�
4\��.�(^��(����I���5��<�3�n9d��<
1x��`'e�^Ѯ��W�c"P���_\o�����+��>��I<�9�K6�W��o�XU�>���p 2�Q� !M�K4����8a��X�D&ǵf�p���j������m@N���s�<kM�GC/�{��E���[ Pa\�C�4���Ю�C�-ĞDm#D�Җ�$�R]���Kf5��Q6p
���Q�`eK��q������{�ȵ[��baԚ-z!�e>
Q���K��
�E��A��&0�ڎV�`D�\�w���lRXy��X� �o/������V�=�NAz3V��'��~�jk8�n������}���[�~5�B�o�v|���A�Dݿ }��U��O3�nÎo'��Y�]u��D-)/d��!4^���&�AM��1�H�%Z�/Bh�����e��_ϣ�R�p�u�jS뚄��D�;b_X=�kSl���]��� q��E�Sw=v]���1[v�,�����D��3a@9'��!���5 ��FM^�q��d�3�6����$��D³��FM��3�o��-�`-�e��J$\�t���\oF�f��
V��?jˎ�Jة�W] ��(��f�RV�'|�d�-��s7?�e5Y��Ed�h�r;�ٳ�J�秇�&�i���5��v��ڳ�o�!�p0�A�e����1�'��;}�eӎ�&�0J+���j����+}���%{v|�@�(�B��L��?f�(�H�ƨֈW h��V
JX3�6�l���gS�7q�[{
��L(��KP�Qd��l� S�=��4�k��M%�;��Z�&qD���p ����P���� �돖�Im[x����At���-������+�+�d�`�̢���4��G ����K���_�BM���Hj�
�Ba���K@��uN�pE�:�rڮ-k�_�BaL0��+'K�1$�:qe@A�L�@@.�8�R�`8�!��O�V�T��{��� �P0��'�z+~�U��è2?�G= ޠ�m&%`6�
g/�_��s)
(�W`LQ��s�� tJ �T�_�3�.�����CѾ���5p���� ��IK��I���TR�D3�x���d��Di)LbO' {:x!�Qf
O(ڷߺ�M��Lo/J�aS�rx���O(�7��K��ũQLr�
���5� $<���#��y�Lَ�d�y���^�'��7qP����g���p��\�^�+2�'�n^�#�@����
LBÕۨ��$8�)��)��@�g�!�(`�Ѿ;n��c%KSD�$[~;���&c�0�@���n %@���S�$[6My8��sq���sP�o��|YM��)HS���u��8��k�њhУ�ńΙQ�7�*ߌ�R���>�$�5� ��V�#l�P=wKB�*�6�!D=x� X�����b����N*>l�����4~%
(+@�y�ܤb0��Mv\�;���+f���0k+[F�ks��
�>*=��j�攈N w�vD'r��H�a�0���w�o�E��o�5�!�H�ϙNf����l� گ�*�$>�{Vp����e��<�fy�o2H�E^|� �z5��ny�8:9�R ��]"a���q�KB~t���>�Brx<B-;�_E�����ç%h���j�@���:�vg
�I�;��&#��]�;Q�$��W9�v@������;��Rv�
��h�X��k��3��n:D/s��S�m!?�4��,s���B[�q�2�3 Fn�{͂�Â�ɡ�a��X"� �a:�r�q��,~ՂuUl� Ki4\���w��C��3#D��<��]-�!(F�M�?;~�%�l�/MQvv�L �����\r�j��{��d��cT����c�T�EPg�A3�����)Q���J�ձ �����seJ
U��MVR��:Sy�K
��2eT%��������ԣ(�Y֊9d�1�T�v�3���܂���#����-��s�)Z�b�/����PB�.��ܗ���8�E���Q�.�~eO%��
;���Ĺ���ê@b�؏.Ș�-oWtc�D���JLv
O�x�+�pi�ƕO���(1鞪�v�t:Z�zt��g��'�y*��{�?��E:T��9�-s:�eN�|�XG�ڥv�~�b�-_��@�`����̞��LE�d�l�D��!f�K�g���=\r�Y|��ܤ�#BC��!�#�'��ߔ���ռ���c����d���O��u6*��9���vቲ?�H��^A@���&���������:�m���u��HJv IEND�B`� images/icons32-vs.png 0000644 00000017507 15222337115 0010440 0 ustar 00 �PNG
IHDR � - ��� PLTELiq��� G��;v����{�� R(c�:l�F��G�����L�� Q��O��J��Fw�V��L��J��M��K��L��K��I�� K�� H��K��K��K��`��I�� J��M��R��
L��Q��M��]��D� d��M��K��J��L��R��E��8i�S��<o�7f�K��>u�H��f��1[sD~�y��3`y<o�J��6da�����8g�p��`��3f`��4a{[�����<o�=r�Ay�9j�@w� 2^v:n�C|�.<7e�Z��Z��]�����p�����Ax����T��]��3`y>t�4e�3_xj��6d~��ٟ��m��s��w��a��)La���p�����D~����9j���ԝ��(Ka���_����Ԝ�Ӝ�� =M������M����������������V�����q�����^��L��������\����������������������������E�����䙽Ӫ�ڒ�е�߫�ە���������l����ؼ�⎷�O�������ٴ��d���������������������F����脱����n�����r�û��W�����y��T����I���������������ܤ�ئ�ٔ�ъ��u��j�������������푹���a���������g������ꆲ˻������}�����|��x��H�����G�����o��J�������C{����?t�;l����>r�]����ݚ7j� �tRNS J)�B=P�g�ܾY��#�r�3UG"ݚ{*���:+ֈ����42�m�_�l��:����a}DwJޣ�#����MKL�M�Ҩ�G��O���$��}t��������f��:|G� tIDATx���XG�p��\�9�K�{�ر�ۉs���^�K�$����{�[i$���**HBBeBBBA`D7�nz7�1��N���J`���#�k��ߧ0KV�E������2�$�H"�$�H"�$�H"�$��?6��\�b��sq�H�_,���/��Z5�@��;���������ҽ�Q�w)�?�����]���ZyhY��R�|M( Gl^�Q_�����������/pv*��/�[gIzf��/�w�7�Ge�jͮ]kV-��=��J=D��K�Zt#Ȣ���ˋcE����8=�0�����/�<�,D���1_i,�.�!��οz��?�L�w�W��*�K������T.�σ�A�uS f���w8h�/MKM=�te
O.�լ\�����_x��$�~�%G�r�d��X�oM|��B��!H�
���r9%r�^��o��A�2�Ld�Fiji���/D}��P�ʪ���/"���MdeeM,�W�t�W��\���jQ��H�6@"�_��K_�3ϲ��V�Ay��d=�bG���t��kv�
}�[�覫곘�af�k�Ɍ�~��Q�߰��=L1�v ���k/t��*����)��W���z����N�NY}�����)0��F
�M����|��$3fC�~1�|�B�s�a�e� Э��FP�/�9����}2�t;�[�R���+-�x�H_V��˂���yT���h���������R!f"d�C��ѯjC��U��sc$N�y��G����4cGGcy8��U�[�ÉQC�%8�Ye&�Մ\NT�Iۡ��ߘ~�nh(�l��e�����+o���{'j�ѯS��;E�e���0��V���ak�G�x(ʫM�*�e�"]M����FF�T�NS�rJJp�**��lh�<�ˑ��e��7�i1B������A_}Mo�.�O�ƧA�/�1
�8��M2I �61���0��Ϸ�'�/Ը���EB�d
GXP$��rx@�f텡���ց|6�4dY~�^5���KP��ɓ��'�m>d2��� ���j�D�<#9ۄ�w�^)n���9)'p[� �#
�DJ��[T^^^�Ni�E�gJo�%_T=�i
��Z�|�#�.md�����wX/@h�멸\���Ԇ[�D-U��3W0`^!m���O)'�z)* U�m��Ь.��<�ЕQ��(�غ�Fj4�u���O^�z�������
�R��Ы���Z���yכ,bY��qSg�i<���E�� ׄ�����W�"�M4��RY_���d�}�ͦ��t2K-���D�H_��L8�c�[� e�L��xc�ᤌe�֬ݚv)+��Z�#��FϨo���w���b�åc,���\��E��D�Tm ��HKT���ҫ^�����[��~���td���W��B�qr���F��H6o;�OZ����g����Ξ<}f��$�>�}�С�.�(�wmP4����i�b�1Y��Q�9O�YPɱ_��HZc1"�r��DV�tNrX�c 4�r:�(����k8
(ap�y)��x��jQ���Ua��
q�1��@xP*���_��5ӣ7�=F�6*<VU+\��$��R/3�'�ǂx%��S�����r��M�� ��{��vG���7��
+��� ^9��q��nH^�rբ��[N�4��<�~Ѫ�Ǔi�WD
-���P��G�J���3�g2�c���â?o�H��}6)�
�!������$��e�>7�����}�e<t�"��(-��G�yP�y������%adgL&�=��rrM�0�\�����̀C�/�R�r�Y�RKٚ�۪/Ň~�K8�Ȩ�DY�϶b%.��a
�վ!,����N�1s�CWd.�D&�)���Bj�|�N�n�n9�}�����3���w��l�<]��}�=-���l6 ����H ��\\�&�tL��zX���Fi��^SKX������1�P�D�Ϊr)��DQR�Κi�k��:B� ��ݧ�{.��=e��B��_Ʋ�e~�ʒ��e_�s"c8xF�H��V�D��Ң�xrz�������
�L, ����R\�=l�*9�j0��k�W��Z��c�# ���8;]��j���W�ZZ�5#9�HA�Q*�y�ϳrڙ3'�������3
��'���u�9H���\5��Rx���y�+��k�K$��Wڑ����d��1^��@�D�RR��W�/�]�ʒ��^$�`%%�ۨE��P��ʱZ���'��L�U+Z�J�"���>%�� t(�V��yW��p:L�`�-sL&bl��:��
�
YᒧJC�A5UT�M����c/��0�l�����������;����P��8���ͱ����&�؉K����2��s�^_w��ٓC]
�����=~|�TC��ɳC����CY=3�@��;A}���T��T�� �N�}ؼ����55FP0����#Hc� D���vB�����Jw9><22����Z��:
C�g��k�&�LR+$@0!NkB- ��������)ّ1��F�i"�gǰ9��^z#����
����ԐeU'U�D�e��n����RԢ��f��]�.�Sضk��y�S?��Y�����Q�d_!لD��(�lE��y�}�P����Uw��g'�o?��qP��mh�k��.:�=�H�U�3S�,�B4o�}�\I����W0-u(u%._��nx�>��s��
�v�M>z��y��#晅�F�����iȋ�cz�(�t��9��,G.� ������N&�"Ү�
��l�k���G���Έ�b��g��B���9�5�J*B�^Ϫ�D��Ξ.á��!�#�L��T y%�`핣���LLXR�,��<��;�h��P��Sa��=a�-6OA
�JP� �h�b2�|�����;>��j��>��$9yI��ކ���;VoL�Coj�0h�)E�L��'�M��b{�N7�g��J�Ņ".��y�I2���� �lrѨO������Tv�|E ���o'�E�L>�D���%�GO�;��L'S���l+�e���C�ߚo�Q���p>m�ÁC/�b�7g�����h�QaS�"AY##�e(��uX�^A�r�{�=��_Ͽ3.ż��j�N�>��#���������
?����O�>=��$UZ-�D���_�T�=_�6 d�h�w՝�v��=�W�0w̔"K>Z�{���gt����
l�½P�M�n�.F ?冓^0ٹ���m��\Tj𒊈yq�`��i�P�D�2��S��j�H8
�V�e�!����ۇ�L�J��1j�
�S%�@���̨���V��1�K9V-6��ժn]
�_�.�=NEK��#�c�B�e8�L�E�T��ע��M�c���BW���[����W��z�Y�l�`Y��B�����+��D)A��]�Z��TWש�� Kk���u�!л��s�\���4��
FM��3Wq�M���`�p͛����n~Ez��j�W�?����7�zf����n��HH�m�i��ws4�z��p���N�Q�:f��cWdw�K
��U���-��l?/���W��N6ߟ�|�})�B_ �UV6]�l� �b9���#[�T�ޱ�к�,.��,U9�8�D�ᘫn��>w�h��5���=sO�zQ$kQ,�겏,Y2P7t�}Q�lFfяT�OCx]����zzl��Hl���cj=�y��5�Co�Q�'�V�!�5F��c�m�h��� ��q����Qz�Ju��@��|*4CB�T�OT
Q��xf�[XA}�9\�E��@��zL�Q�_fС�ڋ�^ �jo�.�vds�
)� Tڶ{c���9�{L�A����\��.�5�g7Ԝ�GG��vw
����x|�^�FP�\��~����SC�R@PM��w�=�<���O4�����y�f�^u�(�;y���
���/�Ѡ�=SA`����TL�?�XzP׳X����6*�@o��4�� �<?_�R/T�'Ƀ@��I�\sԇX��J6����q������B>-���)��O�����2�����p��}-�Z���4�j�^��Z6�W6WW���R�v`#�F^����쨾�������
����3?kh�j
\��`ph�a������ѡ/���H4��bj�A�� �
$<��*����w���ϟ;���gF |�i�J4C�(��^(���n����mj�M�d�8K;n�X��j�CE�~Ǥ�{�zj'�|�MާTң��+����]TY+�� �����apR�T�>z&�j?���fsn_�����U��+q�0@�u�V�&��m5f����o�����듆���
�]�SMM��|��4����p��bȒ��O��ɟE��! �'?��(S[hv8��8->-���c�wr��>�7�d���-5R��%=�[Q�PPa��r��U(2��Ρք'�A���N��Nf#�<#/O^�r��o�G�.�\�^�Geq�g䰭V�\�%��*��#3+���z��%N�p�E�%8�������P�tT_a�diQ�J(����#���v�vg|Bi
:8�/�\�� ��D��G���������z���[�AwoSwW��)�o�z��7��
������C���,��G��O
��i��PEG�*D��I�-c^�G`.�m�}ռS����=zo��f�q"�|RJ�d|>�Ⓧ���\�N�W�yF�PȖ�EoSVңG%*lffex�c=8i�$(��N_Knmf�P��̘�M��ι�J��gPsmZ6�cjJ"���h��y��~l�Z�Č��[��
=#�L�ԩ���NM�mh����TW?�4��h���Rd �B�H��^��l�|�{���pn^d*���R^t�G-5��M���t ����5O���jz��,n4U���8��G�+������އң_�≭תW�e�(4�v.z��C���'�ffVR�u���٘$��~����>�,�u�Hn���m�>��=�1u�O2�Swe�e\������Uznf��zD�!碠�Z�kٰ����������g�@��}�Ko��3�8��h��ވ¡�br)z�����p��6�4��}�髊|�Ҹ�VSq{<���_J��G������<�5汋�NDL����r�/H��' F�������+^)1�����m�GO�%֙��ᏘO��QV ��@����j�o7M�=
�g�~�r�������9� [ңOpZ[8�'f{
/��|��SS�S�?>�p���o�����Z�7��u�q��HG_�cA�e�;
(��Y��h����-a�<ƫ�B�xb���"=zN�tL�=
�}�`"7)�[��i|�p�7�^=����I�=3�2܃A��X�J6J�!���w�F���>���@�r�Ր*-�[�=�|��)j��|m�wO����hu��M$�����S��S�7����\����̷@���B���F���ѿ�A���>�8r���������C����0����������}�OX���\��jח�0jFB��t�,z�m�^A�^�ϳfGfVf먠���UZ�2z�ڤ��=���.T��𥒕����T��0�?��F�y��� ���W���Gn�054u���ӧE���*砟�J4����,P�Q�L�&���#�bD3qT�z��*�w�w�T�"?�~� \�@�<1a��V�\�b�O�I�9��C�~��w�W�S�}�Y�U�E�w�+H�^
������V�LJ5B)�Ң_��k�}x�y)�x���D�Ƽ{����^��ν:�?�57"��B�*KW����֥~���yc��H9Z\8O��rx��Pz��<�����C��Q��
4v�/_pE��:�b��H}��S�1:mm�v��M}�?���ߊ�^p��o�}���\s
�]�����0�F��ͩ�+�'D��2Ua�E��2E#�nU�X���
�u������o~��.Qb�7�WO� �J1���x�����#� ��� {3Q���+�/�w�y0�~f�4FK����J؉��0c���?VF)ң��������r�������O�}�$���2�V����Nu5g�X���vz�b�Vn��D3�z�2�B,�C�.p�o��MHe�>F&;���E���m#��22h��>%���M��=M��,�&Y�sy����?�=:maGq���7s����;�ES�v��D�:�/���
�r����)�)\�B]�P��
9���s����7ۼY7^1ak.���ǕL�X�x}�F]�`2���n���YО�SE����A�b��f���+�50��5�7�,a�F�`,;80�X�O.�ܿ�{_o� ��nݶ�W���۹�����X�Ƀ�/}�����>��-O?�dɑ���/ݓ��U���s�O�8E���3s>�m�g�
2��yF���� ���4�,��f�Hj�`#Uc_�/*_���7�۷y��mw�z�-�%�6"����`�"����Ae��-t#�
T?q�o��A�,�qa�Po��ܾ� ��{c3���2���m���<o�m�v�-��,ޭ�q5��E����CwfKvR7\���@۶�%�r�m�1�gf�����ӟ������������7M�o�p$z��0������:�}�厝��%�v��w���}L#AT�3������{W��7ub�O$�3ƞ#��-Oo���'?���>Z�~Ϟ��{��|Ş���?�cݹ�w���A�n˓����K����϶������>�����x�N��U'���Ư�JW�!�l����Q�莄�DI$�DI$�DI$�DI$��=��[�� IEND�B`� images/wordpress-logo.png 0000644 00000004660 15222337115 0011514 0 ustar 00 �PNG
IHDR ? ��M iPLTEFFF!u� !u�!u�!u�!u�!u�!u�!u�!u�!u�!u�!u�!u�!u�!u�FFFFFFFFFFFF!u�FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF!u�FFF�9�N !tRNS @����0�` �p����@`P�� �P0�ϯp�?� �IDATx^��Aj�0���H2��X����:u��LW30���6zh�ID�H��������膿4�I�l ��,�+f~�%؏�H
�Q�,����N�HJ�.��j��v��K�Vc���ɺ�c=���D2~�M���Nahy��,�TV�(E� $�vn�q�ɢ�!H��0�9��{ ��#��>�Z�x��Orb8�$�ܚ�v�@�����6�?�!�n�=�����%��>0�)�$�H�y�
"�{q���E2��[ք���� ��˔�D4Avxg$�s�2��J��Vo�D��)�Z=�PaD������m�ċ3Y�v��r�Uo��F<,��b��j�JA��#^k py��u��9��cY�_B��I��������ؔ� P�{x=����Ώ�06�T�� ҹt�]�bi ��!�]�h/�� �xl��t���@�!�tW����:��z����d�\za-�<)��ezs�7%�s�d�O�&�/xӺL�jn_�D�]����\��9N��c���H"�k��F�L %�XZ���S wḬ�l'
�&2gK���u�V��$&B���@�R��a�P�T5J9�fUא}���h�dN�i�N7+ V���
�s�]�}�:���/o>J�
�:��D�%M�f��G�?�ly���D��&ش7E
���8�昞
��#s�q��c��!���~uWg �opat�� +B����y�큝����Z^�J�5I�Z�
�=y�`�Y�C�Q�N@���4��js�|q��=k����W��xn�ϑ`T����� �=��{��)�I{$ܗ�v��a���#��aEl��{S�9�M B��1 �j��"A��]Q�Y-�Ob-��H��az���3���K ��̜>5���D�9��7���ޜ��+�V�POJ�pB 54B2�8��*�K&Y���>h_K5Hl@��a�Ӛ cIj��e8@� ��dWIHȡu�S �X9�s !!�ۈN@Q��$܃�)�`N��$H�OXᑐ9�Į��9��Z-Ar_BB�� �f�խŲ�=$Q}i+�(kho��*Ab��p27DZ�M@B���� ���%�$$�: !��dz $�p#���I�@�1�p��83�^�<6@բZ�������=�4"%X&H>���H
hb�V �"鹯�Qr��z�͡�<,[b���fLb�{s$aߧ+|�ޜ��7�����qe�}�H�H�Bt:>5��,0�I�B+�K�1d�([e�n�a5�8���ޠ97��%Z�]�$�j BY�1K��NGq�iֶ)0d�ԫ��,�r�1�h�
���� �� �n_�l�k �FS� (���UU��M�f�c#zc>�$�7hx��z�RO����B"UKu䳎�B��)AJ=U:[�7�̦
��+��"3�As���5�5��Ϛ�%��_! �{ ������@M�x@fS��L�"5����q�bT�G��bT3_ �R�\�������d� )���o�bC(d���H����y=�op*9&�!^<��/�2��+BBo|��@#��k�M��7y̸�O�ƙXd��0�A~�;�$;C��k
=�E�z�$<��(O��r/!!/�
�]�[j���oh�7�&�c�J��mț�p�����S�q;��~7;X��a�O�V6ax�L�y�>�@����� �
��U�kH���zw���*W���1>BZ�#�m�>�i����`�<�6�Z���3�D���XU�"q�U�1��F&X�O�����Rh����`�U�@�"5�1 o�������z_�jk>�b%����%r5^��F�<7@�>VٚN�M��V��*GrJ���������c[� u�Sh�i�t3r�R����'C���imf_�� �+��F�����D;�t���73>6:۸z�_�o�ש�����#Yu�M���M�C3�� n���g�~�*@��HV�jd�a����\��� � �[Z�
��s6� ���&�N�l���#�� Ɠ �o�U*7Y�ŗ`�
��^-��&!���h(�~F�D�|s��� ��*����_$���ȡ�5f�h�م�Q I�6�R��l"�?��d�3ʍ��T�`�6y��e�� ,�|��7�:�� �{s��L)s0H�3�+����7 IEND�B`� images/about-release-logo.svg 0000644 00000007523 15222337115 0012230 0 ustar 00 <svg width="66" height="25" viewBox="0 0 66 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_6958_40772)">
<path d="M31.7674 11.524C34.3179 8.9735 38.4524 8.9735 41.0028 11.524C46.8848 17.8923 38.1332 26.6403 31.7674 20.7594C29.2175 18.2094 29.2175 14.0744 31.7674 11.524Z" stroke="url(#paint0_linear_6958_40772)" stroke-width="4.17939" stroke-miterlimit="10"/>
<path d="M31.7676 11.5235L41.003 2.28806" stroke="url(#paint1_linear_6958_40772)" stroke-width="4.17939" stroke-miterlimit="10"/>
<path d="M61.1486 13.4671C58.5981 16.0176 54.4636 16.0176 51.9132 13.4671C46.0312 7.09877 54.7828 -1.64921 61.1486 4.23171C63.6985 6.78166 63.6985 10.9166 61.1486 13.4671Z" stroke="url(#paint2_linear_6958_40772)" stroke-width="4.17939" stroke-miterlimit="10"/>
<path d="M61.1484 13.4676L51.913 22.703" stroke="url(#paint3_linear_6958_40772)" stroke-width="4.17939" stroke-miterlimit="10"/>
<circle cx="46.8348" cy="22.7009" r="2.08969" fill="#3858E9"/>
</g>
<path d="M24.0458 12.977C24.0458 6.3524 18.6475 0.954117 12.0229 0.954117C5.38626 0.954117 0 6.3524 0 12.977C0 19.6137 5.38626 24.9999 12.0229 24.9999C18.6475 24.9999 24.0458 19.6137 24.0458 12.977ZM9.35382 19.4333L5.25401 8.43236C5.91527 8.40831 6.66069 8.33618 6.66069 8.33618C7.26183 8.26404 7.18969 6.97759 6.58855 7.00164C6.58855 7.00164 4.84523 7.13389 3.73912 7.13389C3.52271 7.13389 3.29427 7.13389 3.04179 7.12186C4.95343 4.18828 8.25973 2.28866 12.0229 2.28866C14.8242 2.28866 17.3731 3.33465 19.2968 5.10202C18.4792 4.96977 17.313 5.57091 17.313 7.00164C17.313 7.89133 17.854 8.63675 18.395 9.52645C18.8158 10.2598 19.0563 11.1616 19.0563 12.4841C19.0563 14.2755 17.3731 18.4955 17.3731 18.4955L13.7302 8.43236C14.3794 8.40831 14.716 8.22797 14.716 8.22797C15.3172 8.16786 15.245 6.72511 14.6439 6.76118C14.6439 6.76118 12.9126 6.90545 11.7824 6.90545C10.7365 6.90545 8.98111 6.76118 8.98111 6.76118C8.37996 6.72511 8.30782 8.20393 8.90897 8.22797L10.0151 8.32415L11.53 12.424L9.35382 19.4333ZM20.9319 12.977C21.2204 12.2076 21.8216 10.7287 21.4489 7.86728C22.2905 9.41824 22.7113 11.1255 22.7113 12.977C22.7113 16.9326 20.6313 20.4793 17.4212 22.3308C18.5874 19.2169 19.7536 16.0789 20.9319 12.977ZM7.33397 22.7035C3.75114 20.9722 1.33454 17.2211 1.33454 12.977C1.33454 11.414 1.61107 9.99534 2.20019 8.6608C3.90744 13.3377 5.61469 18.0266 7.33397 22.7035ZM12.1792 14.7324L15.2811 23.1243C14.2471 23.473 13.1651 23.6654 12.0229 23.6654C11.0731 23.6654 10.1353 23.5331 9.26966 23.2686C10.2435 20.4072 11.2174 17.5698 12.1792 14.7324Z" fill="url(#paint4_linear_6958_40772)"/>
<defs>
<linearGradient id="paint0_linear_6958_40772" x1="25.0625" y1="17.408" x2="43.998" y2="-1.52658" gradientUnits="userSpaceOnUse">
<stop offset="0.1" stop-color="#D3CDB6"/>
<stop offset="0.65" stop-color="#3858E9"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint1_linear_6958_40772" x1="41.998" y1="-3.32471" x2="23.2986" y2="15.3747" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="0.2" stop-color="#3858E9"/>
<stop offset="1" stop-color="#D3CDB6"/>
</linearGradient>
<linearGradient id="paint2_linear_6958_40772" x1="67.8535" y1="7.58306" x2="48.918" y2="26.5177" gradientUnits="userSpaceOnUse">
<stop offset="0.1" stop-color="#D3CDB6"/>
<stop offset="0.65" stop-color="#3858E9"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint3_linear_6958_40772" x1="50.918" y1="28.3158" x2="69.6174" y2="9.61635" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="0.2" stop-color="#3858E9"/>
<stop offset="1" stop-color="#D3CDB6"/>
</linearGradient>
<linearGradient id="paint4_linear_6958_40772" x1="31" y1="-3.29493" x2="4.50859" y2="23.1965" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="0.45" stop-color="#3858E9"/>
<stop offset="1" stop-color="#D3CDB6"/>
</linearGradient>
<clipPath id="clip0_6958_40772">
<rect width="37.5954" height="25" fill="white" transform="translate(27.6724)"/>
</clipPath>
</defs>
</svg>
images/menu-2x.png 0000644 00000030600 15222337115 0010012 0 ustar 00 �PNG
IHDR � �;w PLTELiq���}~� !;=9~~~omp$@J���}yuda^___omj���}{{T[p�~sss��lfg���YN'ENE*>B���@T�Aa�EX�xnO�[[|||���[Z[WSC.@NjQ8(@L�gZYU1ris1BXEW�Vn�qqq�? wtPmIY���3F0j1$<K���BY�oin����dd&4K���EN]ZR+aaaYD*�U=y���O>heV������������������������������������{Y���������������������������ی���������������ċ��������uoK���rrr�������߱�����䷹���������%.J�����������������������𐐐[0G��м�����?*,uut��ɇ��yyxe^=����ܬ��������ê�����X��Φ����+<jȿ��՜���6^2����ȑ��Ϥ�����������������Ӹ�ؿ�������������4G1��ƽ�����������������ƫ�Ą9����@����t����j<��TNOբ��ঙ���ذ������Д���gάE�������_w�m�g��Ɵ|����w����ҳ�������<��;��gׇS��vޝ7��Mhz�ˑ������ȍu��ԕ~7��t�}d���FYq��]ϲ�濭�d�㕕ڷJ�ξ��^�ju�ss���h��s�m�ҺX~TV�����{�u����Ш���oB8���{�`NbA� GtRNS *G&�3�Si~�;�N���t�f���ڛ��?���I���q�����횎ݴƴ��r��������*| -�IDATx���L�g�F��Tm]����vX(�F� :�R'hV�
2���D���!E��e�Զ��O�I�Q��bG9��vI�s@9�n�g1b.��y����>o�,���c�x�����[�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B=���L�o���f���rj�Q������[]m�����,����Rj�e�G���q_�x�s�{p���9����*��t�
i��^���q1���o�S�X,��dٷ
r���"L [An�
``Ǎ�Uo���^�ii�^D��kD�p�DF ����UEs�z�'[��{��i
�Xu�Z;��A
���/_2��;w*V�|s��������o�;ȷ����JN��
���ꪰIYm�l2��n�Y�� �k9䏒k6n�n\�J�W������<�#�-��x�wtg^-*ʛ����Lw�>��Y
t0/T�L�cc/ ��0o�!�|f&v��1 ��@����$�` �_�����o�.!� rKLt#���;�~1I���4�K,�e�&����a��<�^���Ax:U��� ��ܹ}�m?5s;2�T��
�9��.ܼh�����sǫ0?���ആ��Be�?ߕ������2˟��c��L8@� -��4���w|���|����@b�Va̮q"��~\(<�N�ᒃ�� -�K�Hh��?���Z���f��
�W�*���qq�X�@�#��>nkk|�dܨP(�F�Ba4{9z��?�����yy9�:w�?>w'ea�jLC1Rՠ/��7�]����l,\ }�ޭ��g`�\KKKYԾ���TjO��g�I_'���D���1�R?;�*"��:�\���!`A��Få��Jkk��R��V����Z�� ҮS�z���?5���-6j�J�ŢQ�5��C ��ݷ!/��C�/����iLC1\��°>�Ti�-��c���Y�ނ�q�(n�O�ܶbȴs8��f�3'v�1P{J���3QG� �?߳� �8�#CH��
LܭW�gm��19�MO���OF�5p��Xa����V�Z �xjuZ��V��t!���s۠�Gw���Y1h�a[ ��C;
1��E9����"ԩ� b������n2��3���R�C��ײ� CYYYMM9,��k��ێg�5�en���TjJ¾3+0G� zJ���S��zl��r=k���:�Ģ�a�;!O�1�>|�`�n'0�ʞ Od��J��<1�_+� 8N��<�^�S��j�\�t��C�#��ˊ5�||,�``v�ᘃb�ʳ�,�-��݂L(Wlnؾ};)G�z;�Zm�2����I��11����D�˧�ꜛ� Z���L�lO� AOi�h���q����u�X�ӑ1�'&�v�ѱ���N`�d���0�1j�,��12x� �%�V=��G��z.q �.��z�Q#Ā�`�W
MitG�.b�96p9�����`�u���0�!;�$`�ڵ�j_���IG�[-�W�L��L�`C�3�f�/����,���vN]
WѰ��%���p�}�B㿙{�����H|��=�N�f8&���I&3����!��`�bddd,��� ^�o0P0p��O�U���yQ�<���ú,�A@�dTh����A�R�h�p���!�̳�lg�䜝���Q�D�0qH���CP�6reR s�ƍk��L�������
0��s)$i۶��K�� ���`���I���@�n�\�$�H�0������S`
{J�)q� ��,{���z1���v�������M�0)�O�C�h��X��6��o
���r(��r-� ��
z�J�]KC�0W��(�(5De����9}�¼ a(객] ���X��@
�/� 4�öR�Qg�p���R�L�=��P�g�������^i�5tGEe�4�{J ��U�A��<�� `�&Z|��}'��'�b�!b
b�m�*�֡�!`{] �[�0���
�PJ�MZ��bP�7@pP�u�U��=���2��V���ʹ�A�p��>V��*�
�s rs0`�B�l�R���P�昩��r��� �D�]B�P�4e���� ���0W�uFC]s3�S�KO��~*)�?�|{��Dt�.�1\�[�W�1
�
F[����Fa�,x��A�TXJV�~7Y:��t�-�j�Z��j�wu�x�]@��V�nG��4����w�X b��q�cU�_\�����\�B���{2�x�)������<��D��8"00����o��T��:q.�'�
��y�0SxH��Ihf�I0�j�'ވ1��6���p&5a�����_�|g�,!�[0��>��s@��f#aj�
{���0$��o�zp���"͏!�*ퟚ�/�B8��Y��j���{=�t:�S+6��.+/ ���
g� P'U@X�#�O�;���(膓'!�W��k \@c$B�D�8�c0J�4�ϩ�wu�Y�5���������hi�|
Cw�t��33�Ҋ��s��SJ9�v�����1@R@�m2��)t�:<lo�F��:�m��u�5u��:@z7�Qn
�4���9�(��NZ�v��
C� ���I��u����^����KZ�����%��{&�����}?����Ν;���o����dIL�72��'�p�s�_xæ�����2͡��^�LMY3�R�]��Ai�8!�Ύ�C �c��7�u'��=��#���6"Q���f��P��ȠR1eP�J�U�
*L��J
p�p+n���!8�xk!����1t��*�BVooW֛��O�'�b�����a����j)�z� �;>x�aCQџ~��<���$���3�9����H6na��(�m߳��e��s*0lJ�����C� ���2�XP��8"�ݎ����0�I�5|�M\���?�t@ѡ�@��
��FcYJ�X�2$ޯl����wXݐ�.܂���i�bz�E�Hܛ���\����Lˏ�|H>�����VsK�N2�H��&e�={�g×E%��=�q2�%��09�M��"�y�ق'���&���wq`�� Xv�#B���L69�BO�V��e0$���dG2F���N����@�$2(#�dha\�~2�샴ctWUU5����fo�����B��Ĕc^�4�d(��عy�N��b,�]��t�t�!L9�g]SBiҪ�dH����d��e�����(Pd�#����'��0zaB6�V��jRq�zJ�n�&����<,C^��h�&��8;�G�#���x�� ȀCC�<+-�n��
����_��ը���p�B��&N��a��oˆ����&y���b'.ϱה��<�fʀ&M6��U�z�X�z�;1����
z�Ck~�!�fB�i*&���MMM.Y,hm1����u���:�Now��ٺ��'�B�9�9��e�4���)CY7@�3�K���/�5��އܭ�/Ki5.S�5�eJ���/ȃ���&���F�p�; I���/���1G���2A|pWS/~��G�dt&Cb��
��:+��m��ô
�)��Y��u��ɂB���;4ԋ~����
*�&��Њ��v�8�'"�����nU����A�]Y
z�#C;
L���ɜ)ˍv��ztO�n2T��1*� �]��n\"C��0�n.`nϑ�&��S5(��/��IV�]�E�}ʐ&P\hj�6��U�Bs�Kx��n�M:��d6��Qg���H����due���SM�#�g�<�
�R�P�}�Te�a�}ze8C � �^�J³�\S�&��Z�_Q�e�-�Q=z�K��ʳ��ͅ�e�����x�ө�/Cc#D���ڃ�kwܼ�Q��TkF;�I"