diff --git a/packages/playground/client/src/lib/import-export.ts b/packages/playground/client/src/lib/import-export.ts
index e3ec6387..6663eb5a 100644
--- a/packages/playground/client/src/lib/import-export.ts
+++ b/packages/playground/client/src/lib/import-export.ts
@@ -1,139 +1,185 @@
-import { saveAs } from 'file-saver';
-import type { PlaygroundClient } from '../';
+import type { PHPResponse, PlaygroundClient } from '../';
+import { jsToPHPTranslator } from '@php-wasm/web';
// @ts-ignore
-import migration from './migration.php?raw';
+import migrationsPHPCode from './migration.php?raw';
-const databaseExportName = 'databaseExport.xml';
-const databaseExportPath = '/' + databaseExportName;
+const t = jsToPHPTranslator();
-export async function exportFile(playground: PlaygroundClient) {
- const databaseExportResponse = await playground.request({
- url: '/wp-admin/export.php?download=true&content=all',
- });
- const databaseExportContent = databaseExportResponse.text;
- await playground.writeFile(databaseExportPath, databaseExportContent);
+/**
+ * Full site export support:
+ */
+
+/**
+ * Export the current site as a zip file.
+ *
+ * @param playground Playground client.
+ */
+export async function zipEntireSite(playground: PlaygroundClient) {
const wpVersion = await playground.wordPressVersion;
const phpVersion = await playground.phpVersion;
- const documentRoot = await playground.documentRoot;
- const exportName = `wordpress-playground--wp${wpVersion}--php${phpVersion}.zip`;
- const exportPath = `/${exportName}`;
- const exportWriteRequest = await playground.run({
- code:
- migration +
- ` generateZipFile('${exportPath}', '${databaseExportPath}', '${documentRoot}');`,
- });
- if (exportWriteRequest.exitCode !== 0) {
- throw exportWriteRequest.errors;
- }
+ const zipName = `wordpress-playground--wp${wpVersion}--php${phpVersion}.zip`;
+ const zipPath = `/${zipName}`;
- const fileBuffer = await playground.readFileAsBuffer(exportName);
- const file = new File([fileBuffer], exportName);
- saveAs(file);
-}
+ const documentRoot = await playground.documentRoot;
+ await phpMigration(playground, t.zipDir(documentRoot, zipPath));
-export async function importFile(playground: PlaygroundClient, file: File) {
- if (
- // eslint-disable-next-line no-alert
- !confirm(
- 'Are you sure you want to import this file? Previous data will be lost.'
- )
- ) {
- return false;
- }
+ const fileBuffer = await playground.readFileAsBuffer(zipPath);
+ playground.unlink(zipPath);
- // Write uploaded file to filesystem for processing with PHP
- const fileArrayBuffer = await file.arrayBuffer();
- const fileContent = new Uint8Array(fileArrayBuffer);
- const importPath = '/import.zip';
+ return new File([fileBuffer], zipName);
+}
- await playground.writeFile(importPath, fileContent);
+/**
+ * Replace the current site with the contents of a full site zip file.
+ *
+ * @param playground Playground client.
+ * @param fullSiteZip Zipped WordPress site.
+ */
+export async function replaceSite(
+ playground: PlaygroundClient,
+ fullSiteZip: File
+) {
+ const zipPath = '/import.zip';
+ await playground.writeFile(
+ zipPath,
+ new Uint8Array(await fullSiteZip.arrayBuffer())
+ );
- // Import the database
- const databaseFromZipFileReadRequest = await playground.run({
- code:
- migration +
- ` readFileFromZipArchive('${importPath}', '${databaseExportPath}');`,
- });
- if (databaseFromZipFileReadRequest.exitCode !== 0) {
- throw databaseFromZipFileReadRequest.errors;
- }
+ const absoluteUrl = await playground.absoluteUrl;
+ const documentRoot = await playground.documentRoot;
- const databaseFromZipFileContent = new TextDecoder().decode(
- databaseFromZipFileReadRequest.bytes
+ await phpMigration(
+ playground,
+ `${t.delTree(documentRoot)};
+ ${t.unzip(zipPath, '/')};`
);
- const databaseFile = new File(
- [databaseFromZipFileContent],
- databaseExportName
+ await patchFile(
+ playground,
+ `${documentRoot}/wp-config.php`,
+ (contents) =>
+ `${contents}`
);
+}
+
+/**
+ * WXR and WXZ files support:
+ */
+
+/**
+ * Exports the WordPress database as a WXR file using
+ * the core WordPress export tool.
+ *
+ * @param playground Playground client
+ * @returns WXR file
+ */
+export async function exportWXR(playground: PlaygroundClient) {
+ const databaseExportResponse = await playground.request({
+ url: '/wp-admin/export.php?download=true&content=all',
+ });
+ return new File([databaseExportResponse.bytes], 'export.xml');
+}
+
+/**
+ * Exports the WordPress database as a WXZ file using
+ * the export-wxz plugin from https://github.com/akirk/export-wxz.
+ *
+ * @param playground Playground client
+ * @returns WXZ file
+ */
+export async function exportWXZ(playground: PlaygroundClient) {
+ const databaseExportResponse = await playground.request({
+ url: '/wp-admin/export.php?download=true&content=all&export_wxz=1',
+ });
+ return new File([databaseExportResponse.bytes], 'export.wxz');
+}
+/**
+ * Uploads a file to the WordPress importer and returns the response.
+ * Supports both WXR and WXZ files.
+ *
+ * @see https://github.com/WordPress/wordpress-importer/compare/master...akirk:wordpress-importer:import-wxz.patch
+ * @param playground Playground client.
+ * @param file The file to import.
+ */
+export async function submitImporterForm(
+ playground: PlaygroundClient,
+ file: File
+) {
const importerPageOneResponse = await playground.request({
url: '/wp-admin/admin.php?import=wordpress',
});
- const importerPageOneContent = new DOMParser().parseFromString(
- importerPageOneResponse.text,
- 'text/html'
- );
-
- const firstUrlAction = importerPageOneContent
+ const firstUrlAction = DOM(importerPageOneResponse)
.getElementById('import-upload-form')
?.getAttribute('action');
const stepOneResponse = await playground.request({
url: `/wp-admin/${firstUrlAction}`,
method: 'POST',
- files: { import: databaseFile },
+ files: { import: file },
});
- const importerPageTwoContent = new DOMParser().parseFromString(
- stepOneResponse.text,
- 'text/html'
- );
-
- const importerPageTwoForm = importerPageTwoContent.querySelector(
+ // Map authors of imported posts to existing users
+ const importForm = DOM(stepOneResponse).querySelector(
'#wpbody-content form'
- );
- const secondUrlAction = importerPageTwoForm?.getAttribute(
- 'action'
- ) as string;
-
- const nonce = (
- importerPageTwoForm?.querySelector(
- "input[name='_wpnonce']"
- ) as HTMLInputElement
- ).value;
-
- const referrer = (
- importerPageTwoForm?.querySelector(
- "input[name='_wp_http_referer']"
- ) as HTMLInputElement
- ).value;
-
- const importId = (
- importerPageTwoForm?.querySelector(
- "input[name='import_id']"
- ) as HTMLInputElement
- ).value;
-
- await playground.request({
- url: secondUrlAction,
+ ) as HTMLFormElement;
+
+ if (!importForm) {
+ console.log(stepOneResponse.text);
+ throw new Error(
+ 'Could not find an importer form in response. See the response text above for details.'
+ );
+ }
+
+ const data = getFormData(importForm);
+ data['fetch_attachments'] = '1';
+ for (const key in data) {
+ if (key.startsWith('user_map[')) {
+ const newKey = 'user_new[' + key.slice(9, -1) + ']';
+ data[newKey] = '1'; // Hardcoded admin ID for now
+ }
+ }
+
+ return await playground.request({
+ url: importForm.action,
method: 'POST',
- formData: {
- _wpnonce: nonce,
- _wp_http_referer: referrer,
- import_id: importId,
- },
+ formData: data,
});
+}
- // Import the file system
- const importFileSystemRequest = await playground.run({
- code: migration + ` importZipFile('${importPath}');`,
+function DOM(response: PHPResponse) {
+ return new DOMParser().parseFromString(response.text, 'text/html');
+}
+
+function getFormData(form: HTMLFormElement): Record {
+ return Object.fromEntries((new FormData(form) as any).entries());
+}
+
+async function patchFile(
+ playground: PlaygroundClient,
+ path: string,
+ callback: (contents: string) => string
+) {
+ await playground.writeFile(
+ path,
+ callback(await playground.readFileAsText(path))
+ );
+}
+
+async function phpMigration(playground: PlaygroundClient, code: string) {
+ const result = await playground.run({
+ code: migrationsPHPCode + code,
});
- if (importFileSystemRequest.exitCode !== 0) {
- throw importFileSystemRequest.errors;
+ if (result.exitCode !== 0) {
+ console.log(result.errors);
+ throw result.errors;
}
-
- return true;
+ return result;
}
diff --git a/packages/playground/client/src/lib/index.ts b/packages/playground/client/src/lib/index.ts
index 70f30db9..5a56a9ff 100644
--- a/packages/playground/client/src/lib/index.ts
+++ b/packages/playground/client/src/lib/index.ts
@@ -1,5 +1,10 @@
-export { exportFile } from './import-export';
-export { importFile } from './import-export';
+export {
+ zipEntireSite,
+ exportWXR,
+ exportWXZ,
+ replaceSite,
+ submitImporterForm,
+} from './import-export';
export { login } from './login';
export { installTheme } from './install-theme';
export type { InstallThemeOptions } from './install-theme';
diff --git a/packages/playground/client/src/lib/migration.php b/packages/playground/client/src/lib/migration.php
index 8afcd6e1..29b3e66f 100644
--- a/packages/playground/client/src/lib/migration.php
+++ b/packages/playground/client/src/lib/migration.php
@@ -1,14 +1,17 @@
open($exportPath, ZipArchive::CREATE);
+ $res = $zip->open($output, ZipArchive::CREATE);
if ($res === TRUE) {
- $zip->addFile($databasePath);
- $directories = array();
- $directories[] = $docRoot . '/';
-
- while(sizeof($directories)) {
+ foreach ($additionalFiles as $file) {
+ $zip->addFile($file);
+ }
+ $directories = array(
+ rtrim($dir, '/') . '/'
+ );
+ while (sizeof($directories)) {
$dir = array_pop($directories);
if ($handle = opendir($dir)) {
@@ -19,13 +22,9 @@ function generateZipFile($exportPath, $databasePath, $docRoot) {
$entry = $dir . $entry;
- if (
- is_dir($entry) &&
- strpos($entry, 'wp-content/database') == false &&
- strpos($entry, 'wp-includes') == false
- ) {
- $directory_path = $entry . '/';
- array_push($directories, $directory_path);
+ if (is_dir($entry)) {
+ $directory_path = $entry . '/';
+ array_push($directories, $directory_path);
} else if (is_file($entry)) {
$zip->addFile($entry);
}
@@ -34,35 +33,30 @@ function generateZipFile($exportPath, $databasePath, $docRoot) {
}
}
$zip->close();
- chmod($exportPath, 0777);
+ chmod($output, 0777);
}
}
-function readFileFromZipArchive($pathToZip, $pathToFile) {
- chmod($pathToZip, 0777);
+function unzip($zipPath, $extractTo, $overwrite = true)
+{
+ if(!is_dir($extractTo)) {
+ mkdir($extractTo, 0777, true);
+ }
$zip = new ZipArchive;
- $res = $zip->open($pathToZip);
+ $res = $zip->open($zipPath);
if ($res === TRUE) {
- $file = $zip->getFromName($pathToFile);
- echo $file;
+ $zip->extractTo($extractTo);
+ $zip->close();
+ chmod($extractTo, 0777);
}
}
-function importZipFile($pathToZip) {
- $zip = new ZipArchive;
- $res = $zip->open($pathToZip);
- if ($res === TRUE) {
- $counter = 0;
- while ($zip->statIndex($counter)) {
- $file = $zip->statIndex($counter);
- $filePath = $file['name'];
- if (!file_exists(dirname($filePath))) {
- mkdir(dirname($filePath), 0777, true);
- }
- $overwrite = fopen($filePath, 'w');
- fwrite($overwrite, $zip->getFromIndex($counter));
- $counter++;
- }
- $zip->close();
+
+function delTree($dir)
+{
+ $files = array_diff(scandir($dir), array('.', '..'));
+ foreach ($files as $file) {
+ (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
}
+ return rmdir($dir);
}
diff --git a/packages/playground/compile-wordpress/Dockerfile b/packages/playground/compile-wordpress/Dockerfile
index 71d33e14..f4a08b23 100644
--- a/packages/playground/compile-wordpress/Dockerfile
+++ b/packages/playground/compile-wordpress/Dockerfile
@@ -15,7 +15,7 @@ RUN mkdir /root/output
RUN set -euxo pipefail;\
apt-get update; \
- emsdk install latest
+ emsdk install latest;
# Download specific version of WordPress
RUN wget -O wp.zip $WP_ZIP_URL && \
@@ -117,6 +117,7 @@ RUN cd wordpress && \
FROM php:7.4-cli AS php
WORKDIR /root/
COPY --from=emscripten /root/wordpress ./wordpress
+RUN apt update && apt install unzip
# === Run WordPress Installer ===
RUN ls -la && \
@@ -129,15 +130,31 @@ RUN ls -la && \
exit 'WordPress installation failed'; \
fi
+# === Create the mu-plugins directory ===
+RUN mkdir wordpress/wp-content/mu-plugins
+
# === Install WP-CLI ===
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
chmod +x wp-cli.phar
# === Install WordPress Importer ===
-RUN cd wordpress && \
- ../wp-cli.phar --allow-root plugin install wordpress-importer && \
+COPY ./build-assets/import-wxz.patch /root/
+RUN cd wordpress/wp-content/plugins && \
+ curl -L $(curl -s https://api.github.com/repos/WordPress/wordpress-importer/releases/latest | grep zip | cut -d '"' -f 4) > out && \
+ unzip out && \
+ rm out && \
+ mv WordPress-* wordpress-importer && \
+ cd wordpress-importer && \
+ # Patch the WordPress Importer to support .wxz files
+ patch -p1 < /root/import-wxz.patch && \
+ cd ../../../ && \
../wp-cli.phar --allow-root plugin activate wordpress-importer
+# === Install WordPress WXZ Exporter ===
+COPY ./build-assets/export-wxz.php /root/
+RUN cd wordpress && \
+ cp /root/export-wxz.php wp-content/mu-plugins/export-wxz.php
+
# Strip whitespaces from PHP files.
# PHP 7.4 is a safe choice here: `php -w` ran on 7.4
# produces code compatible with PHP 8+, but the reverse
diff --git a/packages/playground/compile-wordpress/build-assets/export-wxz.php b/packages/playground/compile-wordpress/build-assets/export-wxz.php
new file mode 100644
index 00000000..8872e747
--- /dev/null
+++ b/packages/playground/compile-wordpress/build-assets/export-wxz.php
@@ -0,0 +1,513 @@
+export();
+ exit;
+ }
+}
+
+class Export_WXZ {
+ public $filelist = array();
+ public $filename;
+
+ public function __construct( $args = array() ) {
+ global $wpdb, $post;
+
+ $defaults = array(
+ 'content' => 'all',
+ 'author' => false,
+ 'category' => false,
+ 'start_date' => false,
+ 'end_date' => false,
+ 'status' => false,
+ );
+ $this->args = wp_parse_args( $args, $defaults );
+
+ $sitename = sanitize_key( get_bloginfo( 'name' ) );
+ if ( ! empty( $sitename ) ) {
+ $sitename .= '.';
+ }
+ $date = gmdate( 'Y-m-d' );
+ $wp_filename = $sitename . 'WordPress.' . $date . '.wxz';
+ /**
+ * Export the export filename.
+ *
+ * @param string $wp_filename The name of the file for download.
+ * @param string $sitename The site name.
+ * @param string $date Today's date, formatted.
+ */
+ $this->filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date );
+ }
+
+ private function json_encode( $json ) {
+ return json_encode( $json, JSON_PRETTY_PRINT );
+ }
+
+ private function add_file( $filename, $content, $write_to_dir = false ) {
+ require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
+
+ $this->filelist[] = array(
+ PCLZIP_ATT_FILE_NAME => $filename,
+ PCLZIP_ATT_FILE_CONTENT => $content,
+ );
+
+ if ( $write_to_dir ) {
+ $dir = dirname( $filename );
+ $write_to_dir = rtrim( $write_to_dir, '/' ) . '/';
+ if ( ! file_exists( $write_to_dir . $dir ) ) {
+ mkdir( $write_to_dir . $dir, 0777, true );
+ }
+ file_put_contents( $write_to_dir . $filename, $content );
+ }
+
+ return $filename;
+ }
+
+ private function output_wxz() {
+ if ( empty( $this->filelist ) ) {
+ return new WP_Error( 'no-files', 'No files to write.' );
+ }
+
+ require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
+ $zip = tempnam( '/tmp/', $this->filename . '.zip' );
+
+ $archive = new PclZip( $zip );
+ // This two-step approach is needed to save the mimetype file uncompressed.
+ $archive->create( array(
+ array(
+ PCLZIP_ATT_FILE_NAME => 'mimetype',
+ PCLZIP_ATT_FILE_CONTENT => 'application/vnd.wordpress.export+zip',
+ ),
+ ),
+ PCLZIP_OPT_NO_COMPRESSION
+ );
+ // No we can add the actual files and use compression.
+ $archive->add( $this->filelist );
+
+ readfile( $zip );
+ unlink( $zip );
+ }
+
+ public function export() {
+ global $wpdb, $post;
+ // add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 );
+
+ if ( 'all' !== $this->args['content'] && post_type_exists( $this->args['content'] ) ) {
+ $ptype = get_post_type_object( $this->args['content'] );
+ if ( ! $ptype->can_export ) {
+ $this->args['content'] = 'post';
+ }
+
+ $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $this->args['content'] );
+ } else {
+ $post_types = get_post_types( array( 'can_export' => true ) );
+ $esses = array_fill( 0, count( $post_types ), '%s' );
+
+ // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
+ $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types );
+ }
+
+ if ( $this->args['status'] && ( 'post' === $this->args['content'] || 'page' === $this->args['content'] ) ) {
+ $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $this->args['status'] );
+ } else {
+ $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
+ }
+
+ $join = '';
+ if ( $this->args['category'] && 'post' === $this->args['content'] ) {
+ $term = term_exists( $this->args['category'], 'category' );
+ if ( $term ) {
+ $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
+ $where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] );
+ }
+ }
+
+ if ( in_array( $this->args['content'], array( 'post', 'page', 'attachment' ), true ) ) {
+ if ( $this->args['author'] ) {
+ $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $this->args['author'] );
+ }
+
+ if ( $this->args['start_date'] ) {
+ $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", gmdate( 'Y-m-d', strtotime( $this->args['start_date'] ) ) );
+ }
+
+ if ( $this->args['end_date'] ) {
+ $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", gmdate( 'Y-m-d', strtotime( '+1 month', strtotime( $this->args['end_date'] ) ) ) );
+ }
+ }
+
+ // Grab a snapshot of post IDs, just in case it changes during the export.
+ $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" );
+
+ /*
+ * Get the requested terms ready, empty unless posts filtered by category
+ * or all content.
+ */
+ $cats = array();
+ $tags = array();
+ $terms = array();
+ if ( isset( $term ) && $term ) {
+ $cat = get_term( $term['term_id'], 'category' );
+ $cats = array( $cat->term_id => $cat );
+ unset( $term, $cat );
+ } elseif ( 'all' === $this->args['content'] ) {
+ $categories = (array) get_categories( array( 'get' => 'all' ) );
+ $tags = (array) get_tags( array( 'get' => 'all' ) );
+
+ $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );
+ $custom_terms = (array) get_terms(
+ array(
+ 'taxonomy' => $custom_taxonomies,
+ 'get' => 'all',
+ )
+ );
+
+ // Put categories in order with no child going before its parent.
+ while ( $cat = array_shift( $categories ) ) {
+ if ( 0 == $cat->parent || isset( $cats[ $cat->parent ] ) ) {
+ $cats[ $cat->term_id ] = $cat;
+ } else {
+ $categories[] = $cat;
+ }
+ }
+
+ // Put terms in order with no child going before its parent.
+ while ( $t = array_shift( $custom_terms ) ) {
+ if ( 0 == $t->parent || isset( $terms[ $t->parent ] ) ) {
+ $terms[ $t->term_id ] = $t;
+ } else {
+ $custom_terms[] = $t;
+ }
+ }
+
+ unset( $categories, $custom_taxonomies, $custom_terms );
+ }
+
+ $this->add_file( 'site/config.json', $this->json_encode( $this->get_blog_details() ) );
+
+ $this->export_authors();
+ $this->export_nav_menu_terms();
+
+ foreach ( $cats as $c ) {
+ $this->add_file(
+ 'terms/' . intval( $c->term_id ) . '.json',
+ $this->json_encode( array(
+ 'version' => 1,
+ 'id' => intval( $c->term_id ),
+ 'taxonomy' => $c->taxonomy,
+ 'name' => $c->name,
+ 'slug' => $c->slug,
+ 'parent' => $c->parent ? $cats[ $c->parent ]->slug : '',
+ 'description' => $c->description,
+ 'termmeta' => $this->termmeta( $c ),
+ ) )
+ );
+ }
+
+ foreach ( $tags as $t ) {
+ $this->add_file(
+ 'terms/' . intval( $t->term_id ) . '.json',
+ $this->json_encode( array(
+ 'version' => 1,
+ 'id' => intval( $t->term_id ),
+ 'taxonomy' => $t->taxonomy,
+ 'name' => $t->name,
+ 'slug' => $t->slug,
+ 'description' => $t->description,
+ 'termmeta' => $this->termmeta( $t ),
+ ) )
+ );
+ }
+
+ foreach ( $terms as $t ) {
+ $this->add_file(
+ 'terms/' . intval( $t->term_id ) . '.json',
+ $this->json_encode( array(
+ 'version' => 1,
+ 'id' => intval( $t->term_id ),
+ 'taxonomy' => $t->taxonomy,
+ 'name' => $t->name,
+ 'slug' => $t->slug,
+ 'parent' => $t->parent ? $terms[ $t->parent ]->slug : '',
+ 'description' => $t->description,
+ 'termmeta' => $this->termmeta( $t ),
+ ) )
+ );
+ }
+
+ if ( 'all' === $this->args['content'] ) {
+ $this->export_nav_menu_terms();
+ }
+
+ if ( $post_ids ) {
+ /**
+ * @global WP_Query $wp_query WordPress Query object.
+ */
+ global $wp_query;
+
+ // Fake being in the loop.
+ $wp_query->in_the_loop = true;
+
+ // Fetch 20 posts at a time rather than loading the entire table into memory.
+ while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) {
+ $where = 'WHERE ID IN (' . implode( ',', $next_posts ) . ')';
+ $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );
+
+ // Begin Loop.
+ foreach ( $posts as $post ) {
+ setup_postdata( $post );
+
+ /**
+ * Filters the post title used for WXR exports.
+ *
+ * @since 5.7.0
+ *
+ * @param string $post_title Title of the current post.
+ */
+ $title = apply_filters( 'the_title_export', $post->post_title );
+
+ /**
+ * Filters the post content used for WXR exports.
+ *
+ * @since 2.5.0
+ *
+ * @param string $post_content Content of the current post.
+ */
+ $content = apply_filters( 'the_content_export', $post->post_content );
+
+ /**
+ * Filters the post excerpt used for WXR exports.
+ *
+ * @since 2.6.0
+ *
+ * @param string $post_excerpt Excerpt for the current post.
+ */
+ $excerpt = apply_filters( 'the_excerpt_export', $post->post_excerpt );
+
+ $is_sticky = is_sticky( $post->ID ) ? 1 : 0;
+
+ $data = array(
+ 'version' => 1,
+ 'title' => $title,
+ 'author' => get_the_author_meta( 'login' ),
+ 'status' => $post->post_status,
+ 'content' => $content,
+ 'excerpt' => $excerpt,
+ 'type' => $post->post_type,
+ 'parent' => $post->post_parent,
+ 'password' => $post->post_password,
+ 'comment_status' => $post->comment_status,
+ 'ping_status' => $post->ping_status,
+ 'menu_order' => intval( $post->menu_order ),
+ 'is_sticky' => $is_sticky,
+ 'date_utc' => $post->post_date_gmt,
+ 'date_modified_utc' => $post->post_modified_gmt,
+ 'postmeta' => $this->postmeta( $post->ID ),
+ );
+
+ if ( 'attachment' === $post->post_type ) {
+ $data['attachment_url'] = wp_get_attachment_url( $post->ID );
+ }
+
+ $this->add_file(
+ 'posts/' . intval( $post->ID ) . '.json',
+ $this->json_encode( $data )
+ );
+
+ }
+ }
+ }
+
+ header( 'Content-Description: File Transfer' );
+ header( 'Content-Disposition: attachment; filename=' . $this->filename );
+ header( 'Content-Type: application/zip; charset=' . get_option( 'blog_charset' ), true );
+
+ $this->output_wxz();
+ }
+
+ private function get_blog_details() {
+ if ( is_multisite() ) {
+ // Multisite: the base URL.
+ $base_site_url = network_home_url();
+ } else {
+ // WordPress (single site): the blog URL.
+ $base_site_url = get_bloginfo_rss( 'url' );
+ }
+
+ return array(
+ 'version' => 1,
+ 'title' => get_bloginfo_rss( 'name' ),
+ 'link' => get_bloginfo_rss( 'url' ),
+ 'description' => get_bloginfo_rss( 'description' ),
+ 'date' => gmdate( 'D, d M Y H:i:s +0000' ),
+ 'language' => get_bloginfo_rss( 'language' ),
+ 'base_site_url' => $base_site_url,
+ 'base_blog_url' => get_bloginfo_rss( 'url' ),
+ );
+ }
+
+ /**
+ * Export list of authors with posts
+ *
+ * @global wpdb $wpdb WordPress database abstraction object.
+ *
+ * @param int[] $post_ids Optional. Array of post IDs to filter the query by.
+ */
+ private function export_authors( array $post_ids = null ) {
+ global $wpdb;
+
+ if ( ! empty( $post_ids ) ) {
+ $post_ids = array_map( 'absint', $post_ids );
+ $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')';
+ } else {
+ $and = '';
+ }
+
+ $authors = array();
+ $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" );
+ foreach ( (array) $results as $result ) {
+ $authors[] = get_userdata( $result->post_author );
+ }
+
+ $authors = array_filter( $authors );
+
+ foreach ( $authors as $author ) {
+ $this->add_file(
+ 'users/' . intval( $author->ID ) . '.json',
+ $this->json_encode( array(
+ 'version' => 1,
+ 'id' => intval( $author->ID ),
+ 'username' => $author->user_login,
+ 'display_name' => $author->display_name,
+ 'email' => $author->user_email,
+ ) )
+ );
+ // echo "\t";
+ // echo '' . (int) $author->ID . '';
+ // echo '' . wxr_cdata( $author->user_login ) . '';
+ // echo '' . wxr_cdata( $author->user_email ) . '';
+ // echo '' . wxr_cdata( $author->display_name ) . '';
+ // echo '' . wxr_cdata( $author->first_name ) . '';
+ // echo '' . wxr_cdata( $author->last_name ) . '';
+ // echo "\n";
+ }
+ }
+
+ /**
+ * Export all navigation menu terms
+ */
+ private function export_nav_menu_terms() {
+ $nav_menus = wp_get_nav_menus();
+ if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) {
+ return;
+ }
+
+ foreach ( $nav_menus as $menu ) {
+ $this->add_file(
+ 'terms/' . intval( $menu->term_id ) . '.json',
+ $this->json_encode( array(
+ 'taxonomy' => 'nav_menu',
+ 'name' => $menu->name,
+ 'slug' => $menu->slug,
+ ) )
+ );
+
+ // echo "\t";
+ // echo '' . (int) $menu->term_id . '';
+ // echo 'nav_menu';
+ // echo '' . wxr_cdata( $menu->slug ) . '';
+ // wxr_term_name( $menu );
+ // echo "\n";
+ }
+ }
+
+ /**
+ * Export list of taxonomy terms, in XML tag format, associated with a post
+ */
+ function export_post_taxonomy() {
+ $post = get_post();
+
+ $taxonomies = get_object_taxonomies( $post->post_type );
+ if ( empty( $taxonomies ) ) {
+ return;
+ }
+ $terms = wp_get_object_terms( $post->ID, $taxonomies );
+
+ foreach ( (array) $terms as $term ) {
+ $this->add_file(
+ 'categories/' . intval( $term->term_id ) . '.json',
+ $this->json_encode( array(
+ 'taxonomy' => $term->taxonomy,
+ 'name' => $term->name,
+ 'slug' => $term->slug,
+ ) )
+ );
+
+ // echo "\t\ttaxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "\n";
+ }
+ }
+
+ private function termmeta( $term ) {
+ global $wpdb;
+
+ $termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) );
+
+ $metadata = array();
+ foreach ( $termmeta as $meta ) {
+ /**
+ * Filters whether to selectively skip term meta used for WXR exports.
+ *
+ * Returning a truthy value from the filter will skip the current meta
+ * object from being exported.
+ *
+ * @since 4.6.0
+ *
+ * @param bool $skip Whether to skip the current piece of term meta. Default false.
+ * @param string $meta_key Current meta key.
+ * @param object $meta Current meta object.
+ */
+ if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) {
+ $metadata[ $meta->meta_key ] = $meta->meta_value;
+ }
+ }
+
+ return $metadata;
+ }
+ private function postmeta( $id ) {
+ global $wpdb;
+
+ $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $id ) );
+ $metadata = array();
+ foreach ( $postmeta as $meta ) {
+ /**
+ * Filters whether to selectively skip post meta used for WXR exports.
+ *
+ * Returning a truthy value from the filter will skip the current meta
+ * object from being exported.
+ *
+ * @since 3.3.0
+ *
+ * @param bool $skip Whether to skip the current post meta. Default false.
+ * @param string $meta_key Current meta key.
+ * @param object $meta Current meta object.
+ */
+ if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) {
+ continue;
+ }
+ $metadata[ $meta->meta_key ] = $meta->meta_value;
+ }
+
+ return $metadata;
+ }
+}
diff --git a/packages/playground/compile-wordpress/build-assets/import-wxz.patch b/packages/playground/compile-wordpress/build-assets/import-wxz.patch
new file mode 100644
index 00000000..38337e72
--- /dev/null
+++ b/packages/playground/compile-wordpress/build-assets/import-wxz.patch
@@ -0,0 +1,208 @@
+From d292004007c1cabf3a7f1f482eee1a7700cea9ee Mon Sep 17 00:00:00 2001
+From: Alex Kirk
+Date: Wed, 23 Jun 2021 17:20:20 +0200
+Subject: [PATCH 1/2] First pass at WXZ importer
+Source: https://github.com/WordPress/wordpress-importer/compare/master...akirk:wordpress-importer:import-wxz.patch
+
+---
+ src/class-wp-import.php | 7 +-
+ src/parsers/class-wxz-parser.php | 122 +++++++++++++++++++++++++++++++
+ src/wordpress-importer.php | 3 +
+ 3 files changed, 131 insertions(+), 1 deletion(-)
+ create mode 100644 src/parsers/class-wxz-parser.php
+
+diff --git a/src/class-wp-import.php b/src/class-wp-import.php
+index c475955..22097b4 100644
+--- a/src/class-wp-import.php
++++ b/src/class-wp-import.php
+@@ -1298,7 +1298,12 @@ function remap_featured_images() {
+ * @return array Information gathered from the WXR file
+ */
+ function parse( $file ) {
+- $parser = new WXR_Parser();
++ if ( 'wxz' === strtolower( pathinfo( $file, PATHINFO_EXTENSION ) ) || str_ends_with( strtolower( $file ), '.wxz_.txt' ) || str_ends_with( strtolower( $file ), '.wxz.txt' ) ) {
++ $parser = new WXZ_Parser();
++ } else {
++ // Legacy WXR parser
++ $parser = new WXR_Parser();
++ }
+ return $parser->parse( $file );
+ }
+
+diff --git a/src/parsers/class-wxz-parser.php b/src/parsers/class-wxz-parser.php
+new file mode 100644
+index 0000000..1120e12
+--- /dev/null
++++ b/src/parsers/class-wxz-parser.php
+@@ -0,0 +1,122 @@
++extract( PCLZIP_OPT_EXTRACT_AS_STRING );
++
++ foreach ( $archive_files as $file ) {
++ if ( $file['folder'] ) {
++ continue;
++ }
++
++ $type = dirname( $file['filename'] );
++ $name = basename( $file['filename'], '.json' );
++ $item = json_decode( $file['content'], true );
++
++ if ( 'site' === $type && 'config' === $name ) {
++ if ( isset( $item['link'])) {
++ $base_url = $item['link'];
++ }
++ continue;
++ }
++
++ $id = intval( $name );
++ if ( 'users' === $type ) {
++ $author = array(
++ 'author_id' => (int) $id,
++ 'author_login' => (string) $item['username'],
++ 'author_display_name' => (string) $item['display_name'],
++ 'author_email' => (string) $item['email'],
++ );
++
++ $authors[] = $author;
++ continue;
++ }
++
++ if ( 'posts' === $type ) {
++ $post = array(
++ 'post_id' => (int) $id,
++ 'post_title' => (string) $item['title'],
++ 'post_content' => (string) $item['content'],
++ 'post_type' => (string) $item['type'],
++ 'guid' => (string) $item['guid'],
++ 'status' => (string) $item['status'],
++ 'post_parent' => (string) $item['parent'],
++ 'post_name' => (string) $item['slug'],
++ 'post_excerpt' => (string) $item['excerpt'],
++ 'post_status' => (string) $item['status'],
++ 'post_date' => (string) $item['date_utc'],
++ 'post_date_gmt' => (string) $item['date_utc'],
++ 'post_author' => (string) $item['author'],
++ 'post_password' => (string) $item['password'],
++ 'comment_status' => (string) $item['comment_status'],
++ 'ping_status' => (string) $item['ping_status'],
++ 'menu_order' => (string) $item['menu_order'],
++ 'attachment_url' => (string) $item['attachment_url'],
++ 'postmeta' => (string) $item['postmeta'],
++ );
++
++ $posts[] = $post;
++ continue;
++ }
++
++ if ( 'terms' === $type ) {
++ $term = array(
++ 'term_id' => (int) $id,
++ 'term_taxonomy' => (string) $item['taxonomy'],
++ 'slug' => (string) $item['slug'],
++ 'term_parent' => (string) $item['parent'],
++ 'term_name' => (string) $item['name'],
++ 'term_description' => (string) $item['description'],
++ );
++
++ $terms[] = $term;
++ continue;
++ }
++
++ if ( 'categories' === $type ) {
++ $category = array(
++ 'term_id' => (int) $id,
++ 'category_nicename' => (string) $item['name'],
++ 'category_parent' => (string) $item['parent'],
++ 'cat_name' => (string) $item['slug'],
++ 'category_description' => (string) $item['description'],
++ );
++
++ $categories[] = $category;
++ continue;
++ }
++
++ if ( 'objects' === $type ) {
++ $object = array(
++ 'object_id' => (int) $id,
++ 'type' => (string) $item['type'],
++ 'data' => $item['data'],
++ );
++
++ $objects[] = $object;
++ continue;
++ }
++ }
++
++ return array(
++ 'authors' => $authors,
++ 'posts' => $posts,
++ 'categories' => $categories,
++ 'terms' => $terms,
++ 'base_url' => $base_url,
++ 'base_blog_url' => $base_blog_url,
++ );
++ }
++}
+diff --git a/src/wordpress-importer.php b/src/wordpress-importer.php
+index 76af562..76695de 100644
+--- a/src/wordpress-importer.php
++++ b/src/wordpress-importer.php
+@@ -48,6 +48,9 @@
+ /** WXR_Parser_Regex class */
+ require_once dirname( __FILE__ ) . '/parsers/class-wxr-parser-regex.php';
+
++/** WXZ_Parser class */
++require_once dirname( __FILE__ ) . '/parsers/class-wxz-parser.php';
++
+ /** WP_Import class */
+ require_once dirname( __FILE__ ) . '/class-wp-import.php';
+
+
+From 545442290456e4acb987ff67fe34d8f5a9770ce6 Mon Sep 17 00:00:00 2001
+From: Alex Kirk
+Date: Tue, 29 Jun 2021 11:48:31 +0200
+Subject: [PATCH 2/2] Add mimetype check
+
+---
+ src/parsers/class-wxz-parser.php | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/src/parsers/class-wxz-parser.php b/src/parsers/class-wxz-parser.php
+index 1120e12..b816826 100644
+--- a/src/parsers/class-wxz-parser.php
++++ b/src/parsers/class-wxz-parser.php
+@@ -15,6 +15,20 @@ function parse( $file ) {
+ $archive = new PclZip( $file );
+ $archive_files = $archive->extract( PCLZIP_OPT_EXTRACT_AS_STRING );
+
++ $mimetype_exists = false;
++ foreach ( $archive_files as $file ) {
++ if ( 'mimetype' === $file['filename'] ) {
++ if ( 'application/vnd.wordpress.export+zip' === trim( $file['content'] ) ) {
++ $mimetype_exists = true;
++ }
++ break;
++ }
++ }
++
++ if ( ! $mimetype_exists ) {
++ return new WP_Error( 'invalid-file', 'Invalid WXZ fiel, mimetype declaration missing.' );
++ }
++
+ foreach ( $archive_files as $file ) {
+ if ( $file['folder'] ) {
+ continue;
\ No newline at end of file
diff --git a/packages/playground/remote/src/lib/wordpress-patch/index.ts b/packages/playground/remote/src/lib/wordpress-patch/index.ts
index 5c0e7643..d97562ef 100644
--- a/packages/playground/remote/src/lib/wordpress-patch/index.ts
+++ b/packages/playground/remote/src/lib/wordpress-patch/index.ts
@@ -44,31 +44,21 @@ class WordPressPatcher {
for (const missingSvg of missingSvgs) {
this.#php.writeFile(missingSvg, '');
}
- this.#adjustPathsAndUrls();
+ this.patchSiteUrl();
this.#disableSiteHealth();
this.#disableWpNewBlogNotification();
this.#replaceRequestsTransports();
}
- #adjustPathsAndUrls() {
+ patchSiteUrl() {
this.#patchFile(
`${DOCROOT}/wp-config.php`,
(contents) =>
- `${contents} define('WP_HOME', '${JSON.stringify(DOCROOT)}');`
- );
-
- // Force the site URL to be $scopedSiteUrl:
- // Interestingly, it doesn't work when put in a mu-plugin.
- this.#patchFile(
- `${DOCROOT}/wp-includes/plugin.php`,
- (contents) =>
- contents +
- `
- function _wasm_wp_force_site_url() {
- return ${JSON.stringify(this.#scopedSiteUrl)};
+ `${contents}`
);
}
#disableSiteHealth() {
diff --git a/packages/playground/remote/src/wordpress/wp-6.2.data b/packages/playground/remote/src/wordpress/wp-6.2.data
index e1bffd29..7c813984 100755
--- a/packages/playground/remote/src/wordpress/wp-6.2.data
+++ b/packages/playground/remote/src/wordpress/wp-6.2.data
@@ -13686,7 +13686,7 @@ if ( current_user_can( 'customize' ) ) { printf( ' Gravatar.1comment
ü ü
- ç ç 3 12023-04-09 16:24:51
- é é 3 2023-04-09 16:24:51
+ ç ç 3 12023-04-18 12:56:28
+ é é 3 2023-04-18 12:56:28
ü ü
å å ; wapuu@wordpress.example
- ñ 7ûöñì 6k 4d 3U
-Ü ~q ”´ÿq
}¤ÀhO4mõ
¤QËß
k
+ ö 6ûö 4d 3U
+ z
}¤ÀhO4mõ
¤QËß
k
Ã
ß
F
AŒÓC
@@ -13811,10 +13811,10 @@ S
7
•¤·Ì8 Ñ åaáq~n³±´I ]
92ëÛPqy” ûÉd
-øúÏÏ "G_site_transient_update_themes €C_site_transient_theme_roots'S_site_transient_timeout_theme_roots~ # C_site_transient_update_core|7_transient_doing_cronz1widget_custom_htmly+widget_nav_menux-widget_tag_cloudw9widget_recent-commentsv3widget_recent-postsu!nonce_saltt
nonce_keys'widget_searchr#widget_metaq1widget_media_videop5widget_media_galleryo1widget_media_imagen1widget_media_audiom+widget_archivesl+widget_calendark%widget_pagesjcroni-sidebars_widgetsh%widget_blockg!user_countf!fresh_sitee'wp_user_rolesd1initial_db_versionc Ewp_force_deactivated_pluginsb9auto_update_core_majora9auto_update_core_minor`5auto_update_core_dev_#Kauto_plugin_theme_update_emails^Ccomment_previously_approved]+disallowed_keys\5admin_email_lifespan[ Eshow_comments_cookies_opt_inZAwp_page_for_privacy_policyY3medium_large_size_hX3medium_large_size_wW
site_iconV#Kfinished_splitting_shared_termsU5link_manager_enabledT3default_post_formatS'page_on_frontR)page_for_postsQ+timezone_stringP/uninstall_pluginsO!widget_rssN#widget_textM/widget_categoriesL%sticky_postsK'comment_orderJ7default_comments_pageI/comments_per_pageH'page_commentsG7thread_comments_depthF+thread_commentsE;close_comments_days_oldD Eclose_comments_for_old_postsC3image_default_alignB1image_default_sizeA;image_default_link_type@%large_size_h?%large_size_w>)avatar_default='medium_size_h<'medium_size_w;)thumbnail_crop:-thumbnail_size_h9-thumbnail_size_w8+upload_url_path7'avatar_rating6%show_avatars5tag_base4'show_on_front37default_link_category2#blog_public1#upload_path0!Guploads_use_yearmonth_folders/!db_version.%default_role-'use_trackback,
html_type+5comment_registration*!stylesheet)template(+recently_edited'9default_email_category&!gmt_offset%/comment_max_links$!ping_sites#'category_base")active_plugins!+moderation_keys %blog_charset
hack_file'rewrite_rules3permalink_structure/moderation_notify1comment_moderation?links_updated_date_format#time_format#date_format)posts_per_page7default_pingback_flag3default_ping_status9default_comment_status-default_category+mailserver_port+mailserver_pass-mailserver_login)mailserver_url+rss_use_excerpt
'posts_per_rss+comments_notify1require_name_email
+øúÏ 7_transient_doing_cronz1widget_custom_htmly+widget_nav_menux-widget_tag_cloudw9widget_recent-commentsv3widget_recent-postsu!nonce_saltt
nonce_keys'widget_searchr#widget_metaq1widget_media_videop5widget_media_galleryo1widget_media_imagen1widget_media_audiom+widget_archivesl+widget_calendark%widget_pagesjcroni-sidebars_widgetsh%widget_blockg!user_countf!fresh_sitee'wp_user_rolesd1initial_db_versionc Ewp_force_deactivated_pluginsb9auto_update_core_majora9auto_update_core_minor`5auto_update_core_dev_#Kauto_plugin_theme_update_emails^Ccomment_previously_approved]+disallowed_keys\5admin_email_lifespan[ Eshow_comments_cookies_opt_inZAwp_page_for_privacy_policyY3medium_large_size_hX3medium_large_size_wW
site_iconV#Kfinished_splitting_shared_termsU5link_manager_enabledT3default_post_formatS'page_on_frontR)page_for_postsQ+timezone_stringP/uninstall_pluginsO!widget_rssN#widget_textM/widget_categoriesL%sticky_postsK'comment_orderJ7default_comments_pageI/comments_per_pageH'page_commentsG7thread_comments_depthF+thread_commentsE;close_comments_days_oldD Eclose_comments_for_old_postsC3image_default_alignB1image_default_sizeA;image_default_link_type@%large_size_h?%large_size_w>)avatar_default='medium_size_h<'medium_size_w;)thumbnail_crop:-thumbnail_size_h9-thumbnail_size_w8+upload_url_path7'avatar_rating6%show_avatars5tag_base4'show_on_front37default_link_category2#blog_public1#upload_path0!Guploads_use_yearmonth_folders/!db_version.%default_role-'use_trackback,
html_type+5comment_registration*!stylesheet)template(+recently_edited'9default_email_category&!gmt_offset%/comment_max_links$!ping_sites#'category_base")active_plugins!+moderation_keys %blog_charset
hack_file'rewrite_rules3permalink_structure/moderation_notify1comment_moderation?links_updated_date_format#time_format#date_format)posts_per_page7default_pingback_flag3default_ping_status9default_comment_status-default_category+mailserver_port+mailserver_pass-mailserver_login)mailserver_url+rss_use_excerpt
'posts_per_rss+comments_notify1require_name_email
#use_smilies +use_balanceTags'start_of_week#admin_email1users_can_register+blogdescriptionblognamehome
siteurl
-+ ~ Ë
Œ
%
×pi2$ùñéáÙÑÉÁ¹±©¡™‘‰yqiaYQIA91)! úòêâÚÒû³«£›“‹ƒ{skc[SKC;3+#
û
ó
ë
ã
Û
Ó
Ë
Ã
»
³
«
£
›
“
„
|
t
l
d
\
T
L
D
<
4
,
þöîæÞÏÇ¿·¯§Ÿ—‡waYQIA99 no €nono~ no|yeszyesyyesxyeswyesvyesunotnosyesryesqyespyesoyesnyesmyeslyeskyesjyesiyeshyesgnofyeseyesdyescyesbyesayes`yes_no^yes]no\yes[yesZyesYyesXyesWyesVyesUyesTyesSyesRyesQyesPnoOyesNyesMyesLyesKyesJyesIyesHyesGyesFyesEyesDyesCyesByesAyes@yes?yes>yes=yes<yes;yes:yes9yes8yes7yes6yes5yes4yes3yes2yes1yes0yes/yes.yes-yes,yes+yes*yes)yes(no'yes&yes%yes$yes#yes"yes!no yesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyes
yesyesyes
+ z9 Ë
Œ
%
×piùñéáÙÑÉÁ¹±©¡™‘‰yqiaYQIA91)! úòêâÚÒû³«£›“‹ƒ{skc[SKC;3+#
û
ó
ë
ã
Û
Ó
Ë
Ã
»
³
«
£
›
“
„
|
t
l
d
\
T
L
D
<
4
,
þöîæÞÏÇ¿·¯§Ÿ—‡waYQIA9 yeszyesyyesxyeswyesvyesunotnosyesryesqyespyesoyesnyesmyeslyeskyesjyesiyeshyesgnofyeseyesdyescyesbyesayes`yes_no^yes]no\yes[yesZyesYyesXyesWyesVyesUyesTyesSyesRyesQyesPnoOyesNyesMyesLyesKyesJyesIyesHyesGyesFyesEyesDyesCyesByesAyes@yes?yes>yes=yes<yes;yes:yes9yes8yes7yes6yes5yes4yes3yes2yes1yes0yes/yes.yes-yes,yes+yes*yes)yes(no'yes&yes%yes$yes#yes"yes!no yesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyes
yesyesyes
yes yesyesyesyesyesyesyes yes
À àÀ /_wp_page_templatedefault /_wp_page_templatedefault
õ ûõ
Õ ëÕ /_wp_page_template/ _wp_page_template
^ Πݺ—qM+Ù¹“jB
ñ
Æ
¡
~
V
-
ײg>øÚ¸™zA
@@ -13823,7 +13823,7 @@ S
7
k
- ú à … Y æµg6Ù¦NñÌ£Z.ܪOäµ€X6ïË¡|Q1íË©‚V/è»”i> ö Î &^#5wp_postmetawp_postmeta__post_idKEY!]#!wp_postmetameta_valuelongtext#\#%wp_postmetameta_keyvarchar(255))[#3wp_postmetapost_idbigint(20) unsigned)Z#3wp_postmetameta_idbigint(20) unsigned%Y!5wp_optionswp_options__autoloadKEY+X!;wp_optionswp_options__option_nameUNIQUE!W!#wp_optionsautoloadvarchar(20)"V!%wp_optionsoption_valuelongtext%U!#%wp_optionsoption_namevarchar(191)*T!3wp_optionsoption_idbigint(20) unsigned%S9wp_linkswp_links__link_visibleKEY R%wp_linkslink_rssvarchar(255) Q!!wp_linkslink_notesmediumtext P%wp_linkslink_relvarchar(255) O%wp_linkslink_updateddatetimeN#wp_linkslink_ratingint(11))M!3wp_linkslink_ownerbigint(20) unsigned#L%#wp_linkslink_visiblevarchar(20)(K-%wp_linkslink_descriptionvarchar(255)"J##wp_linkslink_targetvarchar(25)"I!%wp_linkslink_imagevarchar(255)!H%wp_linkslink_namevarchar(255) G%wp_linkslink_urlvarchar(255)&F3wp_linkslink_idbigint(20) unsigned3E#Owp_commentswp_comments__comment_author_emailKEY-D#Cwp_commentswp_comments__comment_parentKEY/C#Gwp_commentswp_comments__comment_date_gmtKEY8B#Ywp_commentswp_comments__comment_approved_date_gmtKEY.A#Ewp_commentswp_comments__comment_post_IDKEY)@#3wp_commentsuser_idbigint(20) unsigned0?#)3wp_commentscomment_parentbigint(20) unsigned&>#%#wp_commentscomment_typevarchar(20)(=#'%wp_commentscomment_agentvarchar(255)*<#-#wp_commentscomment_approvedvarchar(20)#;#'wp_commentscomment_karmaint(11)":#+wp_commentscomment_contenttext'9#-wp_commentscomment_date_gmtdatetime#8#%wp_commentscomment_datedatetime,7#/%wp_commentscomment_author_IPvarchar(100)-6#1%wp_commentscomment_author_urlvarchar(200)/5#5%wp_commentscomment_author_emailvarchar(100)%4#)wp_commentscomment_authortinytext13#+3wp_commentscomment_post_IDbigint(20) unsigned,2#!3wp_commentscomment_IDbigint(20) unsigned-1)=wp_commentmetawp_commentmeta__meta_keyKEY/0)Awp_commentmetawp_commentmeta__comment_idKEY$/)!wp_commentmetameta_valuelongtext&.)%wp_commentmetameta_keyvarchar(255)/-)!3wp_commentmetacomment_idbigint(20) unsigned,,)3wp_commentmetameta_idbigint(20) unsignedC+7[wp_term_relationshipswp_term_relationships__term_taxonomy_idKEY**7!wp_term_relationshipsterm_orderint(11)<)7-3wp_term_relationshipsterm_taxonomy_idbigint(20) unsigned5(73wp_term_relationshipsobject_idbigint(20) unsigned1'-Awp_term_taxonomywp_term_taxonomy__taxonomyKEY<&-Qwp_term_taxonomywp_term_taxonomy__term_id_taxonomyUNIQUE#%-!wp_term_taxonomycountbigint(20)-$-3wp_term_taxonomyparentbigint(20) unsigned'#-#wp_term_taxonomydescriptionlongtext'"-#wp_term_taxonomytaxonomyvarchar(32).!-3wp_term_taxonomyterm_idbigint(20) unsigned7 --3wp_term_taxonomyterm_taxonomy_idbigint(20) unsigned)wp_termswp_terms__nameKEY)wp_termswp_terms__slugKEY !!wp_termsterm_groupbigint(10)%wp_termsslugvarchar(200)%wp_termsnamevarchar(200)&3wp_termsterm_idbigint(20) unsigned'#7wp_termmetawp_termmeta__meta_keyKEYwp_termmetawp_termmeta__term_idKEY!#!wp_termmetameta_valuelongtext##%wp_termmetameta_keyvarchar(255))#3wp_termmetaterm_idbigint(20) unsigned)#3wp_termmetameta_idbigint(20) unsigned'#7wp_usermetawp_usermeta__meta_keyKEYwp_usermetawp_usermeta__user_idKEY!#!wp_usermetameta_valuelongtext##%wp_usermetameta_keyvarchar(255))#3wp_usermetauser_idbigint(20) unsigned*#3wp_usermetaumeta_idbigint(20) unsigned#
5wp_userswp_users__user_emailKEY&;wp_userswp_users__user_nicenameKEY'=wp_userswp_users__user_login_keyKEY$
-%%wp_usersdisplay_namevarchar(250) #wp_usersuser_statusint(11)+3%wp_usersuser_activation_keyvarchar(255)#+wp_usersuser_registereddatetime %wp_usersuser_urlvarchar(100)"!%wp_usersuser_emailvarchar(100)$'#wp_usersuser_nicenamevarchar(50)!%wp_usersuser_passvarchar(255)!!#wp_usersuser_loginvarchar(60)!3wp_usersIDbigint(20) unsigned
×´ˆiF$êÆŸ{T1
Ý
¶
‹
_
A
"
سd> $z7wp_postswp_posts__post_authorKEY$y7wp_postswp_posts__post_parentKEY)xAwp_postswp_posts__type_status_dateKEY"w3wp_postswp_posts__post_nameKEY#v'!wp_postscomment_countbigint(20)&u)%wp_postspost_mime_typevarchar(100) t#wp_postspost_typevarchar(20)s!wp_postsmenu_orderint(11)r%wp_postsguidvarchar(255)*q#3wp_postspost_parentbigint(20) unsigned)p7wp_postspost_content_filteredlongtext%o/wp_postspost_modified_gmtdatetime!n'wp_postspost_modifieddatetimemwp_postspingedtextlwp_poststo_pingtext!k%wp_postspost_namevarchar(200)%j'%wp_postspost_passwordvarchar(255)"i##wp_postsping_statusvarchar(20)%h)#wp_postscomment_statusvarchar(20)"g##wp_postspost_statusvarchar(20)f%wp_postspost_excerpttexte!wp_postspost_titletext d%wp_postspost_contentlongtext!c'wp_postspost_date_gmtdatetimebwp_postspost_datedatetime*a#3wp_postspost_authorbigint(20) unsigned!`3wp_postsIDbigint(20) unsigned'_#7wp_postmetawp_postmeta__meta_keyKEY
Ë 8 ª( 33Ñu)
)
33
M
2023-04-09 16:24:512023-04-09 16:24:51Who we are
Suggested text: Our website address is: http://127.0.0.1:8000.
Comments
Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.
Media
Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download a 5‹ 33“M#
#
33
M
2023-04-09 16:24:512023-04-09 16:24:51
+%%wp_usersdisplay_namevarchar(250) #wp_usersuser_statusint(11)+3%wp_usersuser_activation_keyvarchar(255)#+wp_usersuser_registereddatetime %wp_usersuser_urlvarchar(100)"!%wp_usersuser_emailvarchar(100)$'#wp_usersuser_nicenamevarchar(50)!%wp_usersuser_passvarchar(255)!!#wp_usersuser_loginvarchar(60)!3wp_usersIDbigint(20) unsigned
×´ˆiF$êÆŸ{T1
Ý
¶
‹
_
A
"
سd> $z7wp_postswp_posts__post_authorKEY$y7wp_postswp_posts__post_parentKEY)xAwp_postswp_posts__type_status_dateKEY"w3wp_postswp_posts__post_nameKEY#v'!wp_postscomment_countbigint(20)&u)%wp_postspost_mime_typevarchar(100) t#wp_postspost_typevarchar(20)s!wp_postsmenu_orderint(11)r%wp_postsguidvarchar(255)*q#3wp_postspost_parentbigint(20) unsigned)p7wp_postspost_content_filteredlongtext%o/wp_postspost_modified_gmtdatetime!n'wp_postspost_modifieddatetimemwp_postspingedtextlwp_poststo_pingtext!k%wp_postspost_namevarchar(200)%j'%wp_postspost_passwordvarchar(255)"i##wp_postsping_statusvarchar(20)%h)#wp_postscomment_statusvarchar(20)"g##wp_postspost_statusvarchar(20)f%wp_postspost_excerpttexte!wp_postspost_titletext d%wp_postspost_contentlongtext!c'wp_postspost_date_gmtdatetimebwp_postspost_datedatetime*a#3wp_postspost_authorbigint(20) unsigned!`3wp_postsIDbigint(20) unsigned'_#7wp_postmetawp_postmeta__meta_keyKEY
Ë 8 ª( 33Ñu)
)
33
M
2023-04-18 12:56:282023-04-18 12:56:28
Who we are
Suggested text: Our website address is: http://127.0.0.1:8000.
Comments
Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.
Media
Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download a 5‹ 33“M#
#
33
M
2023-04-18 12:56:282023-04-18 12:56:28
This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:
@@ -13841,9 +13841,9 @@ k
As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!
-Sample Pagepublishclosedopensample-page2023-04-09 16:24:512023-04-09 16:24:51http://127.0.0.1:8000/?page_id=2page‚2 33‚%
#
33
A
2023-04-09 16:24:512023-04-09 16:24:51
+Sample Pagepublishclosedopensample-page2023-04-18 12:56:282023-04-18 12:56:28http://127.0.0.1:8000/?page_id=2page‚2 33‚%
#
33
A
2023-04-18 12:56:282023-04-18 12:56:28
Welcome to WordPress. This is your first post. Edit or delete it, then start writing!
-Hello world!publishopenopenhello-world2023-04-09 16:24:512023-04-09 16:24:51http://127.0.0.1:8000/?p=1post
Ë }
“¤6Ũ@§9Ë l,7indexwp_posts__post_authorwp_posts2CREATE INDEX "wp_posts__post_author" ON "wp_posts" ("post_author")l+7indexwp_posts__post_parentwp_posts1CREATE INDEX "wp_posts__post_parent" ON "wp_posts" ("post_parent")*A[indexwp_posts__type_status_datewp_posts0CREATE INDEX "wp_posts__type_status_date" ON "wp_posts" ("post_type", "post_status", "post_date", "ID")f)3 indexwp_posts__post_namewp_posts/CREATE INDEX "wp_posts__post_name" ON "wp_posts" ("post_name")Š(”tablewp_postswp_posts-CREATE TABLE "wp_posts" (
+Hello world!publishopenopenhello-world2023-04-18 12:56:282023-04-18 12:56:28http://127.0.0.1:8000/?p=1post
Ë }
“¤6Ũ@§9Ë l,7indexwp_posts__post_authorwp_posts2CREATE INDEX "wp_posts__post_author" ON "wp_posts" ("post_author")l+7indexwp_posts__post_parentwp_posts1CREATE INDEX "wp_posts__post_parent" ON "wp_posts" ("post_parent")*A[indexwp_posts__type_status_datewp_posts0CREATE INDEX "wp_posts__type_status_date" ON "wp_posts" ("post_type", "post_status", "post_date", "ID")f)3 indexwp_posts__post_namewp_posts/CREATE INDEX "wp_posts__post_name" ON "wp_posts" ("post_name")Š(”tablewp_postswp_posts-CREATE TABLE "wp_posts" (
"ID" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"post_author" integer NOT NULL DEFAULT '0',
"post_date" text NOT NULL DEFAULT '0000-00-00 00:00:00' COLLATE NOCASE,
@@ -13876,17 +13876,13 @@ k
"option_value" text NOT NULL COLLATE NOCASE,
"autoload" text NOT NULL DEFAULT 'yes' COLLATE NOCASE)o!9indexwp_links__link_visiblewp_links$CREATE INDEX "wp_links__link_visible" ON "wp_links" ("link_visible")
Î ñÎá )privacy-policy#sample-page# hello-world
- ´Û $3pagedraft2023-04-09 16:24:51&3pagepublish2023-04-09 16:24:51$3 postpublish2023-04-09 16:24:51
+ ´Û $3pagedraft2023-04-18 12:56:28&3pagepublish2023-04-18 12:56:28$3 postpublish2023-04-18 12:56:28
ò ü÷ò
ò ü÷ò
# UD Ú·‘x[3ëδ›Y.
ñ
Ö
²
‘
q
W
<
"óÖº†tYA2ÞÂŒtQ,
ñÙ¹ xcM-ÿèзš}dJ0÷ݸœX5ûãÆ¡‡kJ/õÜënDܵuO!üÕ®‚aa I 3ipermalink_structure/index.php/%year%/%monthnum%/%day%/%postname%/yesa1 (U Kfinished_splitting_shared_terms1yesT 5link_manager_enabled0yesS 3default_post_format0yesR 'page_on_front0yesQ )page_for_posts0yesP +
timezone_stringyesO /uninstall_pluginsa:0:{}noN !widget_rssa:0:{}yesM #widget_texta:0:{}yesL /widget_categoriesa:0:{}yesK %sticky_postsa:0:{}yesJ 'comment_orderascyes#I 7default_comments_pagenewestyesH /comments_per_page50yesG 'page_comments0yesF 7thread_comments_depth5yesE +thread_comments1yes!D ;close_comments_days_old14yes%C Eclose_comments_for_old_posts0yesB 3
image_default_alignyesA 1
image_default_sizeyes#@ ;image_default_link_typenoneyes? %large_size_h1024yes> %large_size_w1024yes= )avatar_defaultmysteryyes< 'medium_size_h300yes; 'medium_size_w300yes: )thumbnail_crop1yes9 -thumbnail_size_h150yes8 -thumbnail_size_w150yes7 +
upload_url_pathyes6 'avatar_ratingGyes5 %show_avatars1yes4
tag_baseyes3 'show_on_frontpostsyes2 7default_link_category2yes1 #blog_public1yes0 #
upload_pathyes&/ Guploads_use_yearmonth_folders1yes. !db_version53496yes- %!default_rolesubscriberyes, 'use_trackback0yes+ html_typetext/htmlyes* 5comment_registration0yes#) !/stylesheettwentytwentythreeyes!( /templatetwentytwentythreeyes' +
recently_editedno& 9default_email_category1yes% !gmt_offset0yes$ /comment_max_links2yes,# !Aping_siteshttp://rpc.pingomatic.com/yes" '
category_baseyesˆ +
moderation_keysno %blog_charsetUTF-8yes hack_file0yes ª R! )active_pluginsa:1:{i:0;s:41:"wordpress-importer/wordpress-importer.php";}yes '
rewrite_rulesyes 3
permalink_structureyes /moderation_notify1yes 1comment_moderation0yes- ?%links_updated_date_formatF j, Y g:i ayes #time_formatg:i ayes #date_formatF j, Yyes )posts_per_page10yes 7default_pingback_flag1yes 3default_ping_statusopenyes" 9default_comment_statusopenyes -default_category1yes +mailserver_port110yes +mailserver_passpasswordyes) -/mailserver_loginlogin@example.comyes& )-mailserver_urlmail.example.comyes
+rss_use_excerpt0yes 'posts_per_rss10yes +comments_notify1yes
- 1require_name_email1yes #use_smilies1yes +use_balanceTags0yes 'start_of_week1yes& #3admin_emailadmin@localhost.comyes 1users_can_register0yes +
blogdescriptionyes$ 5blognameMy WordPress Websiteyes! 7homehttp://127.0.0.1:8000yes$ 7siteurlhttp://127.0.0.1:8000yes
¸ –vX3ä̦xS,Ù¸ª c 1initial_db_version53496yes*b Ewp_force_deactivated_pluginsa:0:{}yes%a 9auto_update_core_majorenabledyes%` 9auto_update_core_minorenabledyes#_ 5auto_update_core_devenabledyes,^ Kauto_plugin_theme_update_emailsa:0:{}no$] Ccomment_previously_approved1yes\ +
disallowed_keysno&[ 5!admin_email_lifespan1696609490yes%Z Eshow_comments_cookies_opt_in1yes#Y Awp_page_for_privacy_policy3yesX 3medium_large_size_h0yesW 3medium_large_size_w768yesV site_icon0yes˜Sd '±wp_user_rolesa:5:{s:13:"administrator";a:2:{s:4:"name";s:13:"Administrator";s:12:"capabilities";a:61:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:12:"delete_users";b:1;s:12:"create_users";b:1;s:17:"unfiltered_upload";b:1;s:14:"edit_dashboard";b:1;s:14:"update_plugins";b:1;s:14:"delete_plugins";b:1;s:15:"install_plugins";b:1;s:13:"update_themes";b:1;s:14:"install_themes";b:1;s:11:"update_core";b:1;s:10:"list_users";b:1;s:12:"remove_users";b:1;s:13:"promote_users";b:1;s:18:"edit_theme_options";b:1;s:13:"delete_themes";b:1;s:6:"export";b:1;}}s:6:"editor";a:2:{s:4:"name";s:6:"Editor";s:12:"capabilities";a:34:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;}}s:6:"author";a:2:{s:4:"name";s:6:"Author";s:12:"capabilities";a:10:{s:12:"upload_files";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;s:22:"delete_published_posts";b:1;}}s:11:"contributor";a:2:{s:4:"name";s:11:"Contributor";s:12:"capabilities";a:5:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;}}s:10:"subscriber";a:2:{s:4:"name";s:10:"Subscriber";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}yes nd extract any location data from images on the website.
Cookies
Suggested text: If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.
If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.
When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.
If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.
Embedded content from other websites
Suggested text: Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.
These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.
Who we share your data with
Suggested text: If you request a password reset, your IP address will be included in the reset email.
How long we retain your data
Suggested text: If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.
For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.
What rights you have over your data
Suggested text: If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.
Where your data is sent
Suggested text: Visitor comments may be checked through an automated spam detection service.
Privacy Policydraftclosedopenprivacy-policy2023-04-09 16:24:512023-04-09 16:24:51http://127.0.0.1:8000/?page_id=3page
– wcnŒ– £ l 5ûÁ…Kã<ËT#
-” ‰i ‘ucrona:3:{i:1681057502;a:6:{s:32:"recovery_mode_clean_expired_keys";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}s:18:"wp_https_detection";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:34:"wp_privacy_delete_old_export_files";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:6:"hourly";s:4:"args";a:0:{}s:8:"interval";i:3600;}}s:16:"wp_version_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:17:"wp_update_plugins";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:16:"wp_update_themes";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}}i:1681143902;a:1:{s:30:"wp_site_health_scheduled_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:6:"weekly";s:4:"args";a:0:{}s:8:"interval";i:604800;}}}s:7:"version";i:2;}yes ×R 5k +Iwidget_calendara:1:{s:12:"_multiwidget";i:1;}yes2j %Iwidget_pagesa:1:{s:12:"_multiwidget";i:1;}yes Œ f !user_count1noe !fresh_site1yes_h -ƒsidebars_widgetsa:4:{s:19:"wp_inactive_widgets";a:0:{}s:9:"sidebar-1";a:3:{i:0;s:7:"block-2";i:1;s:7:"block-3";i:2;s:7:"block-4";}s:9:"sidebar-2";a:2:{i:0;s:7:"block-5";i:1;s:7:"block-6";}s:13:"array_version";i:3;}yes‡g %Žwidget_blocka:6:{i:2;a:1:{s:7:"content";s:19:"";}i:3;a:1:{s:7:"content";s:154:"Recent Posts
";}i:4;a:1:{s:7:"content";s:227:"Recent Comments
";}i:5;a:1:{s:7:"content";s:146:"Archives
";}i:6;a:1:{s:7:"content";s:150:"Categories
";}s:12:"_multiwidget";i:1;}yes
4 ‚HÒ˜e0
-Ý
-‰
-N
- Ø ¡ g '¹ þ [ O Cg_site_transient_theme_rootsa:1:{s:17:"twentytwentythree";s:7:"/themes";}no4~ S!_site_transient_timeout_theme_roots1681059306no ì „ G‡I_site_transient_update_themesO:8:"stdClass":5:{s:12:"last_checked";i:1681057506;s:7:"checked";a:1:{s:17:"twentytwentythree";s:3:"1.1";}s:8:"response";a:0:{}s:9:"no_update";a:1:{s:17:"twentytwentythree";a:6:{s:5:"theme";s:17:"twentytwentythree";s:11:"new_version";s:3:"1.1";s:3:"url";s:47:"https://wordpress.org/themes/twentytwentythree/";s:7:"package";s:63:"https://downloads.wordpress.org/theme/twentytwentythree.1.1.zip";s:8:"requires";s:3:"6.1";s:12:"requires_php";s:3:"5.6";}}s:12:"translations";a:0:{}}no>z 7O_transient_doing_cron1681057502.5878729820251464843750yes8y 1Iwidget_custom_htmla:1:{s:12:"_multiwidget";i:1;}yes5x +Iwidget_nav_menua:1:{s:12:"_multiwidget";i:1;}yes6w -Iwidget_tag_clouda:1:{s:12:"_multiwidget";i:1;}yes