+
+/**
+ * Delete a file
+ *
+ * @since 4.2.0
+ *
+ * @param string $file The path to the file to delete.
+ */
+function wp_delete_file( $file ) {
+ /**
+ * Filters the path of the file to delete.
+ *
+ * @since 2.1.0
+ *
+ * @param string $medium Path to the file to delete.
+ */
+ $delete = apply_filters( 'wp_delete_file', $file );
+ if ( ! empty( $delete ) ) {
+ @unlink( $delete );
+ }
+}
+
+/**
+ * Outputs a small JS snippet on preview tabs/windows to remove `window.name` on unload.
+ *
+ * This prevents reusing the same tab for a preview when the user has navigated away.
+ *
+ * @since 4.3.0
+ */
+function wp_post_preview_js() {
+ global $post;
+
+ if ( ! is_preview() || empty( $post ) ) {
+ return;
+ }
+
+ // Has to match the window name used in post_submit_meta_box()
+ $name = 'wp-preview-' . (int) $post->ID;
+
+ ?>
+ <script>
+ ( function() {
+ var query = document.location.search;
+
+ if ( query && query.indexOf( 'preview=true' ) !== -1 ) {
+ window.name = '<?php echo $name; ?>';
+ }
+
+ if ( window.addEventListener ) {
+ window.addEventListener( 'unload', function() { window.name = ''; }, false );
+ }
+ }());
+ </script>
+ <?php
+}
+
+/**
+ * Parses and formats a MySQL datetime (Y-m-d H:i:s) for ISO8601/RFC3339.
+ *
+ * Explicitly strips timezones, as datetimes are not saved with any timezone
+ * information. Including any information on the offset could be misleading.
+ *
+ * @since 4.4.0
+ *
+ * @param string $date_string Date string to parse and format.
+ * @return string Date formatted for ISO8601/RFC3339.
+ */
+function mysql_to_rfc3339( $date_string ) {
+ $formatted = mysql2date( 'c', $date_string, false );
+
+ // Strip timezone information
+ return preg_replace( '/(?:Z|[+-]\d{2}(?::\d{2})?)$/', '', $formatted );
+}
+
+/**
+ * Attempts to raise the PHP memory limit for memory intensive processes.
+ *
+ * Only allows raising the existing limit and prevents lowering it.
+ *
+ * @since 4.6.0
+ *
+ * @param string $context Optional. Context in which the function is called. Accepts either 'admin',
+ * 'image', or an arbitrary other context. If an arbitrary context is passed,
+ * the similarly arbitrary {@see '{$context}_memory_limit'} filter will be
+ * invoked. Default 'admin'.
+ * @return bool|int|string The limit that was set or false on failure.
+ */
+function wp_raise_memory_limit( $context = 'admin' ) {
+ // Exit early if the limit cannot be changed.
+ if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
+ return false;
+ }
+
+ $current_limit = @ini_get( 'memory_limit' );
+ $current_limit_int = wp_convert_hr_to_bytes( $current_limit );
+
+ if ( -1 === $current_limit_int ) {
+ return false;
+ }
+
+ $wp_max_limit = WP_MAX_MEMORY_LIMIT;
+ $wp_max_limit_int = wp_convert_hr_to_bytes( $wp_max_limit );
+ $filtered_limit = $wp_max_limit;
+
+ switch ( $context ) {
+ case 'admin':
+ /**
+ * Filters the maximum memory limit available for administration screens.
+ *
+ * This only applies to administrators, who may require more memory for tasks
+ * like updates. Memory limits when processing images (uploaded or edited by
+ * users of any role) are handled separately.
+ *
+ * The `WP_MAX_MEMORY_LIMIT` constant specifically defines the maximum memory
+ * limit available when in the administration back end. The default is 256M
+ * (256 megabytes of memory) or the original `memory_limit` php.ini value if
+ * this is higher.
+ *
+ * @since 3.0.0
+ * @since 4.6.0 The default now takes the original `memory_limit` into account.
+ *
+ * @param int|string $filtered_limit The maximum WordPress memory limit. Accepts an integer
+ * (bytes), or a shorthand string notation, such as '256M'.
+ */
+ $filtered_limit = apply_filters( 'admin_memory_limit', $filtered_limit );
+ break;
+
+ case 'image':
+ /**
+ * Filters the memory limit allocated for image manipulation.
+ *
+ * @since 3.5.0
+ * @since 4.6.0 The default now takes the original `memory_limit` into account.
+ *
+ * @param int|string $filtered_limit Maximum memory limit to allocate for images.
+ * Default `WP_MAX_MEMORY_LIMIT` or the original
+ * php.ini `memory_limit`, whichever is higher.
+ * Accepts an integer (bytes), or a shorthand string
+ * notation, such as '256M'.
+ */
+ $filtered_limit = apply_filters( 'image_memory_limit', $filtered_limit );
+ break;
+
+ default:
+ /**
+ * Filters the memory limit allocated for arbitrary contexts.
+ *
+ * The dynamic portion of the hook name, `$context`, refers to an arbitrary
+ * context passed on calling the function. This allows for plugins to define
+ * their own contexts for raising the memory limit.
+ *
+ * @since 4.6.0
+ *
+ * @param int|string $filtered_limit Maximum memory limit to allocate for images.
+ * Default '256M' or the original php.ini `memory_limit`,
+ * whichever is higher. Accepts an integer (bytes), or a
+ * shorthand string notation, such as '256M'.
+ */
+ $filtered_limit = apply_filters( "{$context}_memory_limit", $filtered_limit );
+ break;
+ }
+
+ $filtered_limit_int = wp_convert_hr_to_bytes( $filtered_limit );
+
+ if ( -1 === $filtered_limit_int || ( $filtered_limit_int > $wp_max_limit_int && $filtered_limit_int > $current_limit_int ) ) {
+ if ( false !== @ini_set( 'memory_limit', $filtered_limit ) ) {
+ return $filtered_limit;
+ } else {
+ return false;
+ }
+ } elseif ( -1 === $wp_max_limit_int || $wp_max_limit_int > $current_limit_int ) {
+ if ( false !== @ini_set( 'memory_limit', $wp_max_limit ) ) {
+ return $wp_max_limit;
+ } else {
+ return false;
+ }
+ }
+
+ return false;
+}