diff --git a/.gitignore b/.gitignore index 6c634480..bcbc4ff8 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,5 @@ debug.log .vscode ## Examples -examples/**/package-lock.json \ No newline at end of file +examples/**/package-lock.json +examples/**/__MACOSX \ No newline at end of file diff --git a/examples/next/hwp-preview-wpgraphql/.wp-env.json b/examples/next/hwp-preview-wpgraphql/.wp-env.json new file mode 100644 index 00000000..04fc30cf --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/.wp-env.json @@ -0,0 +1,25 @@ +{ + "phpVersion": "7.4", + "plugins": [ + "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip", + "https://github.com/AdvancedCustomFields/acf/releases/download/6.3.12/advanced-custom-fields-6.3.12.zip", + "https://github.com/wp-graphql/wpgraphql-acf/releases/latest/download/wpgraphql-acf.zip", + "../../../plugins/hwp-previews" + ], + "config": { + "WP_DEBUG": true, + "SCRIPT_DEBUG": false, + "GRAPHQL_DEBUG": true, + "WP_DEBUG_LOG": true, + "WP_DEBUG_DISPLAY": false, + "SAVEQUERIES": false + }, + "mappings": { + "db": "./wp-env/db", + "wp-content/uploads": "./wp-env/uploads", + ".htaccess": "./wp-env/setup/.htaccess" + }, + "lifecycleScripts": { + "afterStart": "wp-env run cli -- wp plugin update wpgraphql-acf && wp-env run cli -- wp rewrite structure '/%postname%/' && wp-env run cli -- wp rewrite flush" + } +} diff --git a/examples/next/hwp-preview-wpgraphql/README.md b/examples/next/hwp-preview-wpgraphql/README.md new file mode 100644 index 00000000..2492a26c --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/README.md @@ -0,0 +1,139 @@ +# Example: Headless WordPress Previews with Nextjs Draft Mode + +## Overview + +This example shows the HWP Previews plugin in action. Example implements the [Draft Mode](https://nextjs.org/docs/pages/guides/draft-mode) of Nextjs. It uses WordPress [Application Passwords](https://wordpress.com/support/security/two-step-authentication/application-specific-passwords/) for the authentication and WPGraphQL for data fetching. + +The example includes a wp-env setup, which will allow you to build and start this example quickly. With this wp-env setup, you don't need to have a separate WordPress instance or demo data to inspect the example. + +> [!CAUTION] +> The HWP Previews plugin is currently in an alpha state. It's still under active development, so you may encounter bugs or incomplete features. Updates will be rolled out regularly. Use with caution and provide feedback if possible. + +## What does this example do + +1. `/api/preview/` route to enable Nextjs Draft Mode +2. `/api/disable-preview` route to disable Nextjs Draft Mode +3. Preview posts, pages and custom post types +4. Use WordPress Application Password as an authentication method +5. Configured WordPress instance with demo data and required plugins, using wp-env + +## Screenshots + +| | | | +| :---------------------------------------------------------------: | :------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------: | +| ![Post preview](./screenshots/post_preview.png)
Post preview | ![Post preview in iframe](./screenshots/post_preview_iframe.png)
Post preview in iframe | ![Custom post type preview](./screenshots/cpt_preview.png)
Custom post type preview | + +## Project Structure + +``` +├── example-app +│ └── src +│ ├── components # Reusable React components +│ ├── lib +│ │ └── client.js # Apollo client instance +│ ├── pages +│ │ ├── [identifier].js # Dynamic route to handle standard routes and previews +│ │ ├── api +│ │ │ ├── disable-preview.js # Api route to disable Draft Mode +│ │ │ └── preview.js # Api route to enable Draft mode +│ │ └── index.js # Home page +│ └── utils +│ └── getAuthString.js # Get Authorization string based on .env variables +├── .wp-env.json # wp-env configuration file +└── wp-env + ├── db + │ └── database.sql # WordPress database including all demo data for the example + └── uploads.zip # WordPress content to be used by wp-env +``` + +## Running the example with wp-env + +### Prerequisites + +- Node.js (v18+ recommended) +- [Docker](https://www.docker.com/) (if you plan on running the example see details below) + +**Note** Please make sure you have all prerequisites installed as mentioned above and Docker running (`docker ps`) + +### Setup Repository and Packages + +- Clone the repo `git clone https://github.com/wpengine/hwptoolkit.git` +- Install packages `cd hwptoolkit && npm install` + +### Build and start the application + +- `cd examples/next/hwp-preview-wpgraphql` +- Then run `npm run example:build` will build and start your application. +- This does the following: + - Unzips `wp-env/uploads.zip` to `wp-env/uploads` which is mapped to the wp-content/uploads directory for the Docker container. + - Starts up [wp-env](https://developer.wordpress.org/block-editor/getting-started/devenv/get-started-with-wp-env/) + - Imports the database from [wp-env/db/database.sql](wp-env/db/database.sql) + - Install Next.js dependencies for `example-app` + - Runs the Next.js dev script + +Congratulations, WordPress should now be fully set up. + +| Frontend | Admin | +| ---------------------- | ------------------------------- | +| http://localhost:3000/ | http://localhost:8888/wp-admin/ | + +> **Note:** The login details for the admin is username "admin" and password "password" + +### Add environment variables to the Nextjs + +In this step we will create an Application Password and a secret preview token for the previews. At the end we'll prepare a .env file for the Nextjs application and put it inside `examples/next/hwp-preview-wpgraphql/example-app` folder. Below are the step by step guide to achieve this. + +1. Login to your newly created [wp-env instance](http://localhost:8888/wp-admin/). You can find the credentials above +2. a. Follow [these instructions](https://wordpress.com/support/security/two-step-authentication/application-specific-passwords/) to create an Application Password. At the end it should look like this: + +![index](./screenshots/app_password.png "Application Password created") + +2. b. Keep the password, we'll need it later. + +3. Go to the HWP Previews settings and change the secret preview token. + +![index](./screenshots/preview_token.png "Change secret preview token") + +4. Create a .env file under `examples/next/hwp-preview-wpgraphql/example-app` and add these values inside: + +```bash +NEXT_PUBLIC_WORDPRESS_URL=http://localhost:8888 + +WP_USERNAME=admin +WP_APP_PASSWORD=YOUR-APPLICATION-PASSWORD +WP_PREVIEW_SECRET=YOUR-SECRET-PREVIEW-TOKEN +``` + +> [!CAUTION] +> This setup is intended for demonstration purposes only. For production use, you should consider the security implications and implement appropriate measures based on your project’s specific needs. + +After completing this step, clicking the preview button in wp-admin should open the preview in your front-end app. + +If you want to learn more about the preview plugin, check out [the documentation](/plugins/hwp-previews/README.md). + +### Command Reference + +| Command | Description | +| --------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| `example:build` | Prepares the environment by unzipping images, starting WordPress, importing the database, and starting the application. | +| `example:dev` | Runs the Next.js development server. | +| `example:dev:install` | Installs the required Next.js packages. | +| `example:start` | Starts WordPress and the Next.js development server. | +| `example:stop` | Stops the WordPress environment. | +| `example:prune` | Rebuilds and restarts the application by destroying and recreating the WordPress environment. | +| `wp:start` | Starts the WordPress environment. | +| `wp:stop` | Stops the WordPress environment. | +| `wp:destroy` | Completely removes the WordPress environment. | +| `wp:db:query` | Executes a database query within the WordPress environment. | +| `wp:db:export` | Exports the WordPress database to `wp-env/db/database.sql`. | +| `wp:db:import` | Imports the WordPress database from `wp-env/db/database.sql`. | +| `wp:images:unzip` | Extracts the WordPress uploads directory. | +| `wp:images:zip` | Compresses the WordPress uploads directory. | + +> **Note** You can run `npm run wp-env` and use any other wp-env command. You can also see for more details on how to use or configure `wp-env`. + +### Database access + +If you need database access add the following to your wp-env `"phpmyadminPort": 11111,` (where port 11111 is not allocated). + +You can check if a port is free by running `lsof -i :11111` diff --git a/examples/next/hwp-preview-wpgraphql/example-app/.gitignore b/examples/next/hwp-preview-wpgraphql/example-app/.gitignore new file mode 100644 index 00000000..f6400097 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/.gitignore @@ -0,0 +1,43 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +package-lock.json \ No newline at end of file diff --git a/examples/next/hwp-preview-wpgraphql/example-app/eslint.config.mjs b/examples/next/hwp-preview-wpgraphql/example-app/eslint.config.mjs new file mode 100644 index 00000000..5165cec4 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/eslint.config.mjs @@ -0,0 +1,20 @@ +import { FlatCompat } from "@eslint/eslintrc"; +import js from "@eslint/js"; +import { dirname } from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, +}); + +const eslintConfig = [ + ...compat.config({ + extends: ["eslint:recommended", "next/core-web-vitals"], + }), +]; + +export default eslintConfig; diff --git a/examples/next/hwp-preview-wpgraphql/example-app/jsconfig.json b/examples/next/hwp-preview-wpgraphql/example-app/jsconfig.json new file mode 100644 index 00000000..b8d6842d --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/next.config.mjs b/examples/next/hwp-preview-wpgraphql/example-app/next.config.mjs new file mode 100644 index 00000000..d5456a15 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/next.config.mjs @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +}; + +export default nextConfig; diff --git a/examples/next/hwp-preview-wpgraphql/example-app/package.json b/examples/next/hwp-preview-wpgraphql/example-app/package.json new file mode 100644 index 00000000..8fd981d0 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/package.json @@ -0,0 +1,24 @@ +{ + "name": "hwp-preview-wpgraphql-example-app", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@apollo/client": "^3.13.5", + "next": "15.2.4", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "eslint": "^9", + "eslint-config-next": "15.2.4", + "tailwindcss": "^4" + } +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/postcss.config.mjs b/examples/next/hwp-preview-wpgraphql/example-app/postcss.config.mjs new file mode 100644 index 00000000..c7bcb4b1 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/examples/next/hwp-preview-wpgraphql/example-app/public/favicon.ico b/examples/next/hwp-preview-wpgraphql/example-app/public/favicon.ico new file mode 100644 index 00000000..718d6fea Binary files /dev/null and b/examples/next/hwp-preview-wpgraphql/example-app/public/favicon.ico differ diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/components/BlogPostItem.js b/examples/next/hwp-preview-wpgraphql/example-app/src/components/BlogPostItem.js new file mode 100644 index 00000000..58740f7f --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/components/BlogPostItem.js @@ -0,0 +1,32 @@ +import Link from "next/link"; + +export function BlogPostItem({ post }) { + const { title, date, excerpt, uri, featuredImage } = post ?? {}; + + return ( +
+ + + {featuredImage && ( + + )} + +

+ + {title} + +

+ +
+ + + Read more + +
+ ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/components/CouldNotLoad.js b/examples/next/hwp-preview-wpgraphql/example-app/src/components/CouldNotLoad.js new file mode 100644 index 00000000..1343f3e8 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/components/CouldNotLoad.js @@ -0,0 +1,7 @@ +export default function CouldNotLoad() { + return ( +
+

Could not load the post

+
+ ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/components/Header.js b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Header.js new file mode 100644 index 00000000..9cbb53bd --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Header.js @@ -0,0 +1,35 @@ +/* eslint-disable @next/next/no-html-link-for-pages */ +import { gql, useQuery } from "@apollo/client"; +import Link from "next/link"; + +// Defining a GraphQL query to fetch the blog title +const GET_BLOG_TITLE = gql` + query GetBlogTitle { + allSettings { + generalSettingsTitle + } + } +`; + +export default function Header() { + // Using the useQuery hook to execute the GraphQL query and get the data + const { data } = useQuery(GET_BLOG_TITLE); + // Extracting the blog title from the fetched data + const blogTitle = data?.allSettings?.generalSettingsTitle; + + return ( +
+
+
+ {blogTitle} +
+ + +
+
+ ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/components/Layout.js b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Layout.js new file mode 100644 index 00000000..2bc5f53a --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Layout.js @@ -0,0 +1,17 @@ +import { useRouter } from "next/router"; +import Header from "./Header"; +import PreviewButton from "./PreviewButton"; + +export default function Layout({ children }) { + const router = useRouter(); + + return ( +
+
+ + {children} + + {router.isPreview && } +
+ ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/components/Loading.js b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Loading.js new file mode 100644 index 00000000..a1b53432 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Loading.js @@ -0,0 +1,5 @@ +export default function Loading() { + return ( +
+ ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/components/PreviewButton.js b/examples/next/hwp-preview-wpgraphql/example-app/src/components/PreviewButton.js new file mode 100644 index 00000000..3c8a2122 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/components/PreviewButton.js @@ -0,0 +1,17 @@ +import { useRouter } from "next/router"; + +export default function PreviewButton() { + const router = useRouter(); + + return ( +
+ Preview mode is on + + +
+ ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/components/Single.js b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Single.js new file mode 100644 index 00000000..c96f01f9 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/components/Single.js @@ -0,0 +1,25 @@ +import Head from "next/head"; + +export default function Single({ data }) { + const { title, content, featuredImage } = data ?? {}; + + return ( + <> + + {title} + + +
+
+

{title}

+
+ + {featuredImage && ( + + )} + +
+
+ + ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/lib/client.js b/examples/next/hwp-preview-wpgraphql/example-app/src/lib/client.js new file mode 100644 index 00000000..340a8567 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/lib/client.js @@ -0,0 +1,82 @@ +import { ApolloClient, gql, HttpLink, InMemoryCache } from "@apollo/client"; +import { createFragmentRegistry } from "@apollo/client/cache"; +import { relayStylePagination } from "@apollo/client/utilities"; + +// Define GraphQL fragments for reuse in queries and mutations +// More info: https://www.apollographql.com/docs/react/data/fragments/ +const fragments = gql` + fragment FeaturedImage on MediaItem { + sourceUrl(size: LARGE) + caption + } + + fragment Page on Page { + title + content + featuredImage { + node { + ...FeaturedImage + } + } + } + + fragment Post on Post { + __typename + id + databaseId + date + uri + content + excerpt + title + author { + node { + name + } + } + featuredImage { + node { + ...FeaturedImage + } + } + } + + fragment Building on Building { + id + title + uri + excerpt + date + content + featuredImage { + node { + ...FeaturedImage + } + } + } +`; + +// Get the WordPress URL from environment variables +// More info: https://nextjs.org/docs/basic-features/environment-variables +const WORDPRESS_URL = process.env.NEXT_PUBLIC_WORDPRESS_URL; + +// Initialize Apollo Client with the link and cache configuration +// More info: https://www.apollographql.com/docs/react/api/core/ApolloClient/ +export const client = new ApolloClient({ + link: new HttpLink({ + uri: WORDPRESS_URL + "/graphql", + }), + ssrMode: typeof window === "undefined", // Enable SSR mode for server-side rendering + cache: new InMemoryCache({ + typePolicies: { + Query: { + fields: { + posts: relayStylePagination(), // Enable relay-style pagination for posts + // More info: https://www.apollographql.com/docs/react/pagination/cursor-based#relay-style-cursor-pagination + }, + }, + }, + fragments: createFragmentRegistry(fragments), // Register the defined fragments + // More info: https://www.apollographql.com/docs/react/data/fragments#registering-named-fragments-using-createfragmentregistry + }), +}); diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/pages/[identifier].js b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/[identifier].js new file mode 100644 index 00000000..39096d3e --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/[identifier].js @@ -0,0 +1,86 @@ +import CouldNotLoad from "@/components/CouldNotLoad"; +import Single from "@/components/Single"; +import { client } from "@/lib/client"; +import { getAuthString } from "@/utils/getAuthString"; +import { gql } from "@apollo/client"; + +// We'll render Single component for these types +const SINGLE_TYPES = ["Post", "Page", "Building"]; + +// Get contentNode for previews and nodeByUri for normal content +const GET_CONTENT = gql` + query GetSeedNode($id: ID! = 0, $uri: String! = "", $asPreview: Boolean = false) { + nodeByUri(uri: $uri) @skip(if: $asPreview) { + __typename + ...Page + ...Post + ...Building + } + + contentNode(id: $id, idType: DATABASE_ID, asPreview: true) @include(if: $asPreview) { + __typename + ...Page + ...Post + ...Building + } + } +`; + +export default function Content({ data }) { + const contentType = data?.__typename; + + if (SINGLE_TYPES.includes(contentType)) { + return ; + } + + // Render CouldNotLoad component if content type is unknown + return ; +} + +// Statically generate the pages, except for draft mode +// More info: https://nextjs.org/docs/pages/guides/draft-mode +export async function getStaticProps({ params, draftMode: isDraftModeEnabled }) { + const variables = isDraftModeEnabled + ? { + id: params.identifier, + asPreview: true, + } + : { uri: params.identifier }; + + // Send the authentication string only if draft mode is enabled + const headers = isDraftModeEnabled + ? { + Authorization: getAuthString(), + } + : null; + + const { data } = await client.query({ + query: GET_CONTENT, + variables: variables, + context: { + headers, + }, + }); + + const content = data?.nodeByUri || data?.contentNode; + + // Return 404 page if no data is found + if (!content) + return { + notFound: true, + }; + + // Pass the fetched data to the page component as props + return { + props: { + data: content, + }, + }; +} + +export async function getStaticPaths() { + return { + paths: [], + fallback: "blocking", + }; +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/pages/_app.js b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/_app.js new file mode 100644 index 00000000..c9400495 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/_app.js @@ -0,0 +1,15 @@ +import Layout from "@/components/Layout"; +import "@/styles/globals.css"; +import { ApolloProvider } from "@apollo/client"; +import { client } from "../lib/client"; + +export default function App({ Component, pageProps }) { + return ( + // ApolloProvider makes the Apollo Client available to the rest of the app + + + + + + ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/pages/_document.js b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/_document.js new file mode 100644 index 00000000..628a7334 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/_document.js @@ -0,0 +1,13 @@ +import { Html, Head, Main, NextScript } from "next/document"; + +export default function Document() { + return ( + + + +
+ + + + ); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/pages/api/disable-preview.js b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/api/disable-preview.js new file mode 100644 index 00000000..fbaba41f --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/api/disable-preview.js @@ -0,0 +1,7 @@ +export default async function handler(_, res) { + // This removes __prerender_bypass cookie + // More info: https://nextjs.org/docs/pages/guides/draft-mode#clear-the-draft-mode-cookie + res.setDraftMode({ enable: false }); + + return res.redirect("/"); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/pages/api/preview.js b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/api/preview.js new file mode 100644 index 00000000..35393f7d --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/api/preview.js @@ -0,0 +1,49 @@ +import { client } from "@/lib/client"; +import { getAuthString } from "@/utils/getAuthString"; +import { gql } from "@apollo/client"; + +const GET_CONTENT = gql` + query GetNode($id: ID! = 0) { + contentNode(id: $id, idType: DATABASE_ID, asPreview: true) { + databaseId + } + } +`; + +export default async function handler(req, res) { + const { secret, id } = req.query; + + if (!id) { + return res.status(400).json({ message: "No ID provided." }); + } + + // Check if preview secret token exists and matches environment variable + if (secret !== process.env.WP_PREVIEW_SECRET) { + return res.status(401).json({ message: "Secret token is invalid." }); + } + + // Check if content exists and get the id + const { data } = await client.query({ + query: GET_CONTENT, + variables: { + id, + }, + context: { + headers: { + Authorization: getAuthString(), + }, + }, + }); + + if (!data?.contentNode) { + return res.status(404).json({ message: "Content could not be found. Verify your authentication method." }); + } + + // Enable draft mode + // More info: https://nextjs.org/docs/pages/guides/draft-mode#step-1-create-and-access-the-api-route + res.setDraftMode({ enable: true }); + + // Redirect with the databaseId retrieved from the query to prevent redirect at + // More info: https://developers.google.com/search/blog/2009/01/open-redirect-urls-is-your-site-being + res.redirect("/" + data?.contentNode?.databaseId); +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/pages/index.js b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/index.js new file mode 100644 index 00000000..9a5f2fb0 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/pages/index.js @@ -0,0 +1,53 @@ +import { BlogPostItem } from "@/components/BlogPostItem"; +import { client } from "@/lib/client"; +import { gql } from "@apollo/client"; +import Head from "next/head"; + +const LIST_POSTS = gql` + query ListPosts { + posts(first: 20) { + edges { + node { + id + title + uri + excerpt + date + featuredImage { + node { + sourceUrl(size: LARGE) + caption + } + } + } + } + } + } +`; + +export default function Blog({ data }) { + return ( + <> + + Home + + + {data?.posts?.edges?.map((item) => { + const post = item.node; + + return ; + })} + + ); +} + +// Fetch the initial list of posts at request time using getServerSideProps +export async function getServerSideProps() { + const { data } = await client.query({ query: LIST_POSTS }); + + return { + props: { + data, + }, + }; +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/styles/globals.css b/examples/next/hwp-preview-wpgraphql/example-app/src/styles/globals.css new file mode 100644 index 00000000..2a89a481 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/styles/globals.css @@ -0,0 +1,19 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/examples/next/hwp-preview-wpgraphql/example-app/src/utils/getAuthString.js b/examples/next/hwp-preview-wpgraphql/example-app/src/utils/getAuthString.js new file mode 100644 index 00000000..a27e470b --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/example-app/src/utils/getAuthString.js @@ -0,0 +1,5 @@ +// Forming the authentication string for WordPress App Password +// More info: https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/ + +export const getAuthString = () => + "Basic " + Buffer.from(process.env.WP_USERNAME + ":" + process.env.WP_APP_PASSWORD).toString("base64"); diff --git a/examples/next/hwp-preview-wpgraphql/package.json b/examples/next/hwp-preview-wpgraphql/package.json new file mode 100644 index 00000000..17398248 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/package.json @@ -0,0 +1,44 @@ +{ + "name": "hwp-preview-wpgraphql", + "version": "1.0.0", + "description": "An example of Wordpress previews using Nextjs draft mode and WPGraphQL.", + "scripts": { + "example:build": "npm run wp:images:unzip && npm run example:dev:install && npm run wp:start && npm run wp:db:import && npm run example:start", + "example:dev:install": "cd example-app && npm install && cd ..", + "example:start": "npm run wp:start && npm run example:dev", + "example:stop": "npm run wp:stop", + "example:prune": "wp-env destroy && npm run example:build && npm run example:start", + "example:dev": "npm --prefix ./example-app run dev", + "wp:start": "npm install && wp-env start", + "wp:stop": "wp-env stop", + "wp:destroy": "wp-env destroy --config ./wp-env/wp-env.json", + "wp:db:query": "wp-env run cli -- wp db query", + "wp:db:export": "wp-env run cli -- wp db export /var/www/html/db/database.sql", + "wp:db:import": "wp-env run cli -- wp db import /var/www/html/db/database.sql", + "wp:images:unzip": "rm -rf wp-env/uploads/ && unzip wp-env/uploads.zip -d wp-env;", + "wp:images:zip": "zip -r wp-env/uploads.zip wp-env/uploads", + "wp-env": "wp-env" + }, + "keywords": [ + "headless", + "wordpress", + "nextjs", + "apollo-client", + "fullstack", + "headless-cms", + "wpgraphql", + "headless-wordpress", + "nextjs-pages-router", + "wp-env-configuration", + "fullstack-example", + "previews", + "wordpress-previews", + "headless-previews", + "nextjs-draft-mode" + ], + "author": "hwptoolkit", + "license": "BSD-0-Clause", + "dependencies": { + "@wordpress/env": "^10.20.0" + } +} diff --git a/examples/next/hwp-preview-wpgraphql/screenshots/app_password.png b/examples/next/hwp-preview-wpgraphql/screenshots/app_password.png new file mode 100644 index 00000000..fc9ed7dd Binary files /dev/null and b/examples/next/hwp-preview-wpgraphql/screenshots/app_password.png differ diff --git a/examples/next/hwp-preview-wpgraphql/screenshots/cpt_preview.png b/examples/next/hwp-preview-wpgraphql/screenshots/cpt_preview.png new file mode 100644 index 00000000..3f582ce9 Binary files /dev/null and b/examples/next/hwp-preview-wpgraphql/screenshots/cpt_preview.png differ diff --git a/examples/next/hwp-preview-wpgraphql/screenshots/post_preview.png b/examples/next/hwp-preview-wpgraphql/screenshots/post_preview.png new file mode 100644 index 00000000..518d8fa1 Binary files /dev/null and b/examples/next/hwp-preview-wpgraphql/screenshots/post_preview.png differ diff --git a/examples/next/hwp-preview-wpgraphql/screenshots/post_preview_iframe.png b/examples/next/hwp-preview-wpgraphql/screenshots/post_preview_iframe.png new file mode 100644 index 00000000..a6f083c9 Binary files /dev/null and b/examples/next/hwp-preview-wpgraphql/screenshots/post_preview_iframe.png differ diff --git a/examples/next/hwp-preview-wpgraphql/screenshots/preview_token.png b/examples/next/hwp-preview-wpgraphql/screenshots/preview_token.png new file mode 100644 index 00000000..42c03422 Binary files /dev/null and b/examples/next/hwp-preview-wpgraphql/screenshots/preview_token.png differ diff --git a/examples/next/hwp-preview-wpgraphql/wp-env/db/database.sql b/examples/next/hwp-preview-wpgraphql/wp-env/db/database.sql new file mode 100644 index 00000000..1aef788d --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/wp-env/db/database.sql @@ -0,0 +1,410 @@ +-- MariaDB dump 10.19 Distrib 10.6.10-MariaDB, for Linux (aarch64) +-- +-- Host: mysql Database: wordpress +-- ------------------------------------------------------ +-- Server version 11.4.5-MariaDB-ubu2404 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `wp_commentmeta` +-- + +DROP TABLE IF EXISTS `wp_commentmeta`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_commentmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint(20) unsigned NOT NULL DEFAULT 0, + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext DEFAULT NULL, + PRIMARY KEY (`meta_id`), + KEY `comment_id` (`comment_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_commentmeta` +-- + +LOCK TABLES `wp_commentmeta` WRITE; +/*!40000 ALTER TABLE `wp_commentmeta` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_commentmeta` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_comments` +-- + +DROP TABLE IF EXISTS `wp_comments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_comments` ( + `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT 0, + `comment_author` tinytext NOT NULL, + `comment_author_email` varchar(100) NOT NULL DEFAULT '', + `comment_author_url` varchar(200) NOT NULL DEFAULT '', + `comment_author_IP` varchar(100) NOT NULL DEFAULT '', + `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_content` text NOT NULL, + `comment_karma` int(11) NOT NULL DEFAULT 0, + `comment_approved` varchar(20) NOT NULL DEFAULT '1', + `comment_agent` varchar(255) NOT NULL DEFAULT '', + `comment_type` varchar(20) NOT NULL DEFAULT 'comment', + `comment_parent` bigint(20) unsigned NOT NULL DEFAULT 0, + `user_id` bigint(20) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`comment_ID`), + KEY `comment_post_ID` (`comment_post_ID`), + KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), + KEY `comment_date_gmt` (`comment_date_gmt`), + KEY `comment_parent` (`comment_parent`), + KEY `comment_author_email` (`comment_author_email`(10)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_comments` +-- + +LOCK TABLES `wp_comments` WRITE; +/*!40000 ALTER TABLE `wp_comments` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_comments` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_links` +-- + +DROP TABLE IF EXISTS `wp_links`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_links` ( + `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `link_url` varchar(255) NOT NULL DEFAULT '', + `link_name` varchar(255) NOT NULL DEFAULT '', + `link_image` varchar(255) NOT NULL DEFAULT '', + `link_target` varchar(25) NOT NULL DEFAULT '', + `link_description` varchar(255) NOT NULL DEFAULT '', + `link_visible` varchar(20) NOT NULL DEFAULT 'Y', + `link_owner` bigint(20) unsigned NOT NULL DEFAULT 1, + `link_rating` int(11) NOT NULL DEFAULT 0, + `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `link_rel` varchar(255) NOT NULL DEFAULT '', + `link_notes` mediumtext NOT NULL, + `link_rss` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`link_id`), + KEY `link_visible` (`link_visible`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_links` +-- + +LOCK TABLES `wp_links` WRITE; +/*!40000 ALTER TABLE `wp_links` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_links` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_options` +-- + +DROP TABLE IF EXISTS `wp_options`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_options` ( + `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `option_name` varchar(191) NOT NULL DEFAULT '', + `option_value` longtext NOT NULL, + `autoload` varchar(20) NOT NULL DEFAULT 'yes', + PRIMARY KEY (`option_id`), + UNIQUE KEY `option_name` (`option_name`), + KEY `autoload` (`autoload`) +) ENGINE=InnoDB AUTO_INCREMENT=358 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_options` +-- + +LOCK TABLES `wp_options` WRITE; +/*!40000 ALTER TABLE `wp_options` DISABLE KEYS */; +INSERT INTO `wp_options` VALUES (1,'cron','a:23:{i:1743163867;a:1:{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;}}}i:1743165667;a:2:{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;}}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;}}}i:1743165755;a:1:{s:26:\"upgrader_scheduled_cleanup\";a:1:{s:32:\"c9059feef497c200e69cb9956a81f005\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:5;}}}}i:1743170751;a:1:{s:26:\"upgrader_scheduled_cleanup\";a:1:{s:32:\"0788f78fe69d70d1d4752e57aa22b566\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:357;}}}}i:1743170763;a:1:{s:26:\"upgrader_scheduled_cleanup\";a:1:{s:32:\"f69ca2a244e86e4c29242128df8e8956\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:358;}}}}i:1743170772;a:1:{s:26:\"upgrader_scheduled_cleanup\";a:1:{s:32:\"563efdbbb2f307dfb80c1d496d0109b2\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:359;}}}}i:1743170782;a:1:{s:26:\"upgrader_scheduled_cleanup\";a:1:{s:32:\"32a99f765d2b1a63b1790ee770c3fb21\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:360;}}}}i:1743201685;a:1:{s:21:\"wp_update_user_counts\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1743205267;a:1:{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;}}}i:1743244867;a:2:{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: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;}}}i:1743244885;a:2:{s:19:\"wp_scheduled_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:25:\"delete_expired_transients\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1743244886;a:1:{s:30:\"wp_scheduled_auto_draft_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1743246097;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"686c8315be36c96dc00d0d7ed3656b43\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:6;}}}}i:1743246167;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"25117f4b9fd9bb6384d0eb8ea708c8b9\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:12;}}}}i:1743246175;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"bad9df8a7c3fa92d28999d03f4ccb29e\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:18;}}}}i:1743246409;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"1aee8163cf336b6de8481860de53f230\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:29;}}}}i:1743246864;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"3c2f09ef3307c7968f556ae704095acf\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:35;}}}}i:1743247077;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"1116d9ef00bc7112389bca5c44a23a14\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:36;}}}}i:1743247202;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"0f46b246aa1944327c5c8450376eb6e0\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:306;}}}}i:1743247316;a:1:{s:26:\"importer_scheduled_cleanup\";a:1:{s:32:\"1d5de63f2a862a1a655d7261e844bc49\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:1:{i:0;i:312;}}}}i:1743763324;a:1:{s:30:\"wp_delete_temp_updater_backups\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1743763363;a:1:{s:27:\"acf_update_site_health_data\";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;}','on'),(2,'siteurl','http://localhost:8888','on'),(3,'home','http://localhost:8888','on'),(4,'blogname','HWP Previews','on'),(5,'blogdescription','','on'),(6,'users_can_register','0','on'),(7,'admin_email','dev-email@wpengine.local','on'),(8,'start_of_week','1','on'),(9,'use_balanceTags','0','on'),(10,'use_smilies','1','on'),(11,'require_name_email','1','on'),(12,'comments_notify','1','on'),(13,'posts_per_rss','10','on'),(14,'rss_use_excerpt','0','on'),(15,'mailserver_url','mail.example.com','on'),(16,'mailserver_login','login@example.com','on'),(17,'mailserver_pass','','on'),(18,'mailserver_port','110','on'),(19,'default_category','1','on'),(20,'default_comment_status','open','on'),(21,'default_ping_status','open','on'),(22,'default_pingback_flag','1','on'),(23,'posts_per_page','10','on'),(24,'date_format','F j, Y','on'),(25,'time_format','g:i a','on'),(26,'links_updated_date_format','F j, Y g:i a','on'),(27,'comment_moderation','0','on'),(28,'moderation_notify','1','on'),(29,'permalink_structure','/%postname%/','on'),(30,'rewrite_rules','a:117:{s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:21:\"^index.php/wp-json/?$\";s:22:\"index.php?rest_route=/\";s:24:\"^index.php/wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:17:\"^wp-sitemap\\.xml$\";s:23:\"index.php?sitemap=index\";s:17:\"^wp-sitemap\\.xsl$\";s:36:\"index.php?sitemap-stylesheet=sitemap\";s:23:\"^wp-sitemap-index\\.xsl$\";s:34:\"index.php?sitemap-stylesheet=index\";s:48:\"^wp-sitemap-([a-z]+?)-([a-z\\d_-]+?)-(\\d+?)\\.xml$\";s:75:\"index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]\";s:34:\"^wp-sitemap-([a-z]+?)-(\\d+?)\\.xml$\";s:47:\"index.php?sitemap=$matches[1]&paged=$matches[2]\";s:10:\"graphql/?$\";s:22:\"index.php?graphql=true\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:47:\"period/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?period=$matches[1]&feed=$matches[2]\";s:42:\"period/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?period=$matches[1]&feed=$matches[2]\";s:23:\"period/([^/]+)/embed/?$\";s:39:\"index.php?period=$matches[1]&embed=true\";s:35:\"period/([^/]+)/page/?([0-9]{1,})/?$\";s:46:\"index.php?period=$matches[1]&paged=$matches[2]\";s:17:\"period/([^/]+)/?$\";s:28:\"index.php?period=$matches[1]\";s:36:\"building/[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:46:\"building/[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:66:\"building/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:61:\"building/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:61:\"building/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:42:\"building/[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:25:\"building/([^/]+)/embed/?$\";s:41:\"index.php?building=$matches[1]&embed=true\";s:29:\"building/([^/]+)/trackback/?$\";s:35:\"index.php?building=$matches[1]&tb=1\";s:37:\"building/([^/]+)/page/?([0-9]{1,})/?$\";s:48:\"index.php?building=$matches[1]&paged=$matches[2]\";s:44:\"building/([^/]+)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?building=$matches[1]&cpage=$matches[2]\";s:33:\"building/([^/]+)(?:/([0-9]+))?/?$\";s:47:\"index.php?building=$matches[1]&page=$matches[2]\";s:25:\"building/[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:35:\"building/[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:55:\"building/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:50:\"building/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:50:\"building/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:31:\"building/[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:12:\"robots\\.txt$\";s:18:\"index.php?robots=1\";s:13:\"favicon\\.ico$\";s:19:\"index.php?favicon=1\";s:12:\"sitemap\\.xml\";s:24:\"index.php??sitemap=index\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}','on'),(31,'hack_file','0','on'),(32,'blog_charset','UTF-8','on'),(33,'moderation_keys','','off'),(34,'active_plugins','a:4:{i:0;s:37:\"advanced-custom-fields-6.3.12/acf.php\";i:1;s:29:\"hwp-previews/hwp-previews.php\";i:2;s:25:\"wp-graphql/wp-graphql.php\";i:3;s:31:\"wpgraphql-acf/wpgraphql-acf.php\";}','on'),(35,'category_base','','on'),(36,'ping_sites','http://rpc.pingomatic.com/','on'),(37,'comment_max_links','2','on'),(38,'gmt_offset','0','on'),(39,'default_email_category','1','on'),(40,'recently_edited','','off'),(41,'template','twentytwentyfive','on'),(42,'stylesheet','twentytwentyfive','on'),(43,'comment_registration','0','on'),(44,'html_type','text/html','on'),(45,'use_trackback','0','on'),(46,'default_role','subscriber','on'),(47,'db_version','58975','on'),(48,'uploads_use_yearmonth_folders','1','on'),(49,'upload_path','','on'),(50,'blog_public','1','on'),(51,'default_link_category','2','on'),(52,'show_on_front','posts','on'),(53,'tag_base','','on'),(54,'show_avatars','1','on'),(55,'avatar_rating','G','on'),(56,'upload_url_path','','on'),(57,'thumbnail_size_w','150','on'),(58,'thumbnail_size_h','150','on'),(59,'thumbnail_crop','1','on'),(60,'medium_size_w','300','on'),(61,'medium_size_h','300','on'),(62,'avatar_default','mystery','on'),(63,'large_size_w','1024','on'),(64,'large_size_h','1024','on'),(65,'image_default_link_type','none','on'),(66,'image_default_size','','on'),(67,'image_default_align','','on'),(68,'close_comments_for_old_posts','0','on'),(69,'close_comments_days_old','14','on'),(70,'thread_comments','1','on'),(71,'thread_comments_depth','5','on'),(72,'page_comments','0','on'),(73,'comments_per_page','50','on'),(74,'default_comments_page','newest','on'),(75,'comment_order','asc','on'),(76,'sticky_posts','a:0:{}','on'),(77,'widget_categories','a:0:{}','on'),(78,'widget_text','a:0:{}','on'),(79,'widget_rss','a:0:{}','on'),(80,'uninstall_plugins','a:0:{}','off'),(81,'timezone_string','','on'),(82,'page_for_posts','0','on'),(83,'page_on_front','0','on'),(84,'default_post_format','0','on'),(85,'link_manager_enabled','0','on'),(86,'finished_splitting_shared_terms','1','on'),(87,'site_icon','0','on'),(88,'medium_large_size_w','768','on'),(89,'medium_large_size_h','0','on'),(90,'wp_page_for_privacy_policy','3','on'),(91,'show_comments_cookies_opt_in','1','on'),(92,'admin_email_lifespan','1758710467','on'),(93,'disallowed_keys','','off'),(94,'comment_previously_approved','1','on'),(95,'auto_plugin_theme_update_emails','a:0:{}','off'),(96,'auto_update_core_dev','enabled','on'),(97,'auto_update_core_minor','enabled','on'),(98,'auto_update_core_major','enabled','on'),(99,'wp_force_deactivated_plugins','a:0:{}','on'),(100,'wp_attachment_pages_enabled','0','on'),(101,'initial_db_version','58975','on'),(102,'wp_user_roles','a: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;}}}','on'),(103,'fresh_site','0','off'),(104,'user_count','1','off'),(105,'widget_block','a: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;}','auto'),(106,'sidebars_widgets','a: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;}','auto'),(107,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(108,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(109,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(110,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(111,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(112,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(113,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(114,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(115,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(116,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(117,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(118,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(119,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(120,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(121,'_transient_wp_core_block_css_files','a:2:{s:7:\"version\";s:5:\"6.8.1\";s:5:\"files\";a:536:{i:0;s:23:\"archives/editor-rtl.css\";i:1;s:27:\"archives/editor-rtl.min.css\";i:2;s:19:\"archives/editor.css\";i:3;s:23:\"archives/editor.min.css\";i:4;s:22:\"archives/style-rtl.css\";i:5;s:26:\"archives/style-rtl.min.css\";i:6;s:18:\"archives/style.css\";i:7;s:22:\"archives/style.min.css\";i:8;s:20:\"audio/editor-rtl.css\";i:9;s:24:\"audio/editor-rtl.min.css\";i:10;s:16:\"audio/editor.css\";i:11;s:20:\"audio/editor.min.css\";i:12;s:19:\"audio/style-rtl.css\";i:13;s:23:\"audio/style-rtl.min.css\";i:14;s:15:\"audio/style.css\";i:15;s:19:\"audio/style.min.css\";i:16;s:19:\"audio/theme-rtl.css\";i:17;s:23:\"audio/theme-rtl.min.css\";i:18;s:15:\"audio/theme.css\";i:19;s:19:\"audio/theme.min.css\";i:20;s:21:\"avatar/editor-rtl.css\";i:21;s:25:\"avatar/editor-rtl.min.css\";i:22;s:17:\"avatar/editor.css\";i:23;s:21:\"avatar/editor.min.css\";i:24;s:20:\"avatar/style-rtl.css\";i:25;s:24:\"avatar/style-rtl.min.css\";i:26;s:16:\"avatar/style.css\";i:27;s:20:\"avatar/style.min.css\";i:28;s:21:\"button/editor-rtl.css\";i:29;s:25:\"button/editor-rtl.min.css\";i:30;s:17:\"button/editor.css\";i:31;s:21:\"button/editor.min.css\";i:32;s:20:\"button/style-rtl.css\";i:33;s:24:\"button/style-rtl.min.css\";i:34;s:16:\"button/style.css\";i:35;s:20:\"button/style.min.css\";i:36;s:22:\"buttons/editor-rtl.css\";i:37;s:26:\"buttons/editor-rtl.min.css\";i:38;s:18:\"buttons/editor.css\";i:39;s:22:\"buttons/editor.min.css\";i:40;s:21:\"buttons/style-rtl.css\";i:41;s:25:\"buttons/style-rtl.min.css\";i:42;s:17:\"buttons/style.css\";i:43;s:21:\"buttons/style.min.css\";i:44;s:22:\"calendar/style-rtl.css\";i:45;s:26:\"calendar/style-rtl.min.css\";i:46;s:18:\"calendar/style.css\";i:47;s:22:\"calendar/style.min.css\";i:48;s:25:\"categories/editor-rtl.css\";i:49;s:29:\"categories/editor-rtl.min.css\";i:50;s:21:\"categories/editor.css\";i:51;s:25:\"categories/editor.min.css\";i:52;s:24:\"categories/style-rtl.css\";i:53;s:28:\"categories/style-rtl.min.css\";i:54;s:20:\"categories/style.css\";i:55;s:24:\"categories/style.min.css\";i:56;s:19:\"code/editor-rtl.css\";i:57;s:23:\"code/editor-rtl.min.css\";i:58;s:15:\"code/editor.css\";i:59;s:19:\"code/editor.min.css\";i:60;s:18:\"code/style-rtl.css\";i:61;s:22:\"code/style-rtl.min.css\";i:62;s:14:\"code/style.css\";i:63;s:18:\"code/style.min.css\";i:64;s:18:\"code/theme-rtl.css\";i:65;s:22:\"code/theme-rtl.min.css\";i:66;s:14:\"code/theme.css\";i:67;s:18:\"code/theme.min.css\";i:68;s:22:\"columns/editor-rtl.css\";i:69;s:26:\"columns/editor-rtl.min.css\";i:70;s:18:\"columns/editor.css\";i:71;s:22:\"columns/editor.min.css\";i:72;s:21:\"columns/style-rtl.css\";i:73;s:25:\"columns/style-rtl.min.css\";i:74;s:17:\"columns/style.css\";i:75;s:21:\"columns/style.min.css\";i:76;s:33:\"comment-author-name/style-rtl.css\";i:77;s:37:\"comment-author-name/style-rtl.min.css\";i:78;s:29:\"comment-author-name/style.css\";i:79;s:33:\"comment-author-name/style.min.css\";i:80;s:29:\"comment-content/style-rtl.css\";i:81;s:33:\"comment-content/style-rtl.min.css\";i:82;s:25:\"comment-content/style.css\";i:83;s:29:\"comment-content/style.min.css\";i:84;s:26:\"comment-date/style-rtl.css\";i:85;s:30:\"comment-date/style-rtl.min.css\";i:86;s:22:\"comment-date/style.css\";i:87;s:26:\"comment-date/style.min.css\";i:88;s:31:\"comment-edit-link/style-rtl.css\";i:89;s:35:\"comment-edit-link/style-rtl.min.css\";i:90;s:27:\"comment-edit-link/style.css\";i:91;s:31:\"comment-edit-link/style.min.css\";i:92;s:32:\"comment-reply-link/style-rtl.css\";i:93;s:36:\"comment-reply-link/style-rtl.min.css\";i:94;s:28:\"comment-reply-link/style.css\";i:95;s:32:\"comment-reply-link/style.min.css\";i:96;s:30:\"comment-template/style-rtl.css\";i:97;s:34:\"comment-template/style-rtl.min.css\";i:98;s:26:\"comment-template/style.css\";i:99;s:30:\"comment-template/style.min.css\";i:100;s:42:\"comments-pagination-numbers/editor-rtl.css\";i:101;s:46:\"comments-pagination-numbers/editor-rtl.min.css\";i:102;s:38:\"comments-pagination-numbers/editor.css\";i:103;s:42:\"comments-pagination-numbers/editor.min.css\";i:104;s:34:\"comments-pagination/editor-rtl.css\";i:105;s:38:\"comments-pagination/editor-rtl.min.css\";i:106;s:30:\"comments-pagination/editor.css\";i:107;s:34:\"comments-pagination/editor.min.css\";i:108;s:33:\"comments-pagination/style-rtl.css\";i:109;s:37:\"comments-pagination/style-rtl.min.css\";i:110;s:29:\"comments-pagination/style.css\";i:111;s:33:\"comments-pagination/style.min.css\";i:112;s:29:\"comments-title/editor-rtl.css\";i:113;s:33:\"comments-title/editor-rtl.min.css\";i:114;s:25:\"comments-title/editor.css\";i:115;s:29:\"comments-title/editor.min.css\";i:116;s:23:\"comments/editor-rtl.css\";i:117;s:27:\"comments/editor-rtl.min.css\";i:118;s:19:\"comments/editor.css\";i:119;s:23:\"comments/editor.min.css\";i:120;s:22:\"comments/style-rtl.css\";i:121;s:26:\"comments/style-rtl.min.css\";i:122;s:18:\"comments/style.css\";i:123;s:22:\"comments/style.min.css\";i:124;s:20:\"cover/editor-rtl.css\";i:125;s:24:\"cover/editor-rtl.min.css\";i:126;s:16:\"cover/editor.css\";i:127;s:20:\"cover/editor.min.css\";i:128;s:19:\"cover/style-rtl.css\";i:129;s:23:\"cover/style-rtl.min.css\";i:130;s:15:\"cover/style.css\";i:131;s:19:\"cover/style.min.css\";i:132;s:22:\"details/editor-rtl.css\";i:133;s:26:\"details/editor-rtl.min.css\";i:134;s:18:\"details/editor.css\";i:135;s:22:\"details/editor.min.css\";i:136;s:21:\"details/style-rtl.css\";i:137;s:25:\"details/style-rtl.min.css\";i:138;s:17:\"details/style.css\";i:139;s:21:\"details/style.min.css\";i:140;s:20:\"embed/editor-rtl.css\";i:141;s:24:\"embed/editor-rtl.min.css\";i:142;s:16:\"embed/editor.css\";i:143;s:20:\"embed/editor.min.css\";i:144;s:19:\"embed/style-rtl.css\";i:145;s:23:\"embed/style-rtl.min.css\";i:146;s:15:\"embed/style.css\";i:147;s:19:\"embed/style.min.css\";i:148;s:19:\"embed/theme-rtl.css\";i:149;s:23:\"embed/theme-rtl.min.css\";i:150;s:15:\"embed/theme.css\";i:151;s:19:\"embed/theme.min.css\";i:152;s:19:\"file/editor-rtl.css\";i:153;s:23:\"file/editor-rtl.min.css\";i:154;s:15:\"file/editor.css\";i:155;s:19:\"file/editor.min.css\";i:156;s:18:\"file/style-rtl.css\";i:157;s:22:\"file/style-rtl.min.css\";i:158;s:14:\"file/style.css\";i:159;s:18:\"file/style.min.css\";i:160;s:23:\"footnotes/style-rtl.css\";i:161;s:27:\"footnotes/style-rtl.min.css\";i:162;s:19:\"footnotes/style.css\";i:163;s:23:\"footnotes/style.min.css\";i:164;s:23:\"freeform/editor-rtl.css\";i:165;s:27:\"freeform/editor-rtl.min.css\";i:166;s:19:\"freeform/editor.css\";i:167;s:23:\"freeform/editor.min.css\";i:168;s:22:\"gallery/editor-rtl.css\";i:169;s:26:\"gallery/editor-rtl.min.css\";i:170;s:18:\"gallery/editor.css\";i:171;s:22:\"gallery/editor.min.css\";i:172;s:21:\"gallery/style-rtl.css\";i:173;s:25:\"gallery/style-rtl.min.css\";i:174;s:17:\"gallery/style.css\";i:175;s:21:\"gallery/style.min.css\";i:176;s:21:\"gallery/theme-rtl.css\";i:177;s:25:\"gallery/theme-rtl.min.css\";i:178;s:17:\"gallery/theme.css\";i:179;s:21:\"gallery/theme.min.css\";i:180;s:20:\"group/editor-rtl.css\";i:181;s:24:\"group/editor-rtl.min.css\";i:182;s:16:\"group/editor.css\";i:183;s:20:\"group/editor.min.css\";i:184;s:19:\"group/style-rtl.css\";i:185;s:23:\"group/style-rtl.min.css\";i:186;s:15:\"group/style.css\";i:187;s:19:\"group/style.min.css\";i:188;s:19:\"group/theme-rtl.css\";i:189;s:23:\"group/theme-rtl.min.css\";i:190;s:15:\"group/theme.css\";i:191;s:19:\"group/theme.min.css\";i:192;s:21:\"heading/style-rtl.css\";i:193;s:25:\"heading/style-rtl.min.css\";i:194;s:17:\"heading/style.css\";i:195;s:21:\"heading/style.min.css\";i:196;s:19:\"html/editor-rtl.css\";i:197;s:23:\"html/editor-rtl.min.css\";i:198;s:15:\"html/editor.css\";i:199;s:19:\"html/editor.min.css\";i:200;s:20:\"image/editor-rtl.css\";i:201;s:24:\"image/editor-rtl.min.css\";i:202;s:16:\"image/editor.css\";i:203;s:20:\"image/editor.min.css\";i:204;s:19:\"image/style-rtl.css\";i:205;s:23:\"image/style-rtl.min.css\";i:206;s:15:\"image/style.css\";i:207;s:19:\"image/style.min.css\";i:208;s:19:\"image/theme-rtl.css\";i:209;s:23:\"image/theme-rtl.min.css\";i:210;s:15:\"image/theme.css\";i:211;s:19:\"image/theme.min.css\";i:212;s:29:\"latest-comments/style-rtl.css\";i:213;s:33:\"latest-comments/style-rtl.min.css\";i:214;s:25:\"latest-comments/style.css\";i:215;s:29:\"latest-comments/style.min.css\";i:216;s:27:\"latest-posts/editor-rtl.css\";i:217;s:31:\"latest-posts/editor-rtl.min.css\";i:218;s:23:\"latest-posts/editor.css\";i:219;s:27:\"latest-posts/editor.min.css\";i:220;s:26:\"latest-posts/style-rtl.css\";i:221;s:30:\"latest-posts/style-rtl.min.css\";i:222;s:22:\"latest-posts/style.css\";i:223;s:26:\"latest-posts/style.min.css\";i:224;s:18:\"list/style-rtl.css\";i:225;s:22:\"list/style-rtl.min.css\";i:226;s:14:\"list/style.css\";i:227;s:18:\"list/style.min.css\";i:228;s:22:\"loginout/style-rtl.css\";i:229;s:26:\"loginout/style-rtl.min.css\";i:230;s:18:\"loginout/style.css\";i:231;s:22:\"loginout/style.min.css\";i:232;s:25:\"media-text/editor-rtl.css\";i:233;s:29:\"media-text/editor-rtl.min.css\";i:234;s:21:\"media-text/editor.css\";i:235;s:25:\"media-text/editor.min.css\";i:236;s:24:\"media-text/style-rtl.css\";i:237;s:28:\"media-text/style-rtl.min.css\";i:238;s:20:\"media-text/style.css\";i:239;s:24:\"media-text/style.min.css\";i:240;s:19:\"more/editor-rtl.css\";i:241;s:23:\"more/editor-rtl.min.css\";i:242;s:15:\"more/editor.css\";i:243;s:19:\"more/editor.min.css\";i:244;s:30:\"navigation-link/editor-rtl.css\";i:245;s:34:\"navigation-link/editor-rtl.min.css\";i:246;s:26:\"navigation-link/editor.css\";i:247;s:30:\"navigation-link/editor.min.css\";i:248;s:29:\"navigation-link/style-rtl.css\";i:249;s:33:\"navigation-link/style-rtl.min.css\";i:250;s:25:\"navigation-link/style.css\";i:251;s:29:\"navigation-link/style.min.css\";i:252;s:33:\"navigation-submenu/editor-rtl.css\";i:253;s:37:\"navigation-submenu/editor-rtl.min.css\";i:254;s:29:\"navigation-submenu/editor.css\";i:255;s:33:\"navigation-submenu/editor.min.css\";i:256;s:25:\"navigation/editor-rtl.css\";i:257;s:29:\"navigation/editor-rtl.min.css\";i:258;s:21:\"navigation/editor.css\";i:259;s:25:\"navigation/editor.min.css\";i:260;s:24:\"navigation/style-rtl.css\";i:261;s:28:\"navigation/style-rtl.min.css\";i:262;s:20:\"navigation/style.css\";i:263;s:24:\"navigation/style.min.css\";i:264;s:23:\"nextpage/editor-rtl.css\";i:265;s:27:\"nextpage/editor-rtl.min.css\";i:266;s:19:\"nextpage/editor.css\";i:267;s:23:\"nextpage/editor.min.css\";i:268;s:24:\"page-list/editor-rtl.css\";i:269;s:28:\"page-list/editor-rtl.min.css\";i:270;s:20:\"page-list/editor.css\";i:271;s:24:\"page-list/editor.min.css\";i:272;s:23:\"page-list/style-rtl.css\";i:273;s:27:\"page-list/style-rtl.min.css\";i:274;s:19:\"page-list/style.css\";i:275;s:23:\"page-list/style.min.css\";i:276;s:24:\"paragraph/editor-rtl.css\";i:277;s:28:\"paragraph/editor-rtl.min.css\";i:278;s:20:\"paragraph/editor.css\";i:279;s:24:\"paragraph/editor.min.css\";i:280;s:23:\"paragraph/style-rtl.css\";i:281;s:27:\"paragraph/style-rtl.min.css\";i:282;s:19:\"paragraph/style.css\";i:283;s:23:\"paragraph/style.min.css\";i:284;s:35:\"post-author-biography/style-rtl.css\";i:285;s:39:\"post-author-biography/style-rtl.min.css\";i:286;s:31:\"post-author-biography/style.css\";i:287;s:35:\"post-author-biography/style.min.css\";i:288;s:30:\"post-author-name/style-rtl.css\";i:289;s:34:\"post-author-name/style-rtl.min.css\";i:290;s:26:\"post-author-name/style.css\";i:291;s:30:\"post-author-name/style.min.css\";i:292;s:26:\"post-author/editor-rtl.css\";i:293;s:30:\"post-author/editor-rtl.min.css\";i:294;s:22:\"post-author/editor.css\";i:295;s:26:\"post-author/editor.min.css\";i:296;s:25:\"post-author/style-rtl.css\";i:297;s:29:\"post-author/style-rtl.min.css\";i:298;s:21:\"post-author/style.css\";i:299;s:25:\"post-author/style.min.css\";i:300;s:33:\"post-comments-form/editor-rtl.css\";i:301;s:37:\"post-comments-form/editor-rtl.min.css\";i:302;s:29:\"post-comments-form/editor.css\";i:303;s:33:\"post-comments-form/editor.min.css\";i:304;s:32:\"post-comments-form/style-rtl.css\";i:305;s:36:\"post-comments-form/style-rtl.min.css\";i:306;s:28:\"post-comments-form/style.css\";i:307;s:32:\"post-comments-form/style.min.css\";i:308;s:26:\"post-content/style-rtl.css\";i:309;s:30:\"post-content/style-rtl.min.css\";i:310;s:22:\"post-content/style.css\";i:311;s:26:\"post-content/style.min.css\";i:312;s:23:\"post-date/style-rtl.css\";i:313;s:27:\"post-date/style-rtl.min.css\";i:314;s:19:\"post-date/style.css\";i:315;s:23:\"post-date/style.min.css\";i:316;s:27:\"post-excerpt/editor-rtl.css\";i:317;s:31:\"post-excerpt/editor-rtl.min.css\";i:318;s:23:\"post-excerpt/editor.css\";i:319;s:27:\"post-excerpt/editor.min.css\";i:320;s:26:\"post-excerpt/style-rtl.css\";i:321;s:30:\"post-excerpt/style-rtl.min.css\";i:322;s:22:\"post-excerpt/style.css\";i:323;s:26:\"post-excerpt/style.min.css\";i:324;s:34:\"post-featured-image/editor-rtl.css\";i:325;s:38:\"post-featured-image/editor-rtl.min.css\";i:326;s:30:\"post-featured-image/editor.css\";i:327;s:34:\"post-featured-image/editor.min.css\";i:328;s:33:\"post-featured-image/style-rtl.css\";i:329;s:37:\"post-featured-image/style-rtl.min.css\";i:330;s:29:\"post-featured-image/style.css\";i:331;s:33:\"post-featured-image/style.min.css\";i:332;s:34:\"post-navigation-link/style-rtl.css\";i:333;s:38:\"post-navigation-link/style-rtl.min.css\";i:334;s:30:\"post-navigation-link/style.css\";i:335;s:34:\"post-navigation-link/style.min.css\";i:336;s:27:\"post-template/style-rtl.css\";i:337;s:31:\"post-template/style-rtl.min.css\";i:338;s:23:\"post-template/style.css\";i:339;s:27:\"post-template/style.min.css\";i:340;s:24:\"post-terms/style-rtl.css\";i:341;s:28:\"post-terms/style-rtl.min.css\";i:342;s:20:\"post-terms/style.css\";i:343;s:24:\"post-terms/style.min.css\";i:344;s:24:\"post-title/style-rtl.css\";i:345;s:28:\"post-title/style-rtl.min.css\";i:346;s:20:\"post-title/style.css\";i:347;s:24:\"post-title/style.min.css\";i:348;s:26:\"preformatted/style-rtl.css\";i:349;s:30:\"preformatted/style-rtl.min.css\";i:350;s:22:\"preformatted/style.css\";i:351;s:26:\"preformatted/style.min.css\";i:352;s:24:\"pullquote/editor-rtl.css\";i:353;s:28:\"pullquote/editor-rtl.min.css\";i:354;s:20:\"pullquote/editor.css\";i:355;s:24:\"pullquote/editor.min.css\";i:356;s:23:\"pullquote/style-rtl.css\";i:357;s:27:\"pullquote/style-rtl.min.css\";i:358;s:19:\"pullquote/style.css\";i:359;s:23:\"pullquote/style.min.css\";i:360;s:23:\"pullquote/theme-rtl.css\";i:361;s:27:\"pullquote/theme-rtl.min.css\";i:362;s:19:\"pullquote/theme.css\";i:363;s:23:\"pullquote/theme.min.css\";i:364;s:39:\"query-pagination-numbers/editor-rtl.css\";i:365;s:43:\"query-pagination-numbers/editor-rtl.min.css\";i:366;s:35:\"query-pagination-numbers/editor.css\";i:367;s:39:\"query-pagination-numbers/editor.min.css\";i:368;s:31:\"query-pagination/editor-rtl.css\";i:369;s:35:\"query-pagination/editor-rtl.min.css\";i:370;s:27:\"query-pagination/editor.css\";i:371;s:31:\"query-pagination/editor.min.css\";i:372;s:30:\"query-pagination/style-rtl.css\";i:373;s:34:\"query-pagination/style-rtl.min.css\";i:374;s:26:\"query-pagination/style.css\";i:375;s:30:\"query-pagination/style.min.css\";i:376;s:25:\"query-title/style-rtl.css\";i:377;s:29:\"query-title/style-rtl.min.css\";i:378;s:21:\"query-title/style.css\";i:379;s:25:\"query-title/style.min.css\";i:380;s:25:\"query-total/style-rtl.css\";i:381;s:29:\"query-total/style-rtl.min.css\";i:382;s:21:\"query-total/style.css\";i:383;s:25:\"query-total/style.min.css\";i:384;s:20:\"query/editor-rtl.css\";i:385;s:24:\"query/editor-rtl.min.css\";i:386;s:16:\"query/editor.css\";i:387;s:20:\"query/editor.min.css\";i:388;s:19:\"quote/style-rtl.css\";i:389;s:23:\"quote/style-rtl.min.css\";i:390;s:15:\"quote/style.css\";i:391;s:19:\"quote/style.min.css\";i:392;s:19:\"quote/theme-rtl.css\";i:393;s:23:\"quote/theme-rtl.min.css\";i:394;s:15:\"quote/theme.css\";i:395;s:19:\"quote/theme.min.css\";i:396;s:23:\"read-more/style-rtl.css\";i:397;s:27:\"read-more/style-rtl.min.css\";i:398;s:19:\"read-more/style.css\";i:399;s:23:\"read-more/style.min.css\";i:400;s:18:\"rss/editor-rtl.css\";i:401;s:22:\"rss/editor-rtl.min.css\";i:402;s:14:\"rss/editor.css\";i:403;s:18:\"rss/editor.min.css\";i:404;s:17:\"rss/style-rtl.css\";i:405;s:21:\"rss/style-rtl.min.css\";i:406;s:13:\"rss/style.css\";i:407;s:17:\"rss/style.min.css\";i:408;s:21:\"search/editor-rtl.css\";i:409;s:25:\"search/editor-rtl.min.css\";i:410;s:17:\"search/editor.css\";i:411;s:21:\"search/editor.min.css\";i:412;s:20:\"search/style-rtl.css\";i:413;s:24:\"search/style-rtl.min.css\";i:414;s:16:\"search/style.css\";i:415;s:20:\"search/style.min.css\";i:416;s:20:\"search/theme-rtl.css\";i:417;s:24:\"search/theme-rtl.min.css\";i:418;s:16:\"search/theme.css\";i:419;s:20:\"search/theme.min.css\";i:420;s:24:\"separator/editor-rtl.css\";i:421;s:28:\"separator/editor-rtl.min.css\";i:422;s:20:\"separator/editor.css\";i:423;s:24:\"separator/editor.min.css\";i:424;s:23:\"separator/style-rtl.css\";i:425;s:27:\"separator/style-rtl.min.css\";i:426;s:19:\"separator/style.css\";i:427;s:23:\"separator/style.min.css\";i:428;s:23:\"separator/theme-rtl.css\";i:429;s:27:\"separator/theme-rtl.min.css\";i:430;s:19:\"separator/theme.css\";i:431;s:23:\"separator/theme.min.css\";i:432;s:24:\"shortcode/editor-rtl.css\";i:433;s:28:\"shortcode/editor-rtl.min.css\";i:434;s:20:\"shortcode/editor.css\";i:435;s:24:\"shortcode/editor.min.css\";i:436;s:24:\"site-logo/editor-rtl.css\";i:437;s:28:\"site-logo/editor-rtl.min.css\";i:438;s:20:\"site-logo/editor.css\";i:439;s:24:\"site-logo/editor.min.css\";i:440;s:23:\"site-logo/style-rtl.css\";i:441;s:27:\"site-logo/style-rtl.min.css\";i:442;s:19:\"site-logo/style.css\";i:443;s:23:\"site-logo/style.min.css\";i:444;s:27:\"site-tagline/editor-rtl.css\";i:445;s:31:\"site-tagline/editor-rtl.min.css\";i:446;s:23:\"site-tagline/editor.css\";i:447;s:27:\"site-tagline/editor.min.css\";i:448;s:26:\"site-tagline/style-rtl.css\";i:449;s:30:\"site-tagline/style-rtl.min.css\";i:450;s:22:\"site-tagline/style.css\";i:451;s:26:\"site-tagline/style.min.css\";i:452;s:25:\"site-title/editor-rtl.css\";i:453;s:29:\"site-title/editor-rtl.min.css\";i:454;s:21:\"site-title/editor.css\";i:455;s:25:\"site-title/editor.min.css\";i:456;s:24:\"site-title/style-rtl.css\";i:457;s:28:\"site-title/style-rtl.min.css\";i:458;s:20:\"site-title/style.css\";i:459;s:24:\"site-title/style.min.css\";i:460;s:26:\"social-link/editor-rtl.css\";i:461;s:30:\"social-link/editor-rtl.min.css\";i:462;s:22:\"social-link/editor.css\";i:463;s:26:\"social-link/editor.min.css\";i:464;s:27:\"social-links/editor-rtl.css\";i:465;s:31:\"social-links/editor-rtl.min.css\";i:466;s:23:\"social-links/editor.css\";i:467;s:27:\"social-links/editor.min.css\";i:468;s:26:\"social-links/style-rtl.css\";i:469;s:30:\"social-links/style-rtl.min.css\";i:470;s:22:\"social-links/style.css\";i:471;s:26:\"social-links/style.min.css\";i:472;s:21:\"spacer/editor-rtl.css\";i:473;s:25:\"spacer/editor-rtl.min.css\";i:474;s:17:\"spacer/editor.css\";i:475;s:21:\"spacer/editor.min.css\";i:476;s:20:\"spacer/style-rtl.css\";i:477;s:24:\"spacer/style-rtl.min.css\";i:478;s:16:\"spacer/style.css\";i:479;s:20:\"spacer/style.min.css\";i:480;s:20:\"table/editor-rtl.css\";i:481;s:24:\"table/editor-rtl.min.css\";i:482;s:16:\"table/editor.css\";i:483;s:20:\"table/editor.min.css\";i:484;s:19:\"table/style-rtl.css\";i:485;s:23:\"table/style-rtl.min.css\";i:486;s:15:\"table/style.css\";i:487;s:19:\"table/style.min.css\";i:488;s:19:\"table/theme-rtl.css\";i:489;s:23:\"table/theme-rtl.min.css\";i:490;s:15:\"table/theme.css\";i:491;s:19:\"table/theme.min.css\";i:492;s:24:\"tag-cloud/editor-rtl.css\";i:493;s:28:\"tag-cloud/editor-rtl.min.css\";i:494;s:20:\"tag-cloud/editor.css\";i:495;s:24:\"tag-cloud/editor.min.css\";i:496;s:23:\"tag-cloud/style-rtl.css\";i:497;s:27:\"tag-cloud/style-rtl.min.css\";i:498;s:19:\"tag-cloud/style.css\";i:499;s:23:\"tag-cloud/style.min.css\";i:500;s:28:\"template-part/editor-rtl.css\";i:501;s:32:\"template-part/editor-rtl.min.css\";i:502;s:24:\"template-part/editor.css\";i:503;s:28:\"template-part/editor.min.css\";i:504;s:27:\"template-part/theme-rtl.css\";i:505;s:31:\"template-part/theme-rtl.min.css\";i:506;s:23:\"template-part/theme.css\";i:507;s:27:\"template-part/theme.min.css\";i:508;s:30:\"term-description/style-rtl.css\";i:509;s:34:\"term-description/style-rtl.min.css\";i:510;s:26:\"term-description/style.css\";i:511;s:30:\"term-description/style.min.css\";i:512;s:27:\"text-columns/editor-rtl.css\";i:513;s:31:\"text-columns/editor-rtl.min.css\";i:514;s:23:\"text-columns/editor.css\";i:515;s:27:\"text-columns/editor.min.css\";i:516;s:26:\"text-columns/style-rtl.css\";i:517;s:30:\"text-columns/style-rtl.min.css\";i:518;s:22:\"text-columns/style.css\";i:519;s:26:\"text-columns/style.min.css\";i:520;s:19:\"verse/style-rtl.css\";i:521;s:23:\"verse/style-rtl.min.css\";i:522;s:15:\"verse/style.css\";i:523;s:19:\"verse/style.min.css\";i:524;s:20:\"video/editor-rtl.css\";i:525;s:24:\"video/editor-rtl.min.css\";i:526;s:16:\"video/editor.css\";i:527;s:20:\"video/editor.min.css\";i:528;s:19:\"video/style-rtl.css\";i:529;s:23:\"video/style-rtl.min.css\";i:530;s:15:\"video/style.css\";i:531;s:19:\"video/style.min.css\";i:532;s:19:\"video/theme-rtl.css\";i:533;s:23:\"video/theme-rtl.min.css\";i:534;s:15:\"video/theme.css\";i:535;s:19:\"video/theme.min.css\";}}','on'),(125,'recovery_keys','a:0:{}','off'),(126,'WPLANG','','auto'),(127,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.1.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.1.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-6.8.1-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-6.8.1-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:5:\"6.8.1\";s:7:\"version\";s:5:\"6.8.1\";s:11:\"php_version\";s:6:\"7.2.24\";s:13:\"mysql_version\";s:5:\"5.5.5\";s:11:\"new_bundled\";s:3:\"6.7\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1747384735;s:15:\"version_checked\";s:5:\"6.8.1\";s:12:\"translations\";a:0:{}}','off'),(134,'_site_transient_timeout_php_check_a34f4a08303dd29cee70e79d780daa9d','1743763286','off'),(135,'_site_transient_php_check_a34f4a08303dd29cee70e79d780daa9d','a:5:{s:19:\"recommended_version\";s:3:\"7.4\";s:15:\"minimum_version\";s:6:\"7.2.24\";s:12:\"is_supported\";b:1;s:9:\"is_secure\";b:1;s:13:\"is_acceptable\";b:1;}','off'),(137,'_site_transient_timeout_community-events-d41d8cd98f00b204e9800998ecf8427e','1743206670','off'),(138,'_site_transient_community-events-d41d8cd98f00b204e9800998ecf8427e','a:4:{s:9:\"sandboxed\";b:0;s:5:\"error\";N;s:8:\"location\";a:1:{s:2:\"ip\";b:0;}s:6:\"events\";a:3:{i:0;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:26:\"WordUp Warszawa 01.04.2025\";s:3:\"url\";s:46:\"https://www.meetup.com/wordup/events/306754170\";s:6:\"meetup\";s:15:\"WordUp Warszawa\";s:10:\"meetup_url\";s:30:\"https://www.meetup.com/wordup/\";s:4:\"date\";s:19:\"2025-04-01 18:00:00\";s:8:\"end_date\";s:19:\"2025-04-01 22:00:00\";s:20:\"start_unix_timestamp\";i:1743523200;s:18:\"end_unix_timestamp\";i:1743537600;s:8:\"location\";a:4:{s:8:\"location\";s:16:\"Warszawa, Poland\";s:7:\"country\";s:2:\"PL\";s:8:\"latitude\";d:52.224530000000001;s:9:\"longitude\";d:21.015460000000001;}}i:1;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:24:\"WordCamp Kraków, Poland\";s:3:\"url\";s:33:\"https://krakow.wordcamp.org/2025/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2025-06-27 00:00:00\";s:8:\"end_date\";s:19:\"2025-06-29 00:00:00\";s:20:\"start_unix_timestamp\";i:1750975200;s:18:\"end_unix_timestamp\";i:1751148000;s:8:\"location\";a:4:{s:8:\"location\";s:15:\"Kraków, Poland\";s:7:\"country\";s:2:\"PL\";s:8:\"latitude\";d:50.071798000000001;s:9:\"longitude\";d:19.939965000000001;}}i:2;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:18:\"WordCamp Lithuania\";s:3:\"url\";s:36:\"https://lithuania.wordcamp.org/2025/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2025-09-25 00:00:00\";s:8:\"end_date\";s:19:\"2025-09-26 00:00:00\";s:20:\"start_unix_timestamp\";i:1758747600;s:18:\"end_unix_timestamp\";i:1758834000;s:8:\"location\";a:4:{s:8:\"location\";s:6:\"Kaunas\";s:7:\"country\";s:2:\"LT\";s:8:\"latitude\";d:54.899647000000002;s:9:\"longitude\";d:23.961511399999999;}}}}','off'),(139,'can_compress_scripts','0','on'),(142,'_transient_timeout_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1747427936','off'),(143,'_transient_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1747384736','off'),(146,'_transient_timeout_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1747427937','off'),(147,'_transient_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1747384737','off'),(150,'_site_transient_wp_plugin_dependencies_plugin_data','a:1:{s:10:\"wp-graphql\";a:35:{s:4:\"name\";s:9:\"WPGraphQL\";s:4:\"slug\";s:10:\"wp-graphql\";s:7:\"version\";s:5:\"2.3.0\";s:6:\"author\";s:66:\"Jason Bahl\";s:14:\"author_profile\";s:41:\"https://profiles.wordpress.org/jasonbahl/\";s:12:\"contributors\";a:6:{s:9:\"jasonbahl\";a:3:{s:7:\"profile\";s:41:\"https://profiles.wordpress.org/jasonbahl/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/798f7b954678b4efaafa269e29194e435a61bbd02accfbf2a93ebc37888f9ce5?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:10:\"Jason Bahl\";}s:12:\"tylerbarnes1\";a:3:{s:7:\"profile\";s:44:\"https://profiles.wordpress.org/tylerbarnes1/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/0168aae06b1406c39d3ba9ea8138d8de975df7cd08382e9960976e7fe3701c2a?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:5:\"Tyler\";}s:10:\"ryankanner\";a:3:{s:7:\"profile\";s:42:\"https://profiles.wordpress.org/ryankanner/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/0b51cdade8f3b0ac34c620396636f857d4189bfdb7f3df4249a5e9b9d114a022?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:11:\"Ryan Kanner\";}s:10:\"chopinbach\";a:3:{s:7:\"profile\";s:42:\"https://profiles.wordpress.org/chopinbach/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/e9ef79a809e178334a16c65dc6d46a66aeb6226486fd316e285d0957b222c127?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:13:\"Edwin Cromley\";}s:9:\"kidunot89\";a:3:{s:7:\"profile\";s:41:\"https://profiles.wordpress.org/kidunot89/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/b88ae0ad9a6c04e5ee6050d959957f7662fd56d036e13f8d5d195e0ea1016036?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:12:\"Geoff Taylor\";}s:10:\"justlevine\";a:3:{s:7:\"profile\";s:42:\"https://profiles.wordpress.org/justlevine/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/33212bff2915bd72792772a2d3203abe0402352b6be6ba65081036f10560c6e6?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:12:\"David Levine\";}}s:8:\"requires\";s:3:\"6.0\";s:6:\"tested\";s:5:\"6.8.1\";s:12:\"requires_php\";s:3:\"7.4\";s:16:\"requires_plugins\";a:0:{}s:6:\"rating\";i:98;s:7:\"ratings\";a:5:{i:5;i:46;i:4;i:1;i:3;i:1;i:2;i:0;i:1;i:0;}s:11:\"num_ratings\";i:48;s:11:\"support_url\";s:48:\"https://wordpress.org/support/plugin/wp-graphql/\";s:15:\"support_threads\";i:3;s:24:\"support_threads_resolved\";i:2;s:15:\"active_installs\";i:30000;s:12:\"last_updated\";s:22:\"2025-05-02 10:53pm GMT\";s:5:\"added\";s:10:\"2020-11-14\";s:8:\"homepage\";s:40:\"https://github.com/wp-graphql/wp-graphql\";s:8:\"sections\";a:5:{s:11:\"description\";s:3275:\"

WPGraphQL is a free, open-source WordPress plugin that provides an extendable GraphQL schema and API for any WordPress site.

\n

Get Started

\n
    \n
  1. Install WPGraphQL: wp plugin install wp-graphql --activate
  2. \n
  3. Try it out: Live Demo
  4. \n
  5. Read the Quick Start Guide.
  6. \n
  7. Join the Community on Discord and Star the Repo!
  8. \n
\n

Key Features

\n
    \n
  • Flexible API: Query posts, pages, custom post types, taxonomies, users, and more.
  • \n
  • Extendable Schema: Easily add functionality with WPGraphQL’s API, enabling custom integrations.
  • \n
  • Compatible with Modern Frameworks: Works seamlessly with Next.js, Astro, SvelteKit, and more.
  • \n
  • Optimized Performance: Fetch exactly the data you need in a single query. Boost performance with WPGraphQL Smart Cache.
  • \n
\n

WPGraphQL is becoming a Canonical Plugin on WordPress.org, ensuring long-term support and a growing community of users and contributors.

\n

Upgrading

\n

It is recommended that anytime you want to update WPGraphQL that you get familiar with what’s changed in the release.

\n

WPGraphQL publishes release notes on Github.

\n

WPGraphQL has been following Semver practices for a few years. We will continue to follow Semver and let version numbers communicate meaning. The summary of Semver versioning is as follows:

\n
    \n
  • MAJOR version when you make incompatible API changes,
  • \n
  • MINOR version when you add functionality in a backwards compatible manner, and
  • \n
  • PATCH version when you make backwards compatible bug fixes.
  • \n
\n

You can read more about the details of Semver at semver.org

\n

Privacy Policy

\n

WPGraphQL uses Appsero SDK to collect some telemetry data upon user’s confirmation. This helps us to troubleshoot problems faster and make product improvements.

\n

Appsero SDK does not gather any data by default. The SDK starts gathering basic telemetry data only when a user allows it via the admin notice.

\n

Learn more about how Appsero collects and uses this data.

\n

Learn more about how Appsero collects and uses this data.

\n\";s:3:\"faq\";s:1570:\"\n
\nHow is WPGraphQL funded?\n\n

\n

WPGraphQL is free and open-source. It is supported by contributors, backers, and sponsors, including Automattic, which provides significant support as WPGraphQL becomes a Canonical Plugin.

\n

Learn more about supporting WPGraphQL on Open Collective.

\n

\n
\nCan I use WPGraphQL with xx JavaScript framework?\n\n

\n

Yes! WPGraphQL works with any client that can make HTTP requests to the GraphQL endpoint. It integrates seamlessly with frameworks like Next.js, Gatsby, Astro, and more.

\n

\n
\nWhere can I get support?\n\n

\n

You can join the WPGraphQL Discord community for support, discussions, and announcements.

\n

\n
\nHow does WPGraphQL handle privacy and telemetry?\n\n

\n

WPGraphQL uses the Appsero SDK to collect telemetry data only after user consent. This helps improve the plugin while respecting user privacy.

\n

\n\n\";s:9:\"changelog\";s:27418:\"

2.3.0

\n

New Features

\n
    \n
  • feat: lazy loading fields for Object Types and Interface Types (https://github.com/jasonbahl/automation-tests/pull/3356)
  • \n
  • feat: Update Enum Type descriptions (https://github.com/jasonbahl/automation-tests/pull/3355)
  • \n
\n

Bug Fixes

\n
    \n
  • fix: don’t initialize twice in class constructor (https://github.com/jasonbahl/automation-tests/pull/3369)
  • \n
  • fix: cleanup Model fields for better source-of-truth and type-safety. (https://github.com/jasonbahl/automation-tests/pull/3363)
  • \n
  • fix: bump and remove 7.3 references (https://github.com/jasonbahl/automation-tests/pull/3360)
  • \n
\n

Other Changes

\n
    \n
  • chore: improve type-safety for class (https://github.com/jasonbahl/automation-tests/pull/3367)
  • \n
  • chore: add array shapes to and (https://github.com/jasonbahl/automation-tests/pull/3366)
  • \n
  • chore: inline (non-breaking) native return types (https://github.com/jasonbahl/automation-tests/pull/3362)
  • \n
  • chore: implement array shapes for (https://github.com/jasonbahl/automation-tests/pull/3364)
  • \n
  • chore: Test compatibility with WordPress 6.8 (https://github.com/jasonbahl/automation-tests/pull/3361)
  • \n
  • ci: trigger Codeception workflow more often (https://github.com/jasonbahl/automation-tests/pull/3359)
  • \n
  • chore: Update Composer deps (https://github.com/jasonbahl/automation-tests/pull/3358)
  • \n
\n

2.2.0

\n

New Features

\n
    \n
  • feat: add support for graphql_description on register_post_type and register_taxonomy (https://github.com/jasonbahl/automation-tests/pull/3346)
  • \n
\n

Other Changes

\n
    \n
  • chore: update placeholder that didn’t properly get replaced during release (https://github.com/jasonbahl/automation-tests/pull/3349)
  • \n
  • chore: update interface descriptions (https://github.com/jasonbahl/automation-tests/pull/3347)
  • \n
\n

2.1.1

\n

Bug Fixes

\n
    \n
  • fix: Avoid the deprecation warning when sending null header values (https://github.com/jasonbahl/automation-tests/pull/3338)
  • \n
\n

Other Changes

\n
    \n
  • chore: update README’s for github workflows (https://github.com/jasonbahl/automation-tests/pull/3343)
  • \n
  • chore: update cursor rules to use .cursor/rules instead of .cursorrules (https://github.com/jasonbahl/automation-tests/pull/3333)
  • \n
  • chore: add WPGraphQL IDE to the extensions page (https://github.com/jasonbahl/automation-tests/pull/3332)
  • \n
\n

2.1.0

\n

New Features

\n
    \n
  • \n

    #3320: feat: add filter to Request::is_valid_http_content_type to allow for custom content types with POST method requests
    \nChores / Bugfixes

    \n
  • \n
  • \n

    #3314: fix: use version_compare to simplify incompatible dependent check

    \n
  • \n
  • #3316: docs: update changelog and upgrade notice
  • \n
  • #3325: docs: update quick-start.md
  • \n
  • #3190: docs: add developer docs for AbstractConnectionResolver
  • \n
\n

2.0.0

\n

BREAKING CHANGE UPDATE

\n

This is a major update that drops support for PHP versions below 7.4 and WordPress versions below 6.0.

\n

We’ve written more about the update here:

\n
    \n
  • https://www.wpgraphql.com/2024/12/16/wpgraphql-v2-0-is-coming-heres-what-you-need-to-know
  • \n
  • https://www.wpgraphql.com/2024/12/16/wpgraphql-v2-0-technical-update-breaking-changes
  • \n
\n

1.32.1

\n

Chores / Bugfixes

\n
    \n
  • #3308: fix: update term mutation was preventing terms from removing the parentId
  • \n
\n

1.32.0

\n

New Features

\n
    \n
  • #3294: feat: introduce new fields for getting mediaItem files and filePaths
  • \n
\n

Chores / Bugfixes

\n
    \n
  • update stable tag
  • \n
\n

1.31.0

\n

New Features

\n
    \n
  • #3278: feat: add option to provide custom file path for static schemas when using the wp graphql generate-static-schema command
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3284: fix: fix: Updated docs link for example of hierarchical data
  • \n
  • #3283: fix: Error in update checker when WPGraphQL is active as an mu-plugin
  • \n
  • #3293: fix: correct the resolver for the MediaDetails.file field to return the file name
  • \n
  • #3299: chore: restore excluded PHPCS rules
  • \n
  • #3301: fix: React backwards-compatibility with WP < 6.6
  • \n
  • #3302: chore: update NPM dependencies
  • \n
  • #3297: fix: typo in Extensions\\Registry\\get_extensions() method name
  • \n
  • #3303: chore: cleanup git cache
  • \n
  • #3298: chore: submit GF, Rank Math, and Headless Login plugins
  • \n
  • #3287: chore: fixes the syntax of the readme.txt so that the short description is shown on WordPress.org
  • \n
  • #3284: fix: Updated docs link for example of hierarchical data
  • \n
\n

1.30.0

\n

Chores / Bugfixes

\n
    \n
  • #3250: fix: receiving post for Incorrect uri
  • \n
  • #3268: ci: trigger PR workflows on release/* branches
  • \n
  • #3267: chore: fix bleeding edge/deprecated PHPStan smells [first pass]
  • \n
  • #3270: build(deps): bump the npm_and_yarn group across 1 directory with 3 updates
  • \n
  • #3271: fix: default cat should not be added when other categories are added
  • \n
\n

New Features

\n
    \n
  • #3251: feat: implement SemVer-compliant update checker
  • \n
  • #3196: feat: expose EnqueuedAsset.group and EnqueuedScript.location to schema
  • \n
  • #3188: feat: Add WPGraphQL Extensions page to the WordPress admin
  • \n
\n

1.29.3

\n

Chores / Bugfixes

\n
    \n
  • #3245: fix: update appsero/client to v2.0.4 to prevent conflicts with WP6.7
  • \n
  • #3243: chore: fix Composer autoloader for WPGraphQL.php
  • \n
  • #3242: chore: update Composer dev deps
  • \n
  • #3235: chore: general updates to README.md and readme.txt
  • \n
  • #3234: chore: update quick-start.md to provide more clarity around using wpackagist
  • \n
\n

1.29.2

\n

Chores / Bugfixes

\n
    \n
  • fix: move assets/blueprint.json under .wordpress-org directory
  • \n
\n

1.29.1

\n

Chores / Bugfixes

\n
    \n
  • #3226: chore: add blueprint.json so WPGraphQL can be demo’d with a live preview on WordPress.org
  • \n
  • #3218: docs: update upgrading.md to highlight how breaking change releases will be handled
  • \n
  • #3214: fix: lazy-resolve Post.sourceUrl and deprecate Post.sourceUrlsBySize
  • \n
  • #3224: chore(deps-dev): bump symfony/process from 5.4.40 to 5.4.46 in the composer group
  • \n
  • #3219: test: add tests for querying different sizes of media items
  • \n
  • #3229: fix: Deprecated null value warning in titleRendered callback
  • \n
\n

1.29.0

\n

New Features

\n
    \n
  • #3208: feat: expose commenter edge fields
  • \n
  • #3207: feat: introduce get_graphql_admin_notices and convert AdminNotices class to a singleton
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3213: chore(deps): bump the npm_and_yarn group across 1 directory with 4 updates
  • \n
  • #3212: chore(deps): bump dset from 3.1.3 to 3.1.4 in the npm_and_yarn group across 1 directory
  • \n
  • #3211: chore: add LABELS.md
  • \n
  • #3201: fix: ensure connectedTerms returns terms for the specified taxonomy only
  • \n
  • #3199: chore(deps-dev): bump the npm_and_yarn group across 1 directory with 2 updates
  • \n
\n

1.28.1

\n

Chores / Bugfixes

\n
    \n
  • #3189: fix: [regression] missing placeholder in $wpdb->prepare() call
  • \n
\n

1.28.0

\n

Upgrade Notice

\n

This release contains an internal refactor for how the Type Registry is generated which should lead to significant performance improvements for most users. While there is no known breaking changes, because this change impacts every user we highly recommend testing this release thoroughly on staging servers to ensure the changes don’t negatively impact your projects.

\n

New Features

\n
    \n
  • #3172: feat: only eagerlyLoadType on introspection requests.
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3181: ci: replace docker-compose commands with docker compose
  • \n
  • #3182: ci: test against WP 6.6
  • \n
  • #3183: fix: improve performance of SQL query in the user loader
  • \n
\n

1.27.2

\n

Chores / Bugfixes

\n
    \n
  • #3167: fix: missing .svg causing admin_menu not to be registered
  • \n
\n

1.27.1

\n

Chores / Bugfixes

\n
    \n
  • #3066: fix: merge query arg arrays instead of overriding.
  • \n
  • #3151: fix: update dev-deps and fix WPGraphQL::get_static_schema()
  • \n
  • #3152: fix: handle regression when implementing interface with identical args.
  • \n
  • #3153: chore(deps-dev): bump composer/composer from 2.7.6 to 2.7.7 in the composer group across 1 directory
  • \n
  • #3155: chore(deps-dev): bump the npm_and_yarn group across 1 directory with 2 updates
  • \n
  • #3160: chore: Update branding assets
  • \n
  • #3162: fix: set_query_arg should not merge args
  • \n
\n

1.27.0

\n

New Features

\n
    \n
  • #3143: feat: Enhance tab state management with query arguments and localStorage fallback
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3139: fix: $settings_fields param on “graphql_get_setting_section_field_value” filter not passing the correct type
  • \n
  • #3137: fix: WPGraphQL Settings page fails to load when “graphiql_enabled” setting is “off”
  • \n
  • #3133: build: clean up dist
  • \n
  • #3146: test: add e2e test coverage for tabs in the settings page
  • \n
\n

1.26.0

\n

New Features

\n
    \n
  • #3125: refactor: improve query handling in AbstractConnectionResolver\n
      \n
    • new: graphql_connection_pre_get_query filter
    • \n
    • new: AbstractConnectionResolver::is_valid_query_class()
    • \n
    • new: AbstractConnectionResolver::get_query()
    • \n
    • new: AbstractConnectionResolver::get_query_class()
    • \n
    • new: AsbtractConnectionResolver::query_class()
    • \n
    • new: AbstractConnectionResolver::$query_class
    • \n
    \n
  • \n
  • #3124: refactor: split AbstractConnectionResolver::get_args() and ::get_query_args() into ::prepare_*() methods
  • \n
  • #3123: refactor: split AbstractConnectionResolver::get_ids() into ::prepare_ids()
  • \n
  • #3121: refactor: split AbstractConnectionResolver::get_nodes() and get_edges() into prepare_*() methods
  • \n
  • #3120: refactor: wrap AbstractConnectionResolver::is_valid_model() in ::get_is_valid_model()
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3125: refactor: improve query handling in AbstractConnectionResolver\n
      \n
    • Implement PHPStan Generic Type
    • \n
    • Update generic Exceptions to InvariantViolation
    • \n
    \n
  • \n
  • #3127: chore: update references to the WPGraphQL Slack Community to point to the new WPGraphQL Discord community instead.
  • \n
  • #3122: chore: relocate AbstractConnectionResolver::is_valid_offset() with other abstract methods.
  • \n
\n

1.25.0

\n

New Features

\n
    \n
  • #3104: feat: add AbsractConnectionResolver::pre_should_execute(). Thanks @justlevine!
  • \n
\n

Chores / Bugfixes
\n– #3104: refactor: AbstractConnectionResolver::should_execute() Thanks @justlevine!
\n– #3112: fix: fixes a regression from v1.24.0 relating to field arguments defined on Interfaces not being properly merged onto Object Types that implement the interface. Thanks @kidunot89!
\n– #3114: fix: node IDs not showing in the Query Analyzer / X-GraphQL-Keys when using DataLoader->load_many()
\n– #3116: chore: Update WPGraphQLTestCase to v3. Thanks @kidunot89!

\n

1.24.0

\n

New Features

\n
    \n
  • #3084: perf: refactor PluginConnectionResolver to only fetch plugins once. Thanks @justlevine!
  • \n
  • #3088: refactor: improve loader handling in AbstractConnectionResolver. Thanks @justlevine!
  • \n
  • #3087: feat: improve query amount handling in AbstractConnectionResolver. Thanks @justlevine!
  • \n
  • #3086: refactor: add AbstractConnectionResolver::get_unfiltered_args() public getter. Thanks @justlevine!
  • \n
  • #3085: refactor: add AbstractConnectionResolver::prepare_page_info()and only instantiate once. Thanks @justlevine!
  • \n
  • #3083: refactor: deprecate camelCase methods in AbstractConnectionResolver for snake_case equivalents. Thanks @justlevine!
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3095: chore: lint for superfluous whitespace. Thanks @justlevine!
  • \n
  • #3100: fix: recursion issues with interfaces
  • \n
  • #3082: chore: prepare ConnectionResolver classes for v2 backport
  • \n
\n

1.23.0

\n

New Features

\n
    \n
  • #3073: feat: expose hasPassword and password fields on Post objects. Thanks @justlevine!
  • \n
  • #3091: feat: introduce actions and filters for GraphQL Admin Notices
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3079: fix: GraphiQL IDE test failures
  • \n
  • #3084: perf: refactor PluginConnectionResolver to only fetch plugins once. Thanks @justlevine!
  • \n
  • #3092: ci: test against wp 6.5
  • \n
  • #3093: ci: Update actions in GitHub workflows and cleanup. Thanks @justlevine!
  • \n
  • #3093: chore: update Composer dev-deps and lint. Thanks @justlevine!
  • \n
\n

1.22.1

\n

Chores / Bugfixes

\n
    \n
  • #3067: fix: respect show avatar setting
  • \n
  • #3063: fix: fixes a bug in cursor stability filters that could lead to empty order
  • \n
  • #3070: test(3063): Adds test for #3063
  • \n
\n

1.22.0

\n

New Features

\n
    \n
  • #3044: feat: add graphql_pre_resolve_menu_item_connected_node filter
  • \n
  • #3039: feat: add UniformResourceIdentifiable interface to Comment type
  • \n
  • #3020: feat: introduce graphql_query_analyzer_get_headers filter
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3062: ci: pin wp-browser to “<3.5” to allow automated tests to run properly
  • \n
  • #3057: fix: admin_enqueue_scripts callback should expect a possible null value passed to it
  • \n
  • #3048: fix: isPostsPage on content type
  • \n
  • #3043: fix: return empty when filtering menuItems by a location with no assigned items
  • \n
  • #3045: fix: UsersConnectionSearchColumnEnum values should be prefixed with user_
  • \n
\n

1.21.0

\n

\n

New Features

\n
    \n
  • #3035: feat: provide better error when field references a type that does not exist
  • \n
  • #3027: feat: Add register_graphql_admin_notice API and intial use to inform users of the new WPGraphQL for ACF plugin
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3038: chore(deps-dev): bump the composer group across 1 directories with 1 update. Thanks @dependabot!
  • \n
  • #3033: fix: php deprecation error for dynamic properties on AppContext class
  • \n
  • #3031: fix(graphiql): Allow GraphiQL to run even if a valid schema cannot be returned. Thanks @linucks!
  • \n
\n

1.20.0

\n

New Features

\n
    \n
  • #3013: feat: output GRAPHQL_DEBUG message if requested amount is larger than connection limit. Thanks @justlevine!
  • \n
  • #3008: perf: Expose graphql_should_analyze_queries as setting. Thanks @justlevine!
  • \n
\n

Chores / Bugfixes

\n
    \n
  • #3022: chore: add @justlevine to list of contributors! 🙌 🥳
  • \n
  • #3011: chore: update composer dev-dependencies and use php-compatibility:develop branch to 8.0+ lints. Thanks @justlevine!
  • \n
  • #3010: chore: implement stricter PHPDoc types. Thanks @justlevine!
  • \n
  • #3009: chore: implement stricter PHPStan config and clean up unnecessary type-guards. Thanks @justlevine!
  • \n
  • #3007: fix: call html_entity_decode() with explicit flags and decode single-quotes. Thanks @justlevine!
  • \n
  • #3006: fix: replace deprecated AbstractConnectionResolver::setQueryArg() call with ::set_query_arg(). Thanks @justlevine!
  • \n
  • #3004: docs: Update using-data-from-custom-database-tables.md
  • \n
  • #2998: docs: Update build-your-first-wpgraphql-extension.md. Thanks @Jacob-Daniel!
  • \n
  • #2997: docs: update wpgraphql-concepts.md. Thanks @Jacob-Daniel!
  • \n
  • #2996: fix: Field id duplicates uri field description. Thanks @marcinkrzeminski!
  • \n
\n

View Full Changelog: https://github.com/wp-graphql/wp-graphql/blob/develop/CHANGELOG.md

\n\";s:11:\"screenshots\";s:347:\"
  1. \"\"
  2. \"\"
\";s:7:\"reviews\";s:16212:\"
\n
\n
\n
\n

Speedy

\n
\n
\n
\n

\n By \'\'con (conschneider) on March 26, 2025

\n
\n
\n
GraphQL vs. REST API\n 10 : 0\n\nThank you for this plugin. Building my headless application with WPGraphQL is fun. \nThe repl interface to test queries is A+.
\n
\n
\n
\n
\n
\n

Performance performance performance

\n
\n
\n
\n

\n By \'\'psychosispicks on September 7, 2023

\n
\n
\n
\n

I\'m so glad I decided to transition to a headless WP, and WPGraphQL made this possible, convenient and super fast.

\n
\n
\n
\n
\n
\n
\n

Unreliable

\n
\n
\n
\n

\n By \'\'benknight on May 29, 2023

\n
\n
\n
\n

I operate a large blog that uses WordPress as a headless CMS with a Next.JS frontend, which is largely enabled by this plugin. Let me just say first that creating an entire alternative third-party data API is an ambitious undertaking and I appreciate all the work the authors have put into it.

\n\n\n\n

But as a developer I have to throw out a word of caution that this plugin often has major bugs that can have critical impact on your production website. For example after a recent minor update we discovered a bug where any URL with a special character in it started returning a 404, causing several of our pages to suddenly become unavailable to users and delisted from Google, and this went on for many months before we realized it.

\n\n\n\n

There have been many similar instances. My general approach is to lean more on WordPress\'s REST API over time which is more reliable since it\'s maintained by the WordPress team, and only use WPGraphQL when it\'s necessary.

\n\n\n\n

Also recommend turning off auto-updates and test your website extremely thoroughly after any upgrade.

\n
\n
\n
\n
\n
\n
\n

Great! 10 stars if possible

\n
\n
\n
\n

\n By \'\'chisnghiax on September 7, 2022

\n
\n
\n
Great!
\n
\n
\n
\n
\n
\n

Great Plugin!

\n
\n
\n
\n

\n By \'\'2cubed on August 26, 2022

\n
\n
\n
One of the best plugins for WordPress. It\'s right up there with ACF!
\n
\n
\n
\n
\n
\n

Awesome, everybody should use it

\n
\n
\n
\n

\n By \'\'mauretto1978 on May 31, 2022

\n
\n
\n
Great plugin,\n\neveryone should use it. \n\nThe IDE is a valuable plus, and it can be used to learn GraphQL from scratch.\n\nFrom the developer\'s point of view, the plugin is super easy to extend, thanks to the great documentation.\n\nDon\'t forget to check the official YouTube channel.\n\nIf you need extra support for custom post types and metas, I just released v1.0.70 of my plugin ACPT with full support to WPGraphQL.\n\nThank you so much John!
\n
\n
\n
\n
\n
\n

Excellent tool and support

\n
\n
\n
\n

\n By \'\'Camilo (runonce) on April 25, 2022

\n
\n
\n
Great tool for getting data from your WP into your SPA.\n\nI had some trouble with a conflicting plugin (Post Types Order) that caused unexpted results when paginating my posts but the support provided by both Jason Bahl and David Levine was absolutely top notch and I managed to resolve the issue within hours.
\n
\n
\n
\n
\n
\n

Definitely Recommend

\n
\n
\n
\n

\n By \'\'turboloop on March 23, 2022

\n
\n
\n
Over a year ago I switched from using REST to this plugin. I mainly build Angular Apps using Apollo client. Works perfectly fine and increases development speed.
\n
\n
\n
\n
\n
\n

The Future

\n
\n
\n
\n

\n By \'\'scottyzen on December 3, 2021

\n
\n
\n
This plugin is a game-changer. Once you start using it you really get a feel of how powerful it is. Why anyone would choose REST API now sounds crazy to me.
\n
\n
\n
\n
\n
\n

Works great for Headless WordPress site with Gatsby

\n
\n
\n
\n

\n By \'\'Chris (ctack) on September 10, 2021

\n
\n
\n
Loving the ease of implementation for a headless WordPress site with a GatsbyJS front end
\n
\n\";}s:17:\"short_description\";s:136:\"WPGraphQL adds a flexible and powerful GraphQL API to WordPress, enabling efficient querying and interaction with your site's data.\";s:13:\"download_link\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.2.3.0.zip\";s:14:\"upgrade_notice\";a:17:{s:5:\"2.0.0\";s:418:\"

BREAKING CHANGE UPDATE

\n\n

This is a major update that drops support for PHP versions below 7.4 and WordPress versions below 6.0.

\n\n

We've written more about the update here:

\n\n
    \n
  • https://www.wpgraphql.com/2024/12/16/wpgraphql-v2-0-is-coming-heres-what-you-need-to-know
  • \n
  • https://www.wpgraphql.com/2024/12/16/wpgraphql-v2-0-technical-update-breaking-changes
  • \n
\";s:6:\"1.32.0\";s:399:\"

In #3293 a bug was fixed in how the MediaDetails.file field resolves. The previous behavior was a bug, but might have been used as a feature. If you need the field to behave the same as it did prior to this bugfix, you can follow the instructions here to override the field's resolver to how it worked before.

\";s:6:\"1.30.0\";s:546:\"

This release includes a new feature to implement a SemVer-compliant update checker, which will prevent auto-updates for major releases that include breaking changes.

\n\n

It also exposes the EnqueuedAsset.group and EnqueuedScript.location fields to the schema. Additionally, it adds a WPGraphQL Extensions page to the WordPress admin.

\n\n

There are no known breaking changes in this release, however, we recommend testing on staging servers to ensure the changes don't negatively impact your projects.

\";s:6:\"1.28.0\";s:395:\"

This release contains an internal refactor for how the Type Registry is generated which should lead to significant performance improvements for most users.

\n\n

While there are no intentional breaking changes, because this change impacts every user we highly recommend testing this release thoroughly on staging servers to ensure the changes don't negatively impact your projects.

\";s:6:\"1.26.0\";s:439:\"

This release refactors some code in the AbstractConnectionResolver with an aim at making it more efficient and easier to extend. While we believe there are no breaking changes and have tested against popular extensions such as WPGraphQL Headless Login, WPGraphQL Gravity Forms, WPGraphQL Rank Math and others, we recommend running your own tests on a staging site to confirm that there are no regresssions caused by the refactoring.

\";s:6:\"1.25.0\";s:205:\"

This release includes a fix to a regression in the v1.24.0. Users impacted by the regression in 1.24.0 included, but are not necessarily limited to, users of the WPGraphQL for WooCommerce extension.

\";s:6:\"1.24.0\";s:750:\"

The AbstractConnectionResolver has undergone some refactoring. Some methods using snakeCase have been deprecated in favor of their camel_case equivalent. While we've preserved the deprecated methods to prevent breaking changes, you might begin seeing PHP notices about the deprecations. Any plugin that extends the AbstractConnectionResolver should update the following methods:

\n\n
    \n
  • getSource -> get_source
  • \n
  • getContext -> get_context
  • \n
  • getInfo -> get_info
  • \n
  • getShouldExecute -> get_should_execute
  • \n
  • getLoader -> getLoader
  • \n
\";s:6:\"1.16.0\";s:619:\"

WPGraphQL Smart Cache\nFor WPGraphQL Smart Cache users, you should update WPGraphQL Smart Cache to v1.2.0 when updating\nWPGraphQL to v1.16.0 to ensure caches continue to purge as expected.

\n\n

Cursor Pagination Updates\nThis version fixes some behaviors of Cursor Pagination which may lead to behavior changes in your application.

\n\n

As with any release, we recommend you test in staging environments. For this release, specifically any\nqueries you have using pagination arguments (first, last, after, before).

\";s:6:\"1.14.6\";s:328:\"

This release includes a security patch. It's recommended to update as soon as possible.

\n\n

If you're unable to update to the latest version, we have a snippet you can add to your site.

\n\n

You can read more about it here: https://github.com/wp-graphql/wp-graphql/security/advisories/GHSA-cfh4-7wq9-6pgg

\";s:6:\"1.13.0\";s:1273:\"

The ContentRevisionUnion Union has been removed, and the RootQuery.revisions and User.revisions connections that used to resolve to this Type now resolve to the ContentNode Interface type.

\n\n

This is technically a Schema Breaking change, however the behavior for most users querying these fields should remain the same.

\n\n

For example, this query worked before, and still works now:

\n\n
`graphql\n
\n\n

{\n viewer {\n revisions {\n nodes {\n __typename\n ... on Post {\n id\n uri\n isRevision\n }\n ... on Page {\n id\n uri\n isRevision\n }\n }\n }\n }\n revisions {\n nodes {\n __typename\n ... on Post {\n id\n uri\n isRevision\n }\n ... on Page {\n id\n uri\n isRevision\n }\n }\n }\n}\n `

\n\n

If you were using a fragment to reference: ...on UserToContentRevisionUnionConnection or ...on RootQueryToContentRevisionUnionConnection you would need to update those references to ...on UserToRevisionsConnection and ...on RootQueryToRevisionsConnection respectively.

\";s:6:\"1.12.0\";s:860:\"

This release removes the ContentNode and DatabaseIdentifier interfaces from the NodeWithFeaturedImage Interface.

\n\n

This is considered a breaking change for client applications using a ...on NodeWithFeaturedImage fragment that reference fields applied by those interfaces. If you have client applications doing this (or are unsure if you do) you can use the following filter to bring back the previous behavior:

\n\n
`php\n
\n\n

add_filter( 'graphql_wp_interface_type_config', function( $config ) {\n if ( $config['name'] === 'NodeWithFeaturedImage' ) {\n $config['interfaces'][] = 'ContentNode';\n $config['interfaces'][] = 'DatabaseIdentifier';\n }\n return $config;\n}, 10, 1 );\n `

\";s:6:\"1.10.0\";s:556:\"

PR (#2490) fixes a bug that some users were\nusing as a feature.

\n\n

When a page is marked as the "Posts Page" WordPress does not resolve that page by URI, and this\nbugfix no longer will resolve that page by URI.

\n\n

You can read more\nabout why this change was made and find a snippet of code that will bring the old functionality back\nif you've built features around it.

\";s:5:\"1.9.0\";s:1273:\"

There are 2 changes that might require action when updating to 1.9.0.

\n\n
    \n
  1. (#2464)
  2. \n
\n\n

When querying for a nodeByUri, if your site has the "page_for_posts" setting configured, the behavior of the nodeByUri query for that uri might be different for you.

\n\n

Previously a bug caused this query to return a "Page" type, when it should have returned a "ContentType" Type.

\n\n

The bug fix might change your application if you were using the bug as a feature.

\n\n
    \n
  1. (#2457)
  2. \n
\n\n

There were a lot of bug fixes related to connections to ensure they behave as intended. If you were querying lists of data, in some cases the data might be returned in a different order than it was before.

\n\n

For example, using the "last" input on a Comment or User query should still return the same nodes, but in a different order than before.

\n\n

This might cause behavior you don't want in your application because you had coded around the bug. This change was needed to support proper backward pagination.

\";s:5:\"1.6.7\";s:2028:\"

There's been a bugfix in the Post Model layer which might break existing behaviors.

\n\n

WordPress Post Type registry allows for a post_type to be registered as public (true or false)\nand publicly_queryable (true or false).

\n\n

WPGraphQL's Model Layer was allowing published content of any post_type to be exposed publicly. This\nchange better respects the public and publicly_queryable properties of post types better.

\n\n

Now, if a post_type is public=&gt;true, published content of that post_type can be queried by public\nWPGraphQL requests.

\n\n

If a post_type is set to public=&gt;false, then we fallback to the publicly_queryable property.\nIf a post_type is set to publicly_queryable =&gt; true, then published content of the Post Type can\nbe queried in WPGraphQL by public users.

\n\n

If both public=&gt;false and publicly_queryable is false or not defined, then the content of the\npost_type will only be accessible via authenticated queries by users with proper capabilities to\naccess the post_type.

\n\n

Possible Action: You might need to adjust your post_type registration to better reflect your intent.

\n\n
    \n
  • public=&gt;true: The entries in the post_type will be public in WPGraphQL and will have a public\nURI in WordPress.
  • \n
  • public=&gt;false, publicly_queryable=&gt;true: The entries in the post_type will be public in WPGraphQL,\nbut will not have individually respected URI from WordPress, and can not be queried by URI in WPGraphQL.
  • \n
  • public=&gt;false,publicly_queryable=&gt;false: The entries in the post_type will only be accessible in\nWPGraphQL by authenticated requests for users with proper capabilities to interact with the post_type.
  • \n
\";s:5:\"1.5.0\";s:157:\"

The MenuItem.path field was changed from non-null to nullable and some clients may need to make adjustments to support this.

\";s:5:\"1.4.0\";s:211:\"

The uri field was non-null on some Types in the Schema but has been changed to be nullable on all types that have it. This might require clients to update code to expect possible null values.

\";s:5:\"1.2.0\";s:179:\"

Composer dependencies are no longer versioned in Github. Recommended install source is WordPress.org or using Composer to get the code from Packagist.org or WPackagist.org.

\";}s:11:\"screenshots\";a:2:{i:1;a:2:{s:3:\"src\";s:63:\"https://ps.w.org/wp-graphql/assets/screenshot-1.jpg?rev=2482884\";s:7:\"caption\";s:0:\"\";}i:2;a:2:{s:3:\"src\";s:63:\"https://ps.w.org/wp-graphql/assets/screenshot-2.jpg?rev=2482884\";s:7:\"caption\";s:0:\"\";}}s:4:\"tags\";a:5:{s:9:\"decoupled\";s:9:\"decoupled\";s:7:\"graphql\";s:7:\"GraphQL\";s:8:\"headless\";s:8:\"headless\";s:5:\"react\";s:5:\"react\";s:8:\"rest-api\";s:8:\"rest-api\";}s:8:\"versions\";a:142:{s:8:\"0.1.14.1\";s:62:\"https://downloads.wordpress.org/plugin/wp-graphql.0.1.14.1.zip\";s:6:\"0.15.4\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.0.15.4.zip\";s:6:\"0.15.5\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.0.15.5.zip\";s:6:\"0.15.6\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.0.15.6.zip\";s:3:\"1.0\";s:57:\"https://downloads.wordpress.org/plugin/wp-graphql.1.0.zip\";s:5:\"1.0.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.0.1.zip\";s:5:\"1.0.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.0.2.zip\";s:5:\"1.0.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.0.3.zip\";s:5:\"1.0.4\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.0.4.zip\";s:5:\"1.0.5\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.0.5.zip\";s:5:\"1.1.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.0.zip\";s:5:\"1.1.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.1.zip\";s:5:\"1.1.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.2.zip\";s:5:\"1.1.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.3.zip\";s:5:\"1.1.4\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.4.zip\";s:5:\"1.1.5\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.5.zip\";s:5:\"1.1.6\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.6.zip\";s:5:\"1.1.7\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.7.zip\";s:5:\"1.1.8\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.8.zip\";s:7:\"1.1.8.0\";s:61:\"https://downloads.wordpress.org/plugin/wp-graphql.1.1.8.0.zip\";s:6:\"1.10.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.10.0.zip\";s:6:\"1.11.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.11.0.zip\";s:6:\"1.11.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.11.1.zip\";s:6:\"1.11.2\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.11.2.zip\";s:6:\"1.11.3\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.11.3.zip\";s:6:\"1.12.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.12.0.zip\";s:6:\"1.12.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.12.1.zip\";s:6:\"1.12.2\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.12.2.zip\";s:6:\"1.12.3\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.12.3.zip\";s:6:\"1.13.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.0.zip\";s:6:\"1.13.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.1.zip\";s:7:\"1.13.10\";s:61:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.10.zip\";s:6:\"1.13.2\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.2.zip\";s:6:\"1.13.4\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.4.zip\";s:6:\"1.13.5\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.5.zip\";s:6:\"1.13.6\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.6.zip\";s:6:\"1.13.7\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.7.zip\";s:6:\"1.13.8\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.8.zip\";s:6:\"1.13.9\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.13.9.zip\";s:6:\"1.14.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.0.zip\";s:7:\"1.14.10\";s:61:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.10.zip\";s:6:\"1.14.2\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.2.zip\";s:6:\"1.14.3\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.3.zip\";s:6:\"1.14.4\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.4.zip\";s:6:\"1.14.5\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.5.zip\";s:6:\"1.14.6\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.6.zip\";s:6:\"1.14.7\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.7.zip\";s:6:\"1.14.8\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.8.zip\";s:6:\"1.14.9\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.14.9.zip\";s:6:\"1.15.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.15.0.zip\";s:6:\"1.16.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.16.0.zip\";s:6:\"1.17.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.17.0.zip\";s:6:\"1.18.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.18.1.zip\";s:6:\"1.18.2\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.18.2.zip\";s:6:\"1.19.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.19.0.zip\";s:5:\"1.2.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.2.0.zip\";s:5:\"1.2.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.2.1.zip\";s:5:\"1.2.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.2.2.zip\";s:5:\"1.2.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.2.3.zip\";s:5:\"1.2.4\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.2.4.zip\";s:5:\"1.2.5\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.2.5.zip\";s:5:\"1.2.6\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.2.6.zip\";s:6:\"1.20.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.20.0.zip\";s:6:\"1.21.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.21.0.zip\";s:6:\"1.22.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.22.0.zip\";s:6:\"1.22.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.22.1.zip\";s:6:\"1.23.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.23.0.zip\";s:6:\"1.24.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.24.0.zip\";s:6:\"1.25.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.25.0.zip\";s:6:\"1.26.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.26.0.zip\";s:6:\"1.27.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.27.0.zip\";s:6:\"1.27.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.27.1.zip\";s:6:\"1.27.2\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.27.2.zip\";s:6:\"1.28.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.28.0.zip\";s:6:\"1.28.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.28.1.zip\";s:6:\"1.29.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.29.0.zip\";s:6:\"1.29.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.29.1.zip\";s:6:\"1.29.2\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.29.2.zip\";s:6:\"1.29.3\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.29.3.zip\";s:5:\"1.3.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.0.zip\";s:5:\"1.3.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.1.zip\";s:6:\"1.3.10\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.10.zip\";s:5:\"1.3.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.2.zip\";s:5:\"1.3.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.3.zip\";s:5:\"1.3.4\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.4.zip\";s:5:\"1.3.5\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.5.zip\";s:5:\"1.3.6\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.6.zip\";s:5:\"1.3.7\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.7.zip\";s:5:\"1.3.8\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.8.zip\";s:5:\"1.3.9\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.3.9.zip\";s:6:\"1.30.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.30.0.zip\";s:6:\"1.31.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.31.0.zip\";s:6:\"1.31.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.31.1.zip\";s:6:\"1.32.0\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.32.0.zip\";s:6:\"1.32.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.32.1.zip\";s:5:\"1.4.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.4.0.zip\";s:5:\"1.4.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.4.1.zip\";s:5:\"1.4.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.4.2.zip\";s:5:\"1.4.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.4.3.zip\";s:5:\"1.5.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.0.zip\";s:5:\"1.5.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.1.zip\";s:5:\"1.5.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.2.zip\";s:5:\"1.5.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.3.zip\";s:5:\"1.5.4\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.4.zip\";s:5:\"1.5.5\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.5.zip\";s:5:\"1.5.6\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.6.zip\";s:5:\"1.5.7\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.7.zip\";s:5:\"1.5.8\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.8.zip\";s:5:\"1.5.9\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.5.9.zip\";s:5:\"1.6.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.0.zip\";s:5:\"1.6.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.1.zip\";s:6:\"1.6.10\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.10.zip\";s:6:\"1.6.11\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.11.zip\";s:6:\"1.6.12\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.12.zip\";s:5:\"1.6.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.2.zip\";s:5:\"1.6.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.3.zip\";s:5:\"1.6.4\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.4.zip\";s:5:\"1.6.5\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.5.zip\";s:5:\"1.6.6\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.6.zip\";s:5:\"1.6.7\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.7.zip\";s:5:\"1.6.8\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.8.zip\";s:5:\"1.6.9\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.6.9.zip\";s:5:\"1.7.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.7.0.zip\";s:5:\"1.7.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.7.1.zip\";s:5:\"1.7.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.7.2.zip\";s:5:\"1.8.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.0.zip\";s:5:\"1.8.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.1.zip\";s:5:\"1.8.2\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.2.zip\";s:5:\"1.8.3\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.3.zip\";s:5:\"1.8.4\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.4.zip\";s:5:\"1.8.5\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.5.zip\";s:5:\"1.8.6\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.6.zip\";s:5:\"1.8.7\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.8.7.zip\";s:5:\"1.9.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.9.0.zip\";s:5:\"1.9.1\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.1.9.1.zip\";s:5:\"2.0.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.2.0.0.zip\";s:12:\"2.0.0-beta.2\";s:66:\"https://downloads.wordpress.org/plugin/wp-graphql.2.0.0-beta.2.zip\";s:5:\"2.1.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.2.1.0.zip\";s:5:\"2.2.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.2.2.0.zip\";s:5:\"2.3.0\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.2.3.0.zip\";s:5:\"trunk\";s:53:\"https://downloads.wordpress.org/plugin/wp-graphql.zip\";s:6:\"v2.1.1\";s:60:\"https://downloads.wordpress.org/plugin/wp-graphql.v2.1.1.zip\";}s:14:\"business_model\";s:9:\"community\";s:14:\"repository_url\";s:40:\"https://github.com/wp-graphql/wp-graphql\";s:22:\"commercial_support_url\";s:0:\"\";s:11:\"donate_link\";s:0:\"\";s:7:\"banners\";a:2:{s:3:\"low\";s:65:\"https://ps.w.org/wp-graphql/assets/banner-772x250.png?rev=3111985\";s:4:\"high\";s:66:\"https://ps.w.org/wp-graphql/assets/banner-1544x500.png?rev=3111985\";}s:5:\"icons\";a:2:{s:2:\"1x\";s:63:\"https://ps.w.org/wp-graphql/assets/icon-128x128.png?rev=3111985\";s:2:\"2x\";s:63:\"https://ps.w.org/wp-graphql/assets/icon-256x256.png?rev=3111985\";}s:12:\"preview_link\";s:51:\"https://wordpress.org/plugins/wp-graphql/?preview=1\";s:4:\"Name\";s:9:\"WPGraphQL\";}}','off'),(151,'recently_activated','a:0:{}','off'),(152,'_site_transient_timeout_poptags_40cd750bba9870f18aada2478b24840a','1743169314','off'),(153,'_site_transient_poptags_40cd750bba9870f18aada2478b24840a','O:8:\"stdClass\":100:{s:11:\"woocommerce\";a:3:{s:4:\"name\";s:11:\"woocommerce\";s:4:\"slug\";s:11:\"woocommerce\";s:5:\"count\";i:6924;}s:6:\"widget\";a:3:{s:4:\"name\";s:6:\"widget\";s:4:\"slug\";s:6:\"widget\";s:5:\"count\";i:4878;}s:4:\"post\";a:3:{s:4:\"name\";s:4:\"post\";s:4:\"slug\";s:4:\"post\";s:5:\"count\";i:2797;}s:5:\"admin\";a:3:{s:4:\"name\";s:5:\"admin\";s:4:\"slug\";s:5:\"admin\";s:5:\"count\";i:2696;}s:5:\"posts\";a:3:{s:4:\"name\";s:5:\"posts\";s:4:\"slug\";s:5:\"posts\";s:5:\"count\";i:2108;}s:9:\"shortcode\";a:3:{s:4:\"name\";s:9:\"shortcode\";s:4:\"slug\";s:9:\"shortcode\";s:5:\"count\";i:2020;}s:8:\"comments\";a:3:{s:4:\"name\";s:8:\"comments\";s:4:\"slug\";s:8:\"comments\";s:5:\"count\";i:1946;}s:3:\"seo\";a:3:{s:4:\"name\";s:3:\"seo\";s:4:\"slug\";s:3:\"seo\";s:5:\"count\";i:1853;}s:6:\"images\";a:3:{s:4:\"name\";s:6:\"images\";s:4:\"slug\";s:6:\"images\";s:5:\"count\";i:1599;}s:5:\"image\";a:3:{s:4:\"name\";s:5:\"image\";s:4:\"slug\";s:5:\"image\";s:5:\"count\";i:1597;}s:9:\"ecommerce\";a:3:{s:4:\"name\";s:9:\"ecommerce\";s:4:\"slug\";s:9:\"ecommerce\";s:5:\"count\";i:1589;}s:6:\"google\";a:3:{s:4:\"name\";s:6:\"google\";s:4:\"slug\";s:6:\"google\";s:5:\"count\";i:1549;}s:7:\"twitter\";a:3:{s:4:\"name\";s:7:\"twitter\";s:4:\"slug\";s:7:\"twitter\";s:5:\"count\";i:1512;}s:8:\"facebook\";a:3:{s:4:\"name\";s:8:\"facebook\";s:4:\"slug\";s:8:\"facebook\";s:5:\"count\";i:1507;}s:5:\"email\";a:3:{s:4:\"name\";s:5:\"email\";s:4:\"slug\";s:5:\"email\";s:5:\"count\";i:1459;}s:7:\"gallery\";a:3:{s:4:\"name\";s:7:\"gallery\";s:4:\"slug\";s:7:\"gallery\";s:5:\"count\";i:1325;}s:7:\"sidebar\";a:3:{s:4:\"name\";s:7:\"sidebar\";s:4:\"slug\";s:7:\"sidebar\";s:5:\"count\";i:1317;}s:5:\"login\";a:3:{s:4:\"name\";s:5:\"login\";s:4:\"slug\";s:5:\"login\";s:5:\"count\";i:1207;}s:8:\"security\";a:3:{s:4:\"name\";s:8:\"security\";s:4:\"slug\";s:8:\"security\";s:5:\"count\";i:1203;}s:6:\"social\";a:3:{s:4:\"name\";s:6:\"social\";s:4:\"slug\";s:6:\"social\";s:5:\"count\";i:1174;}s:4:\"page\";a:3:{s:4:\"name\";s:4:\"page\";s:4:\"slug\";s:4:\"page\";s:5:\"count\";i:1158;}s:10:\"e-commerce\";a:3:{s:4:\"name\";s:10:\"e-commerce\";s:4:\"slug\";s:10:\"e-commerce\";s:5:\"count\";i:1038;}s:5:\"video\";a:3:{s:4:\"name\";s:5:\"video\";s:4:\"slug\";s:5:\"video\";s:5:\"count\";i:1035;}s:7:\"payment\";a:3:{s:4:\"name\";s:7:\"payment\";s:4:\"slug\";s:7:\"payment\";s:5:\"count\";i:1016;}s:7:\"widgets\";a:3:{s:4:\"name\";s:7:\"widgets\";s:4:\"slug\";s:7:\"widgets\";s:5:\"count\";i:999;}s:5:\"block\";a:3:{s:4:\"name\";s:5:\"block\";s:4:\"slug\";s:5:\"block\";s:5:\"count\";i:990;}s:9:\"analytics\";a:3:{s:4:\"name\";s:9:\"analytics\";s:4:\"slug\";s:9:\"analytics\";s:5:\"count\";i:978;}s:9:\"gutenberg\";a:3:{s:4:\"name\";s:9:\"gutenberg\";s:4:\"slug\";s:9:\"gutenberg\";s:5:\"count\";i:951;}s:5:\"links\";a:3:{s:4:\"name\";s:5:\"links\";s:4:\"slug\";s:5:\"links\";s:5:\"count\";i:917;}s:6:\"slider\";a:3:{s:4:\"name\";s:6:\"slider\";s:4:\"slug\";s:6:\"slider\";s:5:\"count\";i:915;}s:7:\"content\";a:3:{s:4:\"name\";s:7:\"content\";s:4:\"slug\";s:7:\"content\";s:5:\"count\";i:913;}s:4:\"spam\";a:3:{s:4:\"name\";s:4:\"spam\";s:4:\"slug\";s:4:\"spam\";s:5:\"count\";i:906;}s:4:\"form\";a:3:{s:4:\"name\";s:4:\"form\";s:4:\"slug\";s:4:\"form\";s:5:\"count\";i:895;}s:15:\"payment-gateway\";a:3:{s:4:\"name\";s:15:\"payment gateway\";s:4:\"slug\";s:15:\"payment-gateway\";s:5:\"count\";i:886;}s:9:\"elementor\";a:3:{s:4:\"name\";s:9:\"elementor\";s:4:\"slug\";s:9:\"elementor\";s:5:\"count\";i:876;}s:5:\"media\";a:3:{s:4:\"name\";s:5:\"media\";s:4:\"slug\";s:5:\"media\";s:5:\"count\";i:829;}s:6:\"search\";a:3:{s:4:\"name\";s:6:\"search\";s:4:\"slug\";s:6:\"search\";s:5:\"count\";i:822;}s:6:\"editor\";a:3:{s:4:\"name\";s:6:\"editor\";s:4:\"slug\";s:6:\"editor\";s:5:\"count\";i:797;}s:10:\"buddypress\";a:3:{s:4:\"name\";s:10:\"buddypress\";s:4:\"slug\";s:10:\"buddypress\";s:5:\"count\";i:782;}s:4:\"menu\";a:3:{s:4:\"name\";s:4:\"menu\";s:4:\"slug\";s:4:\"menu\";s:5:\"count\";i:762;}s:12:\"contact-form\";a:3:{s:4:\"name\";s:12:\"contact form\";s:4:\"slug\";s:12:\"contact-form\";s:5:\"count\";i:760;}s:3:\"rss\";a:3:{s:4:\"name\";s:3:\"rss\";s:4:\"slug\";s:3:\"rss\";s:5:\"count\";i:756;}s:5:\"pages\";a:3:{s:4:\"name\";s:5:\"pages\";s:4:\"slug\";s:5:\"pages\";s:5:\"count\";i:745;}s:5:\"embed\";a:3:{s:4:\"name\";s:5:\"embed\";s:4:\"slug\";s:5:\"embed\";s:5:\"count\";i:730;}s:4:\"feed\";a:3:{s:4:\"name\";s:4:\"feed\";s:4:\"slug\";s:4:\"feed\";s:5:\"count\";i:708;}s:8:\"category\";a:3:{s:4:\"name\";s:8:\"category\";s:4:\"slug\";s:8:\"category\";s:5:\"count\";i:705;}s:4:\"ajax\";a:3:{s:4:\"name\";s:4:\"ajax\";s:4:\"slug\";s:4:\"ajax\";s:5:\"count\";i:674;}s:7:\"youtube\";a:3:{s:4:\"name\";s:7:\"youtube\";s:4:\"slug\";s:7:\"youtube\";s:5:\"count\";i:665;}s:6:\"jquery\";a:3:{s:4:\"name\";s:6:\"jquery\";s:4:\"slug\";s:6:\"jquery\";s:5:\"count\";i:664;}s:3:\"api\";a:3:{s:4:\"name\";s:3:\"api\";s:4:\"slug\";s:3:\"api\";s:5:\"count\";i:650;}s:9:\"affiliate\";a:3:{s:4:\"name\";s:9:\"affiliate\";s:4:\"slug\";s:9:\"affiliate\";s:5:\"count\";i:645;}s:3:\"css\";a:3:{s:4:\"name\";s:3:\"css\";s:4:\"slug\";s:3:\"css\";s:5:\"count\";i:632;}s:8:\"shipping\";a:3:{s:4:\"name\";s:8:\"shipping\";s:4:\"slug\";s:8:\"shipping\";s:5:\"count\";i:626;}s:9:\"marketing\";a:3:{s:4:\"name\";s:9:\"marketing\";s:4:\"slug\";s:9:\"marketing\";s:5:\"count\";i:622;}s:4:\"chat\";a:3:{s:4:\"name\";s:4:\"chat\";s:4:\"slug\";s:4:\"chat\";s:5:\"count\";i:618;}s:4:\"link\";a:3:{s:4:\"name\";s:4:\"link\";s:4:\"slug\";s:4:\"link\";s:5:\"count\";i:616;}s:10:\"javascript\";a:3:{s:4:\"name\";s:10:\"javascript\";s:4:\"slug\";s:10:\"javascript\";s:5:\"count\";i:614;}s:9:\"dashboard\";a:3:{s:4:\"name\";s:9:\"dashboard\";s:4:\"slug\";s:9:\"dashboard\";s:5:\"count\";i:613;}s:10:\"responsive\";a:3:{s:4:\"name\";s:10:\"responsive\";s:4:\"slug\";s:10:\"responsive\";s:5:\"count\";i:609;}s:5:\"share\";a:3:{s:4:\"name\";s:5:\"share\";s:4:\"slug\";s:5:\"share\";s:5:\"count\";i:606;}s:11:\"performance\";a:3:{s:4:\"name\";s:11:\"performance\";s:4:\"slug\";s:11:\"performance\";s:5:\"count\";i:605;}s:14:\"contact-form-7\";a:3:{s:4:\"name\";s:14:\"contact form 7\";s:4:\"slug\";s:14:\"contact-form-7\";s:5:\"count\";i:597;}s:7:\"contact\";a:3:{s:4:\"name\";s:7:\"contact\";s:4:\"slug\";s:7:\"contact\";s:5:\"count\";i:595;}s:3:\"ads\";a:3:{s:4:\"name\";s:3:\"ads\";s:4:\"slug\";s:3:\"ads\";s:5:\"count\";i:586;}s:6:\"events\";a:3:{s:4:\"name\";s:6:\"events\";s:4:\"slug\";s:6:\"events\";s:5:\"count\";i:584;}s:7:\"comment\";a:3:{s:4:\"name\";s:7:\"comment\";s:4:\"slug\";s:7:\"comment\";s:5:\"count\";i:578;}s:6:\"custom\";a:3:{s:4:\"name\";s:6:\"custom\";s:4:\"slug\";s:6:\"custom\";s:5:\"count\";i:574;}s:5:\"forms\";a:3:{s:4:\"name\";s:5:\"forms\";s:4:\"slug\";s:5:\"forms\";s:5:\"count\";i:572;}s:5:\"theme\";a:3:{s:4:\"name\";s:5:\"theme\";s:4:\"slug\";s:5:\"theme\";s:5:\"count\";i:572;}s:6:\"blocks\";a:3:{s:4:\"name\";s:6:\"blocks\";s:4:\"slug\";s:6:\"blocks\";s:5:\"count\";i:560;}s:10:\"categories\";a:3:{s:4:\"name\";s:10:\"categories\";s:4:\"slug\";s:10:\"categories\";s:5:\"count\";i:558;}s:5:\"popup\";a:3:{s:4:\"name\";s:5:\"popup\";s:4:\"slug\";s:5:\"popup\";s:5:\"count\";i:550;}s:6:\"button\";a:3:{s:4:\"name\";s:6:\"button\";s:4:\"slug\";s:6:\"button\";s:5:\"count\";i:545;}s:8:\"calendar\";a:3:{s:4:\"name\";s:8:\"calendar\";s:4:\"slug\";s:8:\"calendar\";s:5:\"count\";i:540;}s:4:\"user\";a:3:{s:4:\"name\";s:4:\"user\";s:4:\"slug\";s:4:\"user\";s:5:\"count\";i:530;}s:8:\"payments\";a:3:{s:4:\"name\";s:8:\"payments\";s:4:\"slug\";s:8:\"payments\";s:5:\"count\";i:524;}s:5:\"users\";a:3:{s:4:\"name\";s:5:\"users\";s:4:\"slug\";s:5:\"users\";s:5:\"count\";i:522;}s:4:\"tags\";a:3:{s:4:\"name\";s:4:\"tags\";s:4:\"slug\";s:4:\"tags\";s:5:\"count\";i:520;}s:10:\"newsletter\";a:3:{s:4:\"name\";s:10:\"newsletter\";s:4:\"slug\";s:10:\"newsletter\";s:5:\"count\";i:508;}s:6:\"mobile\";a:3:{s:4:\"name\";s:6:\"mobile\";s:4:\"slug\";s:6:\"mobile\";s:5:\"count\";i:504;}s:10:\"navigation\";a:3:{s:4:\"name\";s:10:\"navigation\";s:4:\"slug\";s:10:\"navigation\";s:5:\"count\";i:498;}s:12:\"social-media\";a:3:{s:4:\"name\";s:12:\"social media\";s:4:\"slug\";s:12:\"social-media\";s:5:\"count\";i:481;}s:8:\"tracking\";a:3:{s:4:\"name\";s:8:\"tracking\";s:4:\"slug\";s:8:\"tracking\";s:5:\"count\";i:468;}s:5:\"stats\";a:3:{s:4:\"name\";s:5:\"stats\";s:4:\"slug\";s:5:\"stats\";s:5:\"count\";i:467;}s:8:\"checkout\";a:3:{s:4:\"name\";s:8:\"checkout\";s:4:\"slug\";s:8:\"checkout\";s:5:\"count\";i:461;}s:12:\"notification\";a:3:{s:4:\"name\";s:12:\"notification\";s:4:\"slug\";s:12:\"notification\";s:5:\"count\";i:459;}s:7:\"gateway\";a:3:{s:4:\"name\";s:7:\"gateway\";s:4:\"slug\";s:7:\"gateway\";s:5:\"count\";i:459;}s:10:\"statistics\";a:3:{s:4:\"name\";s:10:\"statistics\";s:4:\"slug\";s:10:\"statistics\";s:5:\"count\";i:455;}s:5:\"photo\";a:3:{s:4:\"name\";s:5:\"photo\";s:4:\"slug\";s:5:\"photo\";s:5:\"count\";i:454;}s:9:\"slideshow\";a:3:{s:4:\"name\";s:9:\"slideshow\";s:4:\"slug\";s:9:\"slideshow\";s:5:\"count\";i:452;}s:8:\"redirect\";a:3:{s:4:\"name\";s:8:\"redirect\";s:4:\"slug\";s:8:\"redirect\";s:5:\"count\";i:448;}s:6:\"import\";a:3:{s:4:\"name\";s:6:\"import\";s:4:\"slug\";s:6:\"import\";s:5:\"count\";i:447;}s:2:\"ai\";a:3:{s:4:\"name\";s:2:\"AI\";s:4:\"slug\";s:2:\"ai\";s:5:\"count\";i:440;}s:4:\"news\";a:3:{s:4:\"name\";s:4:\"news\";s:4:\"slug\";s:4:\"news\";s:5:\"count\";i:432;}s:6:\"photos\";a:3:{s:4:\"name\";s:6:\"photos\";s:4:\"slug\";s:6:\"photos\";s:5:\"count\";i:429;}s:5:\"cache\";a:3:{s:4:\"name\";s:5:\"cache\";s:4:\"slug\";s:5:\"cache\";s:5:\"count\";i:422;}s:10:\"shortcodes\";a:3:{s:4:\"name\";s:10:\"shortcodes\";s:4:\"slug\";s:10:\"shortcodes\";s:5:\"count\";i:420;}s:4:\"code\";a:3:{s:4:\"name\";s:4:\"code\";s:4:\"slug\";s:4:\"code\";s:5:\"count\";i:418;}s:7:\"plugins\";a:3:{s:4:\"name\";s:7:\"plugins\";s:4:\"slug\";s:7:\"plugins\";s:5:\"count\";i:408;}s:9:\"multisite\";a:3:{s:4:\"name\";s:9:\"multisite\";s:4:\"slug\";s:9:\"multisite\";s:5:\"count\";i:402;}}','off'),(162,'finished_updating_comment_type','1','auto'),(169,'wp_graphql_version','2.3.0','auto'),(170,'graphql_general_settings','','auto'),(171,'acf_first_activated_version','6.3.12','on'),(172,'acf_site_health','{\"version\":\"6.3.12\",\"plugin_type\":\"Free\",\"update_source\":\"wordpress.org\",\"wp_version\":\"6.7.2\",\"mysql_version\":\"8.0.35\",\"is_multisite\":false,\"active_theme\":{\"name\":\"Twenty Twenty-Five\",\"version\":\"1.0\",\"theme_uri\":\"https:\\/\\/wordpress.org\\/themes\\/twentytwentyfive\\/\",\"stylesheet\":false},\"active_plugins\":{\"advanced-custom-fields\\/acf.php\":{\"name\":\"Advanced Custom Fields\",\"version\":\"6.3.12\",\"plugin_uri\":\"https:\\/\\/www.advancedcustomfields.com\"},\"hwpt-wpgraphql-sitemap\\/hwpt-wpgraphql-sitemap.php\":{\"name\":\"HWPT WPGraphQL Sitemap\",\"version\":\"1.0.0\",\"plugin_uri\":\"\"},\"wp-graphql\\/wp-graphql.php\":{\"name\":\"WPGraphQL\",\"version\":\"2.1.1\",\"plugin_uri\":\"https:\\/\\/github.com\\/wp-graphql\\/wp-graphql\"}},\"ui_field_groups\":\"0\",\"php_field_groups\":\"0\",\"json_field_groups\":\"0\",\"rest_field_groups\":\"0\",\"number_of_fields_by_type\":[],\"number_of_third_party_fields_by_type\":[],\"post_types_enabled\":true,\"ui_post_types\":\"3\",\"json_post_types\":\"0\",\"ui_taxonomies\":\"3\",\"json_taxonomies\":\"0\",\"rest_api_format\":\"light\",\"admin_ui_enabled\":true,\"field_type-modal_enabled\":true,\"field_settings_tabs_enabled\":false,\"shortcode_enabled\":false,\"registered_acf_forms\":\"0\",\"json_save_paths\":1,\"json_load_paths\":1,\"event_first_activated\":1743158563,\"last_updated\":1743159955,\"event_first_created_post_type\":1743159900,\"event_first_created_taxonomy\":1743159955}','off'),(174,'acf_version','6.3.12','auto'),(175,'wp-graphql_allow_tracking','no','auto'),(177,'wp-graphql_tracking_skipped','yes','auto'),(178,'wpgraphql-acf_allow_tracking','no','auto'),(180,'wpgraphql-acf_tracking_skipped','yes','auto'),(181,'_site_transient_timeout_popular_importers_968d0fadeded9636c5b63190aaec278f','1743332479','off'),(182,'_site_transient_popular_importers_968d0fadeded9636c5b63190aaec278f','a:2:{s:9:\"importers\";a:7:{s:7:\"blogger\";a:4:{s:4:\"name\";s:7:\"Blogger\";s:11:\"description\";s:54:\"Import posts, comments, and users from a Blogger blog.\";s:11:\"plugin-slug\";s:16:\"blogger-importer\";s:11:\"importer-id\";s:7:\"blogger\";}s:9:\"wpcat2tag\";a:4:{s:4:\"name\";s:29:\"Categories and Tags Converter\";s:11:\"description\";s:71:\"Convert existing categories to tags or tags to categories, selectively.\";s:11:\"plugin-slug\";s:18:\"wpcat2tag-importer\";s:11:\"importer-id\";s:10:\"wp-cat2tag\";}s:11:\"livejournal\";a:4:{s:4:\"name\";s:11:\"LiveJournal\";s:11:\"description\";s:46:\"Import posts from LiveJournal using their API.\";s:11:\"plugin-slug\";s:20:\"livejournal-importer\";s:11:\"importer-id\";s:11:\"livejournal\";}s:11:\"movabletype\";a:4:{s:4:\"name\";s:24:\"Movable Type and TypePad\";s:11:\"description\";s:62:\"Import posts and comments from a Movable Type or TypePad blog.\";s:11:\"plugin-slug\";s:20:\"movabletype-importer\";s:11:\"importer-id\";s:2:\"mt\";}s:3:\"rss\";a:4:{s:4:\"name\";s:3:\"RSS\";s:11:\"description\";s:30:\"Import posts from an RSS feed.\";s:11:\"plugin-slug\";s:12:\"rss-importer\";s:11:\"importer-id\";s:3:\"rss\";}s:6:\"tumblr\";a:4:{s:4:\"name\";s:6:\"Tumblr\";s:11:\"description\";s:53:\"Import posts & media from Tumblr using their API.\";s:11:\"plugin-slug\";s:15:\"tumblr-importer\";s:11:\"importer-id\";s:6:\"tumblr\";}s:9:\"wordpress\";a:4:{s:4:\"name\";s:9:\"WordPress\";s:11:\"description\";s:96:\"Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.\";s:11:\"plugin-slug\";s:18:\"wordpress-importer\";s:11:\"importer-id\";s:9:\"wordpress\";}}s:10:\"translated\";b:0;}','off'),(185,'wp_calendar_block_has_published_posts','1','auto'),(187,'theme_mods_twentytwentyfive','a:1:{s:18:\"custom_css_post_id\";i:-1;}','auto'),(188,'_transient_wp_styles_for_blocks','a:2:{s:4:\"hash\";s:32:\"995febb4f4fef6e5500e6199916c745b\";s:6:\"blocks\";a:52:{s:11:\"core/button\";s:0:\"\";s:14:\"core/site-logo\";s:0:\"\";s:18:\"core/post-template\";s:0:\"\";s:12:\"core/columns\";s:769:\":root :where(.wp-block-columns-is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.wp-block-columns-is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-flow) > *{margin-block-start: var(--wp--preset--spacing--50);margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.wp-block-columns-is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-constrained) > *{margin-block-start: var(--wp--preset--spacing--50);margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-flex){gap: var(--wp--preset--spacing--50);}:root :where(.wp-block-columns-is-layout-grid){gap: var(--wp--preset--spacing--50);}\";s:14:\"core/pullquote\";s:306:\":root :where(.wp-block-pullquote){font-size: var(--wp--preset--font-size--xx-large);font-weight: 300;line-height: 1.2;padding-top: var(--wp--preset--spacing--30);padding-bottom: var(--wp--preset--spacing--30);}:root :where(.wp-block-pullquote p:last-of-type){margin-bottom: var(--wp--preset--spacing--30);}\";s:32:\"c48738dcb285a3f6ab83acff204fc486\";s:106:\":root :where(.wp-block-pullquote cite){font-size: var(--wp--preset--font-size--small);font-style: normal;}\";s:11:\"core/avatar\";s:57:\":root :where(.wp-block-avatar img){border-radius: 100px;}\";s:12:\"core/buttons\";s:665:\":root :where(.wp-block-buttons-is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.wp-block-buttons-is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.wp-block-buttons-is-layout-flow) > *{margin-block-start: 16px;margin-block-end: 0;}:root :where(.wp-block-buttons-is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.wp-block-buttons-is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.wp-block-buttons-is-layout-constrained) > *{margin-block-start: 16px;margin-block-end: 0;}:root :where(.wp-block-buttons-is-layout-flex){gap: 16px;}:root :where(.wp-block-buttons-is-layout-grid){gap: 16px;}\";s:9:\"core/code\";s:427:\":root :where(.wp-block-code){background-color: var(--wp--preset--color--accent-5);color: var(--wp--preset--color--contrast);font-family: var(--wp--preset--font-family--fira-code);font-size: var(--wp--preset--font-size--medium);font-weight: 300;padding-top: var(--wp--preset--spacing--40);padding-right: var(--wp--preset--spacing--40);padding-bottom: var(--wp--preset--spacing--40);padding-left: var(--wp--preset--spacing--40);}\";s:24:\"core/comment-author-name\";s:169:\":root :where(.wp-block-comment-author-name){color: var(--wp--preset--color--accent-4);font-size: var(--wp--preset--font-size--small);margin-top: 5px;margin-bottom: 0px;}\";s:32:\"c0002c260f8238c4212f3e4c369fc4f7\";s:143:\":root :where(.wp-block-comment-author-name a:where(:not(.wp-element-button))){color: var(--wp--preset--color--accent-4);text-decoration: none;}\";s:32:\"1e7c38b45537b325dbbbaec17a301676\";s:112:\":root :where(.wp-block-comment-author-name a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";s:20:\"core/comment-content\";s:178:\":root :where(.wp-block-comment-content){font-size: var(--wp--preset--font-size--medium);margin-top: var(--wp--preset--spacing--30);margin-bottom: var(--wp--preset--spacing--30);}\";s:17:\"core/comment-date\";s:127:\":root :where(.wp-block-comment-date){color: var(--wp--preset--color--contrast);font-size: var(--wp--preset--font-size--small);}\";s:32:\"c83ca7b3e52884c70f7830c54f99b318\";s:114:\":root :where(.wp-block-comment-date a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast);}\";s:22:\"core/comment-edit-link\";s:90:\":root :where(.wp-block-comment-edit-link){font-size: var(--wp--preset--font-size--small);}\";s:32:\"41d70710612536a90e368c12bcb0efea\";s:119:\":root :where(.wp-block-comment-edit-link a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast);}\";s:23:\"core/comment-reply-link\";s:91:\":root :where(.wp-block-comment-reply-link){font-size: var(--wp--preset--font-size--small);}\";s:32:\"13c96340dbf37700add1f4c5cae19f3e\";s:120:\":root :where(.wp-block-comment-reply-link a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast);}\";s:23:\"core/post-comments-form\";s:565:\":root :where(.wp-block-post-comments-form){font-size: var(--wp--preset--font-size--medium);padding-top: var(--wp--preset--spacing--40);padding-bottom: var(--wp--preset--spacing--40);}:root :where(.wp-block-post-comments-form textarea, .wp-block-post-comments-form input:not([type=submit])){border-radius:.25rem; border-color: var(--wp--preset--color--accent-6) !important;}:root :where(.wp-block-post-comments-form input[type=checkbox]){margin:0 .2rem 0 0 !important;}:root :where(.wp-block-post-comments-form label){font-size: var(--wp--preset--font-size--small);}\";s:24:\"core/comments-pagination\";s:182:\":root :where(.wp-block-comments-pagination){font-size: var(--wp--preset--font-size--medium);margin-top: var(--wp--preset--spacing--40);margin-bottom: var(--wp--preset--spacing--40);}\";s:29:\"core/comments-pagination-next\";s:98:\":root :where(.wp-block-comments-pagination-next){font-size: var(--wp--preset--font-size--medium);}\";s:32:\"core/comments-pagination-numbers\";s:101:\":root :where(.wp-block-comments-pagination-numbers){font-size: var(--wp--preset--font-size--medium);}\";s:33:\"core/comments-pagination-previous\";s:102:\":root :where(.wp-block-comments-pagination-previous){font-size: var(--wp--preset--font-size--medium);}\";s:14:\"core/post-date\";s:124:\":root :where(.wp-block-post-date){color: var(--wp--preset--color--accent-4);font-size: var(--wp--preset--font-size--small);}\";s:32:\"ac0d4e00f5ec22d14451759983e5bd43\";s:133:\":root :where(.wp-block-post-date a:where(:not(.wp-element-button))){color: var(--wp--preset--color--accent-4);text-decoration: none;}\";s:32:\"0ae6ffd1b886044c2da62d75d05ab13d\";s:102:\":root :where(.wp-block-post-date a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";s:25:\"core/post-navigation-link\";s:94:\":root :where(.wp-block-post-navigation-link){font-size: var(--wp--preset--font-size--medium);}\";s:15:\"core/post-terms\";s:158:\":root :where(.wp-block-post-terms){font-size: var(--wp--preset--font-size--small);font-weight: 600;}:root :where(.wp-block-post-terms a){white-space: nowrap;}\";s:15:\"core/post-title\";s:0:\"\";s:32:\"bb496d3fcd9be3502ce57ff8281e5687\";s:92:\":root :where(.wp-block-post-title a:where(:not(.wp-element-button))){text-decoration: none;}\";s:32:\"12380ab98fdc81351bb32a39bbfc9249\";s:103:\":root :where(.wp-block-post-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";s:10:\"core/quote\";s:1315:\":root :where(.wp-block-quote){border-color: currentColor;border-width: 0 0 0 2px;border-style: solid;font-size: var(--wp--preset--font-size--large);font-weight: 300;margin-right: 0;margin-left: 0;padding-top: var(--wp--preset--spacing--30);padding-right: var(--wp--preset--spacing--40);padding-bottom: var(--wp--preset--spacing--30);padding-left: var(--wp--preset--spacing--40);}:root :where(.wp-block-quote-is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.wp-block-quote-is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.wp-block-quote-is-layout-flow) > *{margin-block-start: var(--wp--preset--spacing--30);margin-block-end: 0;}:root :where(.wp-block-quote-is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.wp-block-quote-is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.wp-block-quote-is-layout-constrained) > *{margin-block-start: var(--wp--preset--spacing--30);margin-block-end: 0;}:root :where(.wp-block-quote-is-layout-flex){gap: var(--wp--preset--spacing--30);}:root :where(.wp-block-quote-is-layout-grid){gap: var(--wp--preset--spacing--30);}:root :where(.wp-block-quote.has-text-align-right ){border-width: 0 2px 0 0;}:root :where(.wp-block-quote.has-text-align-center ){border-width: 0;border-inline: 0; padding-inline: 0;}\";s:32:\"1de7a22e22013106efc5be82788cb6c0\";s:176:\":root :where(.wp-block-quote cite){font-size: var(--wp--preset--font-size--small);font-style: normal;font-weight: 300;}:root :where(.wp-block-quote cite sub){font-size: 0.65em}\";s:21:\"core/query-pagination\";s:107:\":root :where(.wp-block-query-pagination){font-size: var(--wp--preset--font-size--medium);font-weight: 500;}\";s:11:\"core/search\";s:380:\":root :where(.wp-block-search .wp-block-search__label, .wp-block-search .wp-block-search__input, .wp-block-search .wp-block-search__button){font-size: var(--wp--preset--font-size--medium);line-height: 1.6;}:root :where(.wp-block-search .wp-block-search__input){border-radius:3.125rem;padding-left:1.5625rem;padding-right:1.5625rem;border-color:var(--wp--preset--color--accent-6);}\";s:32:\"14fa6a3d0cfbde171cbc0fb04aa8a6cf\";s:138:\":root :where(.wp-block-search .wp-element-button,.wp-block-search .wp-block-button__link){border-radius: 3.125rem;margin-left: 1.125rem;}\";s:32:\"05993ee2f3de94b5d1350998a7e9b6b0\";s:130:\":root :where(.wp-block-search .wp-element-button:hover,.wp-block-search .wp-block-button__link:hover){border-color: transparent;}\";s:14:\"core/separator\";s:148:\":root :where(.wp-block-separator){border-color: currentColor;border-width: 0 0 1px 0;border-style: solid;color: var(--wp--preset--color--accent-6);}\";s:17:\"core/site-tagline\";s:86:\":root :where(.wp-block-site-tagline){font-size: var(--wp--preset--font-size--medium);}\";s:15:\"core/site-title\";s:75:\":root :where(.wp-block-site-title){font-weight: 700;letter-spacing: -.5px;}\";s:32:\"f513d889cf971b13995cc3fffed2f39b\";s:92:\":root :where(.wp-block-site-title a:where(:not(.wp-element-button))){text-decoration: none;}\";s:32:\"22c37a317cc0ebd50155b5ad78564f37\";s:103:\":root :where(.wp-block-site-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";s:21:\"core/term-description\";s:90:\":root :where(.wp-block-term-description){font-size: var(--wp--preset--font-size--medium);}\";s:15:\"core/navigation\";s:84:\":root :where(.wp-block-navigation){font-size: var(--wp--preset--font-size--medium);}\";s:32:\"25289a01850f5a0264ddb79a9a3baf3d\";s:92:\":root :where(.wp-block-navigation a:where(:not(.wp-element-button))){text-decoration: none;}\";s:32:\"026c04da08398d655a95047f1f235d97\";s:103:\":root :where(.wp-block-navigation a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";s:9:\"core/list\";s:52:\":root :where(.wp-block-list li){margin-top: 0.5rem;}\";s:12:\"core/heading\";s:0:\"\";s:14:\"core/paragraph\";s:0:\"\";s:10:\"core/group\";s:0:\"\";s:11:\"core/column\";s:0:\"\";}}','on'),(191,'_site_transient_timeout_wp_remote_block_patterns_da85ad53ed0dfe6b80a221538486d49d','1743163418','off'),(192,'_site_transient_wp_remote_block_patterns_da85ad53ed0dfe6b80a221538486d49d','a:44:{i:0;O:8:\"stdClass\":7:{s:2:\"id\";i:514958;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Intro area with heading and image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1699:\"\n
\n
\n\n\n\n
\n
\n
\n

Uncover a realm of opportunities.

\n
\n\n\n\n
\n

Exploring life’s complex tapestry, options reveal routes to the exceptional, requiring innovation, inquisitiveness, and bravery for a deeply satisfying voyage.

\n\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"\"
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:4:\"hero\";s:16:\"wpop_description\";s:93:\"Two columns of text, left with a heading and right with a paragraph, with a wide image below.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.5\";s:25:\"wpop_contains_block_types\";s:111:\"core/button,core/buttons,core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"about\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2422:\"\n
\n
\n\n\n\n
\n
\n
\n

Uncover a realm of opportunities.

\n
\n\n\n\n
\n

Exploring life\'s complex tapestry, options reveal routes to the exceptional, requiring innovation, inquisitiveness, and bravery for a deeply satisfying voyage.

\n\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"\"
\n
\n\n\n\n
\n
\n\";}i:1;O:8:\"stdClass\":7:{s:2:\"id\";i:309935;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:45:\"Centered image with two-tone background color\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1349:\"\n
\n
\n
\n\n\n\n
\"\"
\n\n\n\n
\n\n\n\n

Etcetera

\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:18:\"Gradient, Two-Tone\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:57:\"core/cover,core/group,core/heading,core/image,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:3:{i:0;s:6:\"banner\";i:1;s:6:\"images\";i:2;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2134:\"\n
\n
\n
\n\n\n\n
\"\"
\n\n\n\n
\n\n\n\n

Etcetera

\n\n\n\n
\n
\n
\n\";}i:2;O:8:\"stdClass\":7:{s:2:\"id\";i:309925;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:43:\"Fullwidth Dark Banner with Heading Top Left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1103:\"\n
\"\"
\n
\n

bud!

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:16:\"Jazz, Fulllwidth\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1697:\"\n
\"\"
\n
\n

bud!

\n
\n
\n\";}i:3;O:8:\"stdClass\":7:{s:2:\"id\";i:309230;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:44:\"Fullwidth cover with repeating gradient text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1750:\"\n
\"\"
\n
\n\n\n\n
\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:48:\"Fullwidth, Background Image, Gradient, Uppercase\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:48:\"core/cover,core/group,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3135:\"\n
\"\"
\n
\n\n\n\n
\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n
\n\n\n\n
\n
\n\";}i:4;O:8:\"stdClass\":7:{s:2:\"id\";i:309224;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:72:\"Fullwidth, vertically aligned headline on right with description on left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2229:\"\n
\n
\n
\n

Let ’em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.

\n\n\n\n\n
\n\n\n\n
\n

Let
‘EM
Roll

\n\n\n\n

Big
John
Patton

\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:60:\"vertically, bold, jazz, shop, store, headline, hero, product\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:61:\"core/button,core/buttons,core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3726:\"\n
\n
\n
\n

Let \'em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.

\n\n\n\n\n
\n\n\n\n
\n

Let
\'EM
Roll

\n\n\n\n

Big
John
Patton

\n
\n
\n
\n\";}i:5;O:8:\"stdClass\":7:{s:2:\"id\";i:309236;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:60:\"Fullwidth headline with links and gradient offset background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2070:\"\n
\n
\n\n\n\n
\n
\n

MONK.

\n
\n\n\n\n
\n
\n

A new collection

\n\n\n\n

Learn More

\n
\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:41:\"Offset, Gradient, Jazz, Headline, Feature\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:48:\"core/cover,core/group,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3195:\"\n
\n
\n\n\n\n
\n
\n

MONK.

\n
\n\n\n\n
\n
\n

A new collection

\n\n\n\n

Learn More →

\n
\n
\n
\n\n\n\n
\n
\n\";}i:6;O:8:\"stdClass\":7:{s:2:\"id\";i:308937;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:42:\"Heading, Paragraph, Button with Two Images\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2682:\"\n
\n
\n
\n

Time for an adventure

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n\n\n\n
\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:97:\"core/button,core/buttons,core/cover,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:4102:\"\n
\n
\n
\n

Time for an adventure

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n\n\n\n
\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";}i:7;O:8:\"stdClass\":7:{s:2:\"id\";i:308949;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:42:\"Bold sale banner with geometric background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1757:\"\n
\"\"
\n
\n

Enjoy

\n\n\n\n

20% Off

\n\n\n\n
\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:43:\"store, shop, coupon, jazz, background image\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:73:\"core/button,core/buttons,core/cover,core/group,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2819:\"\n
\"\"
\n
\n

Enjoy

\n\n\n\n

20% Off

\n\n\n\n
\n\n\n\n\n
\n
\n\";}i:8;O:8:\"stdClass\":7:{s:2:\"id\";i:308924;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:47:\"Offset bold paragraph text with varying opacity\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1658:\"\n
\n
\n

Embark

\n\n\n\n

ON A HIKING

\n\n\n\n

adventure and explore the beauty of nature’s best…

\n\n\n\n

In the

\n\n\n\n

WOODS.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3052:\"\n
\n
\n

Embark

\n\n\n\n

ON A HIKING

\n\n\n\n

adventure and explore the beauty of nature\'s best…

\n\n\n\n

In the

\n\n\n\n

WOODS.

\n
\n
\n\";}i:9;O:8:\"stdClass\":7:{s:2:\"id\";i:308916;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Offset text with a brutalist design vibe\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1455:\"\n
\n
\n

✴︎ Walk

\n\n\n\n

In the

\n\n\n\n

Park

\n\n\n\n

—01.03

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2631:\"\n
\n
\n

✴︎ Walk

\n\n\n\n

In the

\n\n\n\n

Park

\n\n\n\n

—01.03

\n
\n
\n\";}i:10;O:8:\"stdClass\":7:{s:2:\"id\";i:308901;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Fullscreen image with right content area\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2135:\"\n
\n
\n
\"\"
\n\n\n\n
\n

wAndering through the woods

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:97:\"core/button,core/buttons,core/cover,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3261:\"\n
\n
\n
\"\"
\n\n\n\n
\n

wAndering through the woods

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n
\n
\n\";}i:11;O:8:\"stdClass\":7:{s:2:\"id\";i:308871;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:46:\"Cover Image with Bold Heading and Button, Left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1639:\"\n
\"\"
\n
\n

Take a hike and wAnder through the woods

\n
\n\n\n\n
\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:71:\"core/button,core/buttons,core/cover,core/group,core/heading,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2443:\"\n
\"\"
\n
\n

Take a hike and wAnder through the woods

\n
\n\n\n\n
\n\n\n\n\n
\n\";}i:12;O:8:\"stdClass\":7:{s:2:\"id\";i:308868;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Cover Image with Bold Heading and Button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1647:\"\n
\"\"
\n
\n

Embark on a hiking adventure and explore the beauty of the woods.

\n
\n\n\n\n
\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:71:\"core/button,core/buttons,core/cover,core/group,core/heading,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2449:\"\n
\"\"
\n
\n

Embark on a hiking adventure and explore the beauty of the woods.

\n
\n\n\n\n
\n\n\n\n\n
\n\";}i:13;O:8:\"stdClass\":7:{s:2:\"id\";i:303828;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:30:\"Fullscreen cover image gallery\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:961:\"\n
\n
\n
\"\"
\n\n\n\n
\"\"
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:43:\"gallery, images, columns, background, cover\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:32:\"core/cover,core/group,core/image\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1259:\"\n
\n
\n
\"\"
\n\n\n\n
\"\"
\n
\n
\n\";}i:14;O:8:\"stdClass\":7:{s:2:\"id\";i:277265;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Fullwidth posts with uppercase titles\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:498:\"\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:30:\"star, posts, loop, blog, index\";s:16:\"wpop_description\";s:62:\"A fullwidth posts pattern with large titles and start accents.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/query\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:182:\"core/group,core/paragraph,core/post-date,core/post-template,core/post-terms,core/post-title,core/query,core/query-pagination,core/query-pagination-next,core/query-pagination-previous\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"query\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3502:\"\n
\n
\n\n
\n
\n
\n

✴︎

\n\n\n
\n\n\n
\n
\n\n\n\n
\n\n
\n\n\n\n
\n\n\n\n
\n
\n\";}i:15;O:8:\"stdClass\":7:{s:2:\"id\";i:277127;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Fullwidth posts titles with dates\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:637:\"\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:31:\"Posts, Query, Loop, Blog, Index\";s:16:\"wpop_description\";s:62:\"A fullwidth posts pattern with large titles and numeral dates.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/query\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:151:\"core/group,core/post-date,core/post-template,core/post-title,core/query,core/query-pagination,core/query-pagination-next,core/query-pagination-previous\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"query\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3583:\"\n
\n
\n\n
\n
\n\n
\n\n\n
\n\n
\n\n\n\n
\n\n\n\n
\n
\n\";}i:16;O:8:\"stdClass\":7:{s:2:\"id\";i:229092;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Header inside full-width background image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4792:\"\n
\n
\"\"
\n
\n\n\n\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:100:\"Simple header with logo, site title, navigation and a full-width background image with dark overlay.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:80:\"core/cover,core/group,core/navigation,core/site-logo,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2554:\"\n
\n
\"\"
\n
\n
\n\n
\n\n\n
\n\n\n\n
\n
\n
\n\";}i:17;O:8:\"stdClass\":7:{s:2:\"id\";i:229097;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Simple header with dark background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3949:\"\n
\n
\n\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:76:\"Simple header with logo, site title, navigation links and a dark background.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1497:\"\n
\n
\n
\n\n
\n\n\n\n
\n
\n
\n\";}i:18;O:8:\"stdClass\":7:{s:2:\"id\";i:229101;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:29:\"Text-only header with tagline\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3628:\"\n
\n
\n

Patterns

\n\n

Beautifully designed patterns ready to go with a simple copy/paste

\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:53:\"Header with site title, tagline and navigation links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:60:\"core/group,core/navigation,core/site-tagline,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:966:\"\n
\n
\n
\n\n
\n\n\n
\n
\n\";}i:19;O:8:\"stdClass\":7:{s:2:\"id\";i:229105;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:26:\"Simple header with tagline\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4229:\"\n
\n
\n
\"Site
\n\n\n

Patterns

\n\n

Beautifully designed patterns ready to go with a simple copy/paste

\n
\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:92:\"Header with site logo, title and tagline on the left and with navigation links on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:75:\"core/group,core/navigation,core/site-logo,core/site-tagline,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1389:\"\n
\n
\n
\n\n\n
\n\n
\n
\n\n\n
\n
\n\";}i:20;O:8:\"stdClass\":7:{s:2:\"id\";i:229111;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:36:\"Fullwidth site title and menu button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3359:\"\n

Patterns

\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:51:\"Header with site title and a hamburger menu button.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:42:\"core/group,core/navigation,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:794:\"\n
\n\n
\n\";}i:21;O:8:\"stdClass\":7:{s:2:\"id\";i:229116;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:32:\"Fullwidth header with hero image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4776:\"\n
\n
\n
\"Site
\n\n\n\n
\n\n\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:65:\"Header on a white background followed by a full-width hero image.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:80:\"core/cover,core/group,core/navigation,core/site-logo,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2566:\"\n
\n
\n
\n\n\n
\n
\n\n\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";}i:22;O:8:\"stdClass\":7:{s:2:\"id\";i:229080;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:25:\"Centered header with logo\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3695:\"\n
\n
\"Site
\n\n

Patterns

\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:65:\"Center aligned header with logo, site title and navigation links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:926:\"\n
\n
\n\n\n\n
\n
\n\";}i:23;O:8:\"stdClass\":7:{s:2:\"id\";i:229084;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Fullwidth header with large font size\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3465:\"\n

Patterns

\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:80:\"Header with a large site title and navigation links in the same large font size.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:42:\"core/group,core/navigation,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:811:\"\n
\n\n
\n\";}i:24;O:8:\"stdClass\":7:{s:2:\"id\";i:229088;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:13:\"Simple header\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3757:\"\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:51:\"Simple header with logo, site title and navigation.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1021:\"\n
\n
\n
\n\n
\n\n\n
\n
\n\";}i:25;O:8:\"stdClass\":7:{s:2:\"id\";i:229123;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Centered footer with social links\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4249:\"\n
\n
\n

Proudly powered by WordPress

\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:82:\"Centered footer with the sentence \"Proudly powered by WordPress\" and social links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:25:\"core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1495:\"\n
\n
\n

Proudly powered by WordPress

\n\n\n\n\n
\n
\n\";}i:26;O:8:\"stdClass\":7:{s:2:\"id\";i:229127;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:47:\"Footer with search, site title, and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3153:\"\n
\n
\n
\n

Search

\n\n\n
\n\n\n\n
\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n
\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:88:\"Footer with search field and site title on the left, and small credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:65:\"core/group,core/paragraph,core/search,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:3254:\"\n
\n
\n
\n

Search

\n\n\n
\n\n\n\n
\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n
\n
\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";}i:27;O:8:\"stdClass\":7:{s:2:\"id\";i:229131;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Footer with site title and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:894:\"\n
\n
\n\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:64:\"Footer with site title on the left and credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/paragraph,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1095:\"\n
\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";}i:28;O:8:\"stdClass\":7:{s:2:\"id\";i:229135;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Footer with navigation and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3629:\"\n
\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:64:\"Footer with navigation on the left and credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/navigation,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1174:\"\n
\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";}i:29;O:8:\"stdClass\":7:{s:2:\"id\";i:229139;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:56:\"Fullwidth footer with background color and three columns\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3042:\"\n
\n
\n
\n

Location

\n\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n
\n
\n\n\n\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Follow us

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n\n\n\n
\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:57:\"Text-only footer with background color and three columns.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:78:\"core/column,core/columns,core/group,core/navigation,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:3225:\"\n
\n
\n
\n

Location

\n\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n
\n
\n\n\n\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Follow us

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n\n\n\n
\n

Proudly powered by WordPress

\n
\n
\n\";}i:30;O:8:\"stdClass\":7:{s:2:\"id\";i:229143;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Centered footer with social links\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4155:\"\n
\"Site
\n\n\n

Proudly powered by WordPress

\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:71:\"Footer with centered site title, tagline, social links and credit line.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:75:\"core/group,core/paragraph,core/site-logo,core/social-link,core/social-links\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1532:\"\n
\n\n\n

Proudly powered by WordPress

\n\n\n\n\n
\n\";}i:31;O:8:\"stdClass\":7:{s:2:\"id\";i:229147;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:52:\"Fullwidth footer with navigation, credit, and social\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4666:\"\n
\n

Patterns

\n\n\n
\n

Proudly powered by WordPress

\n
\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:87:\"Footer with site title on the left, credit in the middle and social links on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:76:\"core/group,core/paragraph,core/site-title,core/social-link,core/social-links\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1869:\"\n
\n
\n\n\n
\n

Proudly powered by WordPress

\n
\n\n\n\n\n
\n
\n\";}i:32;O:8:\"stdClass\":7:{s:2:\"id\";i:229151;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:19:\"Left-aligned footer\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2954:\"\n
\n

Patterns

\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n

Proudly powered by WordPress

\n\n\n\n
\n
\n\n\n\n
\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:44:\"Left-aligned footer with just a credit line.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:69:\"core/group,core/navigation,core/paragraph,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2939:\"\n
\n
\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n

Proudly powered by WordPress

\n\n\n\n
\n
\n\n\n\n
\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n
\n\";}i:33;O:8:\"stdClass\":7:{s:2:\"id\";i:201;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:32:\"Three columns with offset images\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1358:\"\n
\n
\n
\"Close-up,
\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"Close-up,
\n
\n\n\n\n
\n
\"Close-up
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:33:\"Three columns with offset images.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:47:\"core/column,core/columns,core/image,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"gallery\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1753:\"\n
\n
\n
\"Close-up,
\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"Close-up,
\n
\n\n\n\n
\n
\"Close-up
\n\n\n\n
\n
\n
\n\";}i:34;O:8:\"stdClass\":7:{s:2:\"id\";i:199;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Three columns with images and text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3604:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man’s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Three columns with images and text, with vertical spacing for an offset look.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:86:\"core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:4:{i:0;s:7:\"columns\";i:1;s:7:\"gallery\";i:2;s:6:\"images\";i:3;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:5124:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man\'s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";}i:35;O:8:\"stdClass\":7:{s:2:\"id\";i:197;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:39:\"Two columns of text with offset heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2296:\"\n
\n
\n\n\n\n
\n
\n

Oceanic Inspiration

\n
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.

\n
\n\n\n\n
\n

No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.

\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:43:\"Two columns of text with an offset heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:77:\"core/column,core/columns,core/group,core/paragraph,core/separator,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2837:\"\n
\n
\n\n\n\n
\n
\n

Oceanic Inspiration

\n
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.

\n
\n\n\n\n
\n

No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.

\n
\n
\n\n\n\n
\n
\n\";}i:36;O:8:\"stdClass\":7:{s:2:\"id\";i:196;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Media and text in a full height container\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1484:\"\n
\n
\"Close-up
\n

What’s the problem?

\n\n\n\n

Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.

\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Media and text block with image to the left and text and button to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:79:\"core/button,core/buttons,core/cover,core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2015:\"\n
\n
\"Close-up
\n

What\'s the problem?

\n\n\n\n

Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.

\n\n\n\n\n
\n
\n\";}i:37;O:8:\"stdClass\":7:{s:2:\"id\";i:195;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Media and text with image on the right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:719:\"\n
\n

Shore with Blue Sea

\n\n\n\n

Eleanor Harris (American, 1901-1942)

\n
\"A
\n\n\n\n

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the right and text to the left.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1155:\"\n
\n

Shore with Blue Sea

\n\n\n\n

Eleanor Harris (American, 1901-1942)

\n
\"A
\n\n\n\n

\n\";}i:38;O:8:\"stdClass\":7:{s:2:\"id\";i:192;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Media and text with image on the left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:611:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study

\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the left and text to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:844:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";}i:39;O:8:\"stdClass\":7:{s:2:\"id\";i:186;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with text and a button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1596:\"\n
\n

Overseas:
1500 — 1960

\n\n\n\n
\n
\n

An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in Floor 2.

\n\n\n\n
\n\n
\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:62:\"Large header with background image and text and button on top.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:88:\"core/button,core/buttons,core/column,core/columns,core/cover,core/heading,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2053:\"\n
\n

Overseas:
1500 — 1960

\n\n\n\n
\n
\n

An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in Floor 2.

\n\n\n\n
\n\n
\n
\n\n\n\n
\n
\n
\n\";}i:40;O:8:\"stdClass\":7:{s:2:\"id\";i:185;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with left-aligned text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1388:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:29:\"Cover image with quote on top\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/column,core/columns,core/cover,core/heading,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1698:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";}i:41;O:8:\"stdClass\":7:{s:2:\"id\";i:184;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:7:\"Heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n

We’re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"\n

We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";}i:42;O:8:\"stdClass\":7:{s:2:\"id\";i:29;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:29:\"Two columns of text and title\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1546:\"\n

The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.

\n\n\n\n
\n
\n

They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.

\n
\n\n\n\n
\n

The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband’s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:47:\"Two columns of text preceded by a long heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:52:\"core/column,core/columns,core/heading,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1711:\"\n

The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.

\n\n\n\n
\n
\n

They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.

\n
\n\n\n\n
\n

The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband\'s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.

\n
\n
\n\";}i:43;O:8:\"stdClass\":7:{s:2:\"id\";i:19;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:23:\"Two images side by side\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:571:\"\n\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:41:\"An image gallery with two example images.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:23:\"core/gallery,core/image\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:704:\"\n\n\";}}','off'),(193,'_site_transient_timeout_wp_remote_block_patterns_9777e31ff1d7d0002ae5684e797428b4','1743163419','off'),(194,'_site_transient_wp_remote_block_patterns_9777e31ff1d7d0002ae5684e797428b4','a:13:{i:0;O:8:\"stdClass\":7:{s:2:\"id\";i:207567;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:11:\"Link in Bio\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:6680:\"\n

Patterns

\n\n

Beautifully designed patterns ready to go with a simple copy/paste

\n\n\n
\n\n\n\n\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:116:\"core/button,core/buttons,core/group,core/site-tagline,core/site-title,core/social-link,core/social-links,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2665:\"\n
\n\n\n\n\n
\n\n\n\n\n\n\n\n\n
\n\";}i:1;O:8:\"stdClass\":7:{s:2:\"id\";i:732;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:21:\"Simple call to action\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:991:\"\n
\n
\n\n\n\n

GET IN TOUCH

\n\n\n\n

Schedule a Visit

\n\n\n\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:89:\"A container with a white background. Inside is a centered paragraph, heading, and button.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/button,core/buttons,core/group,core/heading,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"buttons\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1506:\"\n
\n
\n\n\n\n

GET IN TOUCH

\n\n\n\n

Schedule a Visit

\n\n\n\n\n\n\n\n
\n
\n\";}i:2;O:8:\"stdClass\":7:{s:2:\"id\";i:678;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:26:\"Three column pricing table\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3877:\"\n
\n
\n

Single

\n\n\n\n

Enrich our growing community.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for one adult
  • \n\n\n\n
  • One free ticket per special exhibition
  • \n\n\n\n
  • Two single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Family

\n\n\n\n

Support special exhibitions.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Four free tickets per special exhibition
  • \n\n\n\n
  • Four single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Patron

\n\n\n\n

Take support to the next level.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Five free tickets per special exhibition
  • \n\n\n\n
  • Six single-use guest passes per year
  • \n
\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:272:\"Three equal-width columns set up as a pricing table. The left column has a yellow background, the middle column has a light purple background, and the right column has a light blue background. Each column contains a heading, subheading, separator, list, and then a button.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:117:\"core/button,core/buttons,core/column,core/columns,core/heading,core/list,core/list-item,core/paragraph,core/separator\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:6125:\"\n
\n
\n

Single

\n\n\n\n

Enrich our growing community.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for one adult
  • \n\n\n\n
  • One free ticket per special exhibition
  • \n\n\n\n
  • Two single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Family

\n\n\n\n

Support special exhibitions.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Four free tickets per special exhibition
  • \n\n\n\n
  • Four single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Patron

\n\n\n\n

Take support to the next level.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Five free tickets per special exhibition
  • \n\n\n\n
  • Six single-use guest passes per year
  • \n
\n\n\n\n\n
\n
\n\";}i:3;O:8:\"stdClass\":7:{s:2:\"id\";i:669;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:31:\"Image and quote on a background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2293:\"\n
\"\"
\n
\n

Even the bitterest fruit has sugar in it.

\n\n\n\n

– Terry a O’Neal

\n
\n
\n\n\n\n
\"\"
\n
\n

The trees that are slow to grow bear the best fruit.

\n\n\n\n

– Molière

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:221:\"Two media and text blocks. The top one has a pale green background. The text is on the left and contains a quote, and the image is on the right. The next block underneath has the image on the left, and quote on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"images\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2404:\"\n
\"\"
\n
\n

Even the bitterest fruit has sugar in it.

\n\n\n\n

– Terry a O\'Neal

\n
\n
\n\n\n\n
\"\"
\n
\n

The trees that are slow to grow bear the best fruit.

\n\n\n\n

– Molière

\n
\n
\n\";}i:4;O:8:\"stdClass\":7:{s:2:\"id\";i:591;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:5:\"Event\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1750:\"\n
\n
\n

Opening
Party

\n\n\n\n

RSVP

\n
\n
\"\"
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:54:\"core/group,core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1617:\"\n
\n
\n

Opening
Party

\n\n\n\n

RSVP →

\n
\n
\"\"
\n\";}i:5;O:8:\"stdClass\":7:{s:2:\"id\";i:573;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Image on solid color with description\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1933:\"\n
\n
\n
\n
\"\"
\n
\n
\n\n\n\n
\n
\n
\n

Airplane

\n\n\n\n

Copper wire, wood base. I created this piece in late 2008. For this work, I aimed to convey both the industrial heaviness of an airplane, but also the cloudlike floating quality you feel when you’re in one.

\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:38:\"Image on solid color with description.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:61:\"core/column,core/columns,core/cover,core/image,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"images\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1826:\"\n
\n
\n
\n
\"\"
\n
\n
\n\n\n\n
\n
\n
\n

Airplane

\n\n\n\n

Copper wire, wood base. I created this piece in late 2008. For this work, I aimed to convey both the industrial heaviness of an airplane, but also the cloudlike floating quality you feel when you’re in one.

\n
\n
\n
\n
\n\";}i:6;O:8:\"stdClass\":7:{s:2:\"id\";i:526;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:31:\"Offset images with descriptions\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3074:\"\n
\n
\n
\n
\"Beautiful
\n\n\n\n
\n

White Irises

\n\n\n\n

Ogawa Kazumasa

\n
\n
\n
\n\n\n\n
\n
\n
\n
\n\n\n\n

Cherry Blossom

\n\n\n\n

Ogawa Kazumasa

\n
\n\n\n\n
\"Beautiful
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:58:\"Two offset columns with images and titles within each one.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:73:\"core/column,core/columns,core/group,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"gallery\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2930:\"\n
\n
\n
\n
\"Beautiful
\n\n\n\n
\n

White Irises

\n\n\n\n

Ogawa Kazumasa

\n
\n
\n
\n\n\n\n
\n
\n
\n
\n\n\n\n

Cherry Blossom

\n\n\n\n

Ogawa Kazumasa

\n
\n\n\n\n
\"Beautiful
\n
\n
\n
\n\";}i:7;O:8:\"stdClass\":7:{s:2:\"id\";i:521;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:45:\"Image with description below and to the right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1729:\"\n
\n
\n\n\n\n
\n
\"Vintage
\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Cupid in Flight
48” x 48” Giclee print on archival paper.

\n
\n
\n\n\n\n

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:46:\"Image with description below and to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:50:\"core/column,core/columns,core/image,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1241:\"\n
\n
\n\n\n\n
\n
\"Vintage
\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Cupid in Flight
48” x 48” Giclee print on archival paper.

\n
\n
\n\n\n\n

\n\";}i:8;O:8:\"stdClass\":7:{s:2:\"id\";i:502;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:13:\"Event details\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1719:\"\n
\"Image
\n\n\n\n
\n
\n

Location:
82 Main St. Brooklyn, NY

\n
\n\n\n\n
\n

Date:
October 24, 2021

\n
\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:14:\"Event details.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/button,core/buttons,core/column,core/columns,core/image,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1642:\"\n
\"Image
\n\n\n\n
\n
\n

Location:
82 Main St. Brooklyn, NY

\n
\n\n\n\n
\n

Date:
October 24, 2021

\n
\n\n\n\n\n
\n\";}i:9;O:8:\"stdClass\":7:{s:2:\"id\";i:199;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Three columns with images and text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3604:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man’s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Three columns with images and text, with vertical spacing for an offset look.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:86:\"core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:4:{i:0;s:7:\"columns\";i:1;s:7:\"gallery\";i:2;s:6:\"images\";i:3;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:5124:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man\'s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";}i:10;O:8:\"stdClass\":7:{s:2:\"id\";i:192;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Media and text with image on the left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:611:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study

\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the left and text to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:844:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";}i:11;O:8:\"stdClass\":7:{s:2:\"id\";i:185;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with left-aligned text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1388:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:29:\"Cover image with quote on top\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/column,core/columns,core/cover,core/heading,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1698:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";}i:12;O:8:\"stdClass\":7:{s:2:\"id\";i:184;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:7:\"Heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n

We’re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"\n

We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";}}','off'),(203,'category_children','a:0:{}','auto'),(231,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1747384736;s:7:\"checked\";a:15:{s:12:\"twentyeleven\";s:3:\"4.9\";s:13:\"twentyfifteen\";s:3:\"4.0\";s:14:\"twentyfourteen\";s:3:\"4.2\";s:14:\"twentynineteen\";s:3:\"3.1\";s:15:\"twentyseventeen\";s:3:\"3.9\";s:13:\"twentysixteen\";s:3:\"3.5\";s:9:\"twentyten\";s:3:\"4.4\";s:14:\"twentythirteen\";s:3:\"4.4\";s:12:\"twentytwelve\";s:3:\"4.5\";s:12:\"twentytwenty\";s:3:\"2.9\";s:16:\"twentytwentyfive\";s:3:\"1.2\";s:16:\"twentytwentyfour\";s:3:\"1.3\";s:15:\"twentytwentyone\";s:3:\"2.5\";s:17:\"twentytwentythree\";s:3:\"1.6\";s:15:\"twentytwentytwo\";s:3:\"2.0\";}s:8:\"response\";a:0:{}s:9:\"no_update\";a:15:{s:12:\"twentyeleven\";a:6:{s:5:\"theme\";s:12:\"twentyeleven\";s:11:\"new_version\";s:3:\"4.9\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentyeleven/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentyeleven.4.9.zip\";s:8:\"requires\";s:3:\"3.2\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:13:\"twentyfifteen\";a:6:{s:5:\"theme\";s:13:\"twentyfifteen\";s:11:\"new_version\";s:3:\"4.0\";s:3:\"url\";s:43:\"https://wordpress.org/themes/twentyfifteen/\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/theme/twentyfifteen.4.0.zip\";s:8:\"requires\";s:3:\"4.1\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:14:\"twentyfourteen\";a:6:{s:5:\"theme\";s:14:\"twentyfourteen\";s:11:\"new_version\";s:3:\"4.2\";s:3:\"url\";s:44:\"https://wordpress.org/themes/twentyfourteen/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/twentyfourteen.4.2.zip\";s:8:\"requires\";s:3:\"3.6\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:14:\"twentynineteen\";a:6:{s:5:\"theme\";s:14:\"twentynineteen\";s:11:\"new_version\";s:3:\"3.1\";s:3:\"url\";s:44:\"https://wordpress.org/themes/twentynineteen/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/twentynineteen.3.1.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:15:\"twentyseventeen\";a:6:{s:5:\"theme\";s:15:\"twentyseventeen\";s:11:\"new_version\";s:3:\"3.9\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentyseventeen/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentyseventeen.3.9.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:13:\"twentysixteen\";a:6:{s:5:\"theme\";s:13:\"twentysixteen\";s:11:\"new_version\";s:3:\"3.5\";s:3:\"url\";s:43:\"https://wordpress.org/themes/twentysixteen/\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/theme/twentysixteen.3.5.zip\";s:8:\"requires\";s:3:\"4.4\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:9:\"twentyten\";a:6:{s:5:\"theme\";s:9:\"twentyten\";s:11:\"new_version\";s:3:\"4.4\";s:3:\"url\";s:39:\"https://wordpress.org/themes/twentyten/\";s:7:\"package\";s:55:\"https://downloads.wordpress.org/theme/twentyten.4.4.zip\";s:8:\"requires\";s:3:\"3.0\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:14:\"twentythirteen\";a:6:{s:5:\"theme\";s:14:\"twentythirteen\";s:11:\"new_version\";s:3:\"4.4\";s:3:\"url\";s:44:\"https://wordpress.org/themes/twentythirteen/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/twentythirteen.4.4.zip\";s:8:\"requires\";s:3:\"3.6\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:12:\"twentytwelve\";a:6:{s:5:\"theme\";s:12:\"twentytwelve\";s:11:\"new_version\";s:3:\"4.5\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentytwelve/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentytwelve.4.5.zip\";s:8:\"requires\";s:3:\"3.5\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:12:\"twentytwenty\";a:6:{s:5:\"theme\";s:12:\"twentytwenty\";s:11:\"new_version\";s:3:\"2.9\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentytwenty/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentytwenty.2.9.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:16:\"twentytwentyfive\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfive\";s:11:\"new_version\";s:3:\"1.2\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfive/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfive.1.2.zip\";s:8:\"requires\";s:3:\"6.7\";s:12:\"requires_php\";s:3:\"7.2\";}s:16:\"twentytwentyfour\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfour\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfour/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfour.1.3.zip\";s:8:\"requires\";s:3:\"6.4\";s:12:\"requires_php\";s:3:\"7.0\";}s:15:\"twentytwentyone\";a:6:{s:5:\"theme\";s:15:\"twentytwentyone\";s:11:\"new_version\";s:3:\"2.5\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentyone/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentyone.2.5.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.6\";}s:17:\"twentytwentythree\";a:6:{s:5:\"theme\";s:17:\"twentytwentythree\";s:11:\"new_version\";s:3:\"1.6\";s:3:\"url\";s:47:\"https://wordpress.org/themes/twentytwentythree/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/theme/twentytwentythree.1.6.zip\";s:8:\"requires\";s:3:\"6.1\";s:12:\"requires_php\";s:3:\"5.6\";}s:15:\"twentytwentytwo\";a:6:{s:5:\"theme\";s:15:\"twentytwentytwo\";s:11:\"new_version\";s:3:\"2.0\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentytwo/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentytwo.2.0.zip\";s:8:\"requires\";s:3:\"5.9\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','off'),(232,'_site_transient_timeout_wp_theme_files_patterns-66299d9a5412abf2007e79a740a3d4ab','1743163869','off'),(233,'_site_transient_wp_theme_files_patterns-66299d9a5412abf2007e79a740a3d4ab','a:2:{s:7:\"version\";s:3:\"1.0\";s:8:\"patterns\";a:98:{s:21:\"banner-about-book.php\";a:4:{s:5:\"title\";s:28:\"Banner with book description\";s:4:\"slug\";s:34:\"twentytwentyfive/banner-about-book\";s:11:\"description\";s:66:\"Banner with book description and accompanying image for promotion.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:28:\"banner-cover-big-heading.php\";a:4:{s:5:\"title\";s:22:\"Cover with big heading\";s:4:\"slug\";s:41:\"twentytwentyfive/banner-cover-big-heading\";s:11:\"description\";s:82:\"A full-width cover section with a large background image and an oversized heading.\";s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}}s:22:\"banner-intro-image.php\";a:4:{s:5:\"title\";s:49:\"Short heading and paragraph and image on the left\";s:4:\"slug\";s:35:\"twentytwentyfive/banner-intro-image\";s:11:\"description\";s:68:\"A Intro pattern with Short heading, paragraph and image on the left.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}}s:16:\"banner-intro.php\";a:4:{s:5:\"title\";s:35:\"Intro with left-aligned description\";s:4:\"slug\";s:29:\"twentytwentyfive/banner-intro\";s:11:\"description\";s:66:\"A large left-aligned heading with a brand name emphasized in bold.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:17:\"banner-poster.php\";a:4:{s:5:\"title\";s:19:\"Poster-like section\";s:4:\"slug\";s:30:\"twentytwentyfive/banner-poster\";s:11:\"description\";s:78:\"A section that can be used as a banner or a landing page to announce an event.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:5:\"media\";}}s:43:\"banner-with-description-and-images-grid.php\";a:4:{s:5:\"title\";s:39:\"Banner with description and images grid\";s:4:\"slug\";s:47:\"twentytwentyfive/banner-description-images-grid\";s:11:\"description\";s:75:\"A banner with a short paragraph, and two images displayed in a grid layout.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}}s:18:\"binding-format.php\";a:4:{s:5:\"title\";s:16:\"Post format name\";s:4:\"slug\";s:31:\"twentytwentyfive/binding-format\";s:11:\"description\";s:75:\"Prints the name of the post format with the help of the Block Bindings API.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:12:\"comments.php\";a:5:{s:5:\"title\";s:8:\"Comments\";s:4:\"slug\";s:25:\"twentytwentyfive/comments\";s:11:\"description\";s:63:\"Comments area with comments list, pagination, and comment form.\";s:10:\"categories\";a:1:{i:0;s:4:\"text\";}s:10:\"blockTypes\";a:1:{i:0;s:13:\"core/comments\";}}s:32:\"contact-centered-social-link.php\";a:5:{s:5:\"title\";s:30:\"Centered link and social links\";s:4:\"slug\";s:45:\"twentytwentyfive/contact-centered-social-link\";s:11:\"description\";s:73:\"Centered contact section with a prominent message and social media links.\";s:10:\"categories\";a:1:{i:0;s:7:\"contact\";}s:8:\"keywords\";a:3:{i:0;s:7:\"contact\";i:1;s:3:\"faq\";i:2;s:9:\"questions\";}}s:26:\"contact-info-locations.php\";a:6:{s:5:\"title\";s:27:\"Contact, info and locations\";s:4:\"slug\";s:39:\"twentytwentyfive/contact-info-locations\";s:11:\"description\";s:78:\"Contact section with social media links, email, and multiple location details.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:7:\"contact\";}s:8:\"keywords\";a:2:{i:0;s:7:\"contact\";i:1;s:8:\"location\";}}s:29:\"contact-location-and-link.php\";a:4:{s:5:\"title\";s:25:\"Contact location and link\";s:4:\"slug\";s:42:\"twentytwentyfive/contact-location-and-link\";s:11:\"description\";s:89:\"Contact section with a location address, a directions link, and an image of the location.\";s:10:\"categories\";a:2:{i:0;s:7:\"contact\";i:1;s:8:\"featured\";}}s:18:\"cta-book-links.php\";a:4:{s:5:\"title\";s:30:\"Call to action with book links\";s:4:\"slug\";s:31:\"twentytwentyfive/cta-book-links\";s:11:\"description\";s:74:\"A call to action section with links to get the book in different websites.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:22:\"cta-book-locations.php\";a:4:{s:5:\"title\";s:29:\"Call to action with locations\";s:4:\"slug\";s:35:\"twentytwentyfive/cta-book-locations\";s:11:\"description\";s:82:\"A call to action section with links to get the book in the most popular locations.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:24:\"cta-centered-heading.php\";a:4:{s:5:\"title\";s:16:\"Centered heading\";s:4:\"slug\";s:37:\"twentytwentyfive/cta-centered-heading\";s:11:\"description\";s:53:\"A hero with a centered heading, paragraph and button.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:19:\"cta-events-list.php\";a:4:{s:5:\"title\";s:11:\"Events list\";s:4:\"slug\";s:32:\"twentytwentyfive/cta-events-list\";s:11:\"description\";s:37:\"A list of events with call to action.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:26:\"cta-grid-products-link.php\";a:5:{s:5:\"title\";s:54:\"Call to action with grid layout with products and link\";s:4:\"slug\";s:39:\"twentytwentyfive/cta-grid-products-link\";s:11:\"description\";s:42:\"A call to action featuring product images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"featured\";}}s:22:\"cta-heading-search.php\";a:4:{s:5:\"title\";s:23:\"Heading and search form\";s:4:\"slug\";s:35:\"twentytwentyfive/cta-heading-search\";s:11:\"description\";s:54:\"Large heading with a search form for quick navigation.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:18:\"cta-newsletter.php\";a:5:{s:5:\"title\";s:18:\"Newsletter sign-up\";s:4:\"slug\";s:31:\"twentytwentyfive/cta-newsletter\";s:11:\"description\";s:0:\"\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}s:8:\"keywords\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:10:\"newsletter\";}}s:15:\"event-3-col.php\";a:5:{s:5:\"title\";s:46:\"Events, 3 columns with event images and titles\";s:4:\"slug\";s:28:\"twentytwentyfive/event-3-col\";s:11:\"description\";s:95:\"A header with title and text and three columns that show 3 events with their images and titles.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:6:\"events\";i:1;s:7:\"columns\";i:2;s:6:\"images\";}}s:14:\"event-rsvp.php\";a:7:{s:5:\"title\";s:10:\"Event RSVP\";s:4:\"slug\";s:27:\"twentytwentyfive/event-rsvp\";s:11:\"description\";s:64:\"RSVP for an upcoming event with a cover image and event details.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}s:8:\"keywords\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:4:\"rsvp\";i:2;s:5:\"event\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:18:\"event-schedule.php\";a:5:{s:5:\"title\";s:14:\"Event schedule\";s:4:\"slug\";s:31:\"twentytwentyfive/event-schedule\";s:11:\"description\";s:54:\"A section with specified dates and times for an event.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}s:8:\"keywords\";a:4:{i:0;s:6:\"events\";i:1;s:6:\"agenda\";i:2;s:8:\"schedule\";i:3;s:8:\"lectures\";}}s:19:\"footer-centered.php\";a:5:{s:5:\"title\";s:15:\"Centered footer\";s:4:\"slug\";s:32:\"twentytwentyfive/footer-centered\";s:11:\"description\";s:44:\"Footer with centered site title and tagline.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:18:\"footer-columns.php\";a:5:{s:5:\"title\";s:19:\"Footer with columns\";s:4:\"slug\";s:31:\"twentytwentyfive/footer-columns\";s:11:\"description\";s:45:\"Footer columns with title, tagline and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:21:\"footer-newsletter.php\";a:5:{s:5:\"title\";s:29:\"Footer with newsletter signup\";s:4:\"slug\";s:34:\"twentytwentyfive/footer-newsletter\";s:11:\"description\";s:51:\"Footer with large site title and newsletter signup.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:17:\"footer-social.php\";a:5:{s:5:\"title\";s:33:\"Centered footer with social links\";s:4:\"slug\";s:30:\"twentytwentyfive/footer-social\";s:11:\"description\";s:49:\"Footer with centered site title and social links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:10:\"footer.php\";a:5:{s:5:\"title\";s:6:\"Footer\";s:4:\"slug\";s:23:\"twentytwentyfive/footer\";s:11:\"description\";s:51:\"Footer columns with logo, title, tagline and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:16:\"format-audio.php\";a:4:{s:5:\"title\";s:12:\"Audio format\";s:4:\"slug\";s:29:\"twentytwentyfive/format-audio\";s:11:\"description\";s:73:\"An audio post format with an image, title, audio player, and description.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:15:\"format-link.php\";a:4:{s:5:\"title\";s:11:\"Link format\";s:4:\"slug\";s:28:\"twentytwentyfive/format-link\";s:11:\"description\";s:77:\"A link post format with a description and an emphasized link for key content.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:15:\"grid-videos.php\";a:4:{s:5:\"title\";s:16:\"Grid with videos\";s:4:\"slug\";s:28:\"twentytwentyfive/grid-videos\";s:11:\"description\";s:19:\"A grid with videos.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}}s:24:\"grid-with-categories.php\";a:5:{s:5:\"title\";s:20:\"Grid with categories\";s:4:\"slug\";s:37:\"twentytwentyfive/grid-with-categories\";s:11:\"description\";s:41:\"A grid section with different categories.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:19:\"header-centered.php\";a:5:{s:5:\"title\";s:15:\"Centered header\";s:4:\"slug\";s:32:\"twentytwentyfive/header-centered\";s:11:\"description\";s:47:\"Header with centered site title and navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:18:\"header-columns.php\";a:5:{s:5:\"title\";s:19:\"Header with columns\";s:4:\"slug\";s:31:\"twentytwentyfive/header-columns\";s:11:\"description\";s:49:\"Header with site title and navigation in columns.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:22:\"header-large-title.php\";a:5:{s:5:\"title\";s:23:\"Header with large title\";s:4:\"slug\";s:35:\"twentytwentyfive/header-large-title\";s:11:\"description\";s:58:\"Header with large site title and right-aligned navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:10:\"header.php\";a:5:{s:5:\"title\";s:6:\"Header\";s:4:\"slug\";s:23:\"twentytwentyfive/header\";s:11:\"description\";s:38:\"Header with site title and navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:36:\"heading-and-paragraph-with-image.php\";a:4:{s:5:\"title\";s:45:\"Heading and paragraph with image on the right\";s:4:\"slug\";s:49:\"twentytwentyfive/heading-and-paragraph-with-image\";s:11:\"description\";s:89:\"A two-column section with a heading and paragraph on the left, and an image on the right.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}}s:13:\"hero-book.php\";a:5:{s:5:\"title\";s:9:\"Hero book\";s:4:\"slug\";s:26:\"twentytwentyfive/hero-book\";s:11:\"description\";s:66:\"A hero section for the book with a description and pre-order link.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:7:\"podcast\";i:1;s:4:\"hero\";i:2;s:7:\"stories\";}}s:25:\"hero-full-width-image.php\";a:4:{s:5:\"title\";s:22:\"Hero, full width image\";s:4:\"slug\";s:38:\"twentytwentyfive/hero-full-width-image\";s:11:\"description\";s:68:\"A hero with a full width image, heading, short paragraph and button.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:41:\"hero-overlapped-book-cover-with-links.php\";a:4:{s:5:\"title\";s:38:\"Hero, overlapped book cover with links\";s:4:\"slug\";s:54:\"twentytwentyfive/hero-overlapped-book-cover-with-links\";s:11:\"description\";s:47:\"A hero with an overlapped book cover and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:16:\"hero-podcast.php\";a:5:{s:5:\"title\";s:12:\"Hero podcast\";s:4:\"slug\";s:29:\"twentytwentyfive/hero-podcast\";s:11:\"description\";s:0:\"\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:7:\"podcast\";i:1;s:4:\"hero\";i:2;s:7:\"stories\";}}s:14:\"hidden-404.php\";a:4:{s:5:\"title\";s:3:\"404\";s:4:\"slug\";s:27:\"twentytwentyfive/hidden-404\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:23:\"hidden-blog-heading.php\";a:4:{s:5:\"title\";s:19:\"Hidden blog heading\";s:4:\"slug\";s:36:\"twentytwentyfive/hidden-blog-heading\";s:11:\"description\";s:52:\"Hidden heading for the home page and index template.\";s:8:\"inserter\";b:0;}s:17:\"hidden-search.php\";a:4:{s:5:\"title\";s:6:\"Search\";s:4:\"slug\";s:30:\"twentytwentyfive/hidden-search\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:18:\"hidden-sidebar.php\";a:4:{s:5:\"title\";s:7:\"Sidebar\";s:4:\"slug\";s:31:\"twentytwentyfive/hidden-sidebar\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:21:\"hidden-written-by.php\";a:4:{s:5:\"title\";s:10:\"Written by\";s:4:\"slug\";s:34:\"twentytwentyfive/hidden-written-by\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:9:\"logos.php\";a:4:{s:5:\"title\";s:5:\"Logos\";s:4:\"slug\";s:22:\"twentytwentyfive/logos\";s:11:\"description\";s:77:\"Showcasing the podcast\'s clients with a heading and a series of client logos.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:24:\"media-instagram-grid.php\";a:5:{s:5:\"title\";s:14:\"Instagram grid\";s:4:\"slug\";s:37:\"twentytwentyfive/media-instagram-grid\";s:11:\"description\";s:62:\"A grid section with photos and a link to an Instagram profile.\";s:13:\"viewportWidth\";i:1440;s:10:\"categories\";a:3:{i:0;s:5:\"media\";i:1;s:7:\"gallery\";i:2;s:8:\"featured\";}}s:14:\"more-posts.php\";a:5:{s:5:\"title\";s:10:\"More posts\";s:4:\"slug\";s:27:\"twentytwentyfive/more-posts\";s:11:\"description\";s:45:\"Displays a list of posts with title and date.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:21:\"overlapped-images.php\";a:4:{s:5:\"title\";s:41:\"Overlapping images and paragraph on right\";s:4:\"slug\";s:34:\"twentytwentyfive/overlapped-images\";s:11:\"description\";s:53:\"A section with overlapping images, and a description.\";s:10:\"categories\";a:2:{i:0;s:5:\"about\";i:1;s:8:\"featured\";}}s:22:\"page-business-home.php\";a:8:{s:5:\"title\";s:17:\"Business homepage\";s:4:\"slug\";s:35:\"twentytwentyfive/page-business-home\";s:11:\"description\";s:28:\"A business homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:20:\"page-coming-soon.php\";a:8:{s:5:\"title\";s:11:\"Coming soon\";s:4:\"slug\";s:33:\"twentytwentyfive/page-coming-soon\";s:11:\"description\";s:96:\"A full-width cover banner that can be applied to a page or it can work as a single landing page.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:15:\"page-cv-bio.php\";a:7:{s:5:\"title\";s:6:\"CV/bio\";s:4:\"slug\";s:28:\"twentytwentyfive/page-cv-bio\";s:11:\"description\";s:36:\"A pattern for a CV/Bio landing page.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:21:\"page-landing-book.php\";a:8:{s:5:\"title\";s:21:\"Landing page for book\";s:4:\"slug\";s:34:\"twentytwentyfive/page-landing-book\";s:11:\"description\";s:104:\"A landing page for the book with a hero section, pre-order links, locations, FAQs and newsletter signup.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:22:\"page-landing-event.php\";a:8:{s:5:\"title\";s:22:\"Landing page for event\";s:4:\"slug\";s:35:\"twentytwentyfive/page-landing-event\";s:11:\"description\";s:87:\"A landing page for the event with a hero section, description, FAQs and call to action.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:24:\"page-landing-podcast.php\";a:8:{s:5:\"title\";s:24:\"Landing page for podcast\";s:4:\"slug\";s:37:\"twentytwentyfive/page-landing-podcast\";s:11:\"description\";s:111:\"A landing page for the podcast with a hero section, description, logos, grid with videos and newsletter signup.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:50:\"page-link-in-bio-heading-paragraph-links-image.php\";a:7:{s:5:\"title\";s:59:\"Link in bio heading, paragraph, links and full-height image\";s:4:\"slug\";s:63:\"twentytwentyfive/page-link-in-bio-heading-paragraph-links-image\";s:11:\"description\";s:84:\"A link in bio landing page with a heading, paragraph, links and a full height image.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:33:\"page-link-in-bio-wide-margins.php\";a:7:{s:5:\"title\";s:48:\"Link in bio with profile, links and wide margins\";s:4:\"slug\";s:46:\"twentytwentyfive/page-link-in-bio-wide-margins\";s:11:\"description\";s:86:\"A link in bio landing page with social links, a profile photo and a brief description.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:39:\"page-link-in-bio-with-tight-margins.php\";a:8:{s:5:\"title\";s:30:\"Link in bio with tight margins\";s:4:\"slug\";s:52:\"twentytwentyfive/page-link-in-bio-with-tight-margins\";s:11:\"description\";s:90:\"A full-width, full-height link in bio section with an image, a paragraph and social links.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:23:\"page-portfolio-home.php\";a:8:{s:5:\"title\";s:18:\"Portfolio homepage\";s:4:\"slug\";s:36:\"twentytwentyfive/page-portfolio-home\";s:11:\"description\";s:29:\"A portfolio homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:5:\"posts\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:18:\"page-shop-home.php\";a:8:{s:5:\"title\";s:13:\"Shop homepage\";s:4:\"slug\";s:31:\"twentytwentyfive/page-shop-home\";s:11:\"description\";s:24:\"A shop homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfive_page\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:19:\"post-navigation.php\";a:5:{s:5:\"title\";s:15:\"Post navigation\";s:4:\"slug\";s:32:\"twentytwentyfive/post-navigation\";s:11:\"description\";s:29:\"Next and previous post links.\";s:10:\"categories\";a:1:{i:0;s:4:\"text\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/post-navigation-link\";}}s:17:\"pricing-2-col.php\";a:5:{s:5:\"title\";s:18:\"Pricing, 2 columns\";s:4:\"slug\";s:30:\"twentytwentyfive/pricing-2-col\";s:11:\"description\";s:88:\"Pricing section with two columns, pricing plan, description, and call-to-action buttons.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:17:\"pricing-3-col.php\";a:4:{s:5:\"title\";s:18:\"Pricing, 3 columns\";s:4:\"slug\";s:30:\"twentytwentyfive/pricing-3-col\";s:11:\"description\";s:100:\"A three-column boxed pricing table designed to showcase services, descriptions, and pricing options.\";s:10:\"categories\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";i:2;s:8:\"services\";}}s:18:\"services-3-col.php\";a:4:{s:5:\"title\";s:19:\"Services, 3 columns\";s:4:\"slug\";s:31:\"twentytwentyfive/services-3-col\";s:11:\"description\";s:56:\"Three columns with images and text to showcase services.\";s:10:\"categories\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";i:2;s:8:\"services\";}}s:36:\"services-subscriber-only-section.php\";a:4:{s:5:\"title\";s:33:\"Services, subscriber only section\";s:4:\"slug\";s:49:\"twentytwentyfive/services-subscriber-only-section\";s:11:\"description\";s:72:\"A subscriber-only section highlighting exclusive services and offerings.\";s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"services\";}}s:24:\"services-team-photos.php\";a:4:{s:5:\"title\";s:21:\"Services, team photos\";s:4:\"slug\";s:37:\"twentytwentyfive/services-team-photos\";s:11:\"description\";s:59:\"Display team photos in a services section with grid layout.\";s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";i:2;s:8:\"featured\";}}s:37:\"template-404-vertical-header-blog.php\";a:5:{s:5:\"title\";s:23:\"Right-aligned blog, 404\";s:4:\"slug\";s:50:\"twentytwentyfive/template-404-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:3:\"404\";}}s:30:\"template-archive-news-blog.php\";a:6:{s:5:\"title\";s:17:\"News blog archive\";s:4:\"slug\";s:43:\"twentytwentyfive/template-archive-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:31:\"template-archive-photo-blog.php\";a:6:{s:5:\"title\";s:18:\"Photo blog archive\";s:4:\"slug\";s:44:\"twentytwentyfive/template-archive-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:30:\"template-archive-text-blog.php\";a:6:{s:5:\"title\";s:23:\"Text-only blog, archive\";s:4:\"slug\";s:43:\"twentytwentyfive/template-archive-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:41:\"template-archive-vertical-header-blog.php\";a:6:{s:5:\"title\";s:34:\"Archive for the right-aligned blog\";s:4:\"slug\";s:54:\"twentytwentyfive/template-archive-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:27:\"template-home-news-blog.php\";a:6:{s:5:\"title\";s:14:\"News blog home\";s:4:\"slug\";s:40:\"twentytwentyfive/template-home-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:28:\"template-home-photo-blog.php\";a:6:{s:5:\"title\";s:15:\"Photo blog home\";s:4:\"slug\";s:41:\"twentytwentyfive/template-home-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:38:\"template-home-posts-grid-news-blog.php\";a:5:{s:5:\"title\";s:34:\"News blog with featured posts grid\";s:4:\"slug\";s:51:\"twentytwentyfive/template-home-posts-grid-news-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:27:\"template-home-text-blog.php\";a:6:{s:5:\"title\";s:20:\"Text-only blog, home\";s:4:\"slug\";s:40:\"twentytwentyfive/template-home-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:10:\"front-page\";i:1;s:4:\"home\";}}s:38:\"template-home-vertical-header-blog.php\";a:6:{s:5:\"title\";s:31:\"Homepage for right-aligned blog\";s:4:\"slug\";s:51:\"twentytwentyfive/template-home-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:40:\"template-home-with-sidebar-news-blog.php\";a:6:{s:5:\"title\";s:22:\"News blog with sidebar\";s:4:\"slug\";s:53:\"twentytwentyfive/template-home-with-sidebar-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:28:\"template-page-photo-blog.php\";a:5:{s:5:\"title\";s:15:\"Photo blog page\";s:4:\"slug\";s:41:\"twentytwentyfive/template-page-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:4:\"page\";}}s:38:\"template-page-vertical-header-blog.php\";a:5:{s:5:\"title\";s:40:\"Page template for the right-aligned blog\";s:4:\"slug\";s:51:\"twentytwentyfive/template-page-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:4:\"page\";}}s:33:\"template-query-loop-news-blog.php\";a:4:{s:5:\"title\";s:20:\"News blog query loop\";s:4:\"slug\";s:46:\"twentytwentyfive/template-query-loop-news-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:34:\"template-query-loop-photo-blog.php\";a:6:{s:5:\"title\";s:16:\"Photo blog posts\";s:4:\"slug\";s:47:\"twentytwentyfive/template-query-loop-photo-blog\";s:11:\"description\";s:54:\"A list of posts, 3 columns, with only featured images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:33:\"template-query-loop-text-blog.php\";a:4:{s:5:\"title\";s:21:\"Text-only blog, posts\";s:4:\"slug\";s:46:\"twentytwentyfive/template-query-loop-text-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:44:\"template-query-loop-vertical-header-blog.php\";a:4:{s:5:\"title\";s:19:\"Right-aligned posts\";s:4:\"slug\";s:57:\"twentytwentyfive/template-query-loop-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:23:\"template-query-loop.php\";a:5:{s:5:\"title\";s:23:\"List of posts, 1 column\";s:4:\"slug\";s:36:\"twentytwentyfive/template-query-loop\";s:11:\"description\";s:61:\"A list of posts, 1 column, with featured image and post date.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:29:\"template-search-news-blog.php\";a:6:{s:5:\"title\";s:24:\"News blog search results\";s:4:\"slug\";s:42:\"twentytwentyfive/template-search-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:30:\"template-search-photo-blog.php\";a:6:{s:5:\"title\";s:25:\"Photo blog search results\";s:4:\"slug\";s:43:\"twentytwentyfive/template-search-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:29:\"template-search-text-blog.php\";a:6:{s:5:\"title\";s:22:\"Text-only blog, search\";s:4:\"slug\";s:42:\"twentytwentyfive/template-search-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:40:\"template-search-vertical-header-blog.php\";a:6:{s:5:\"title\";s:26:\"Right-aligned blog, search\";s:4:\"slug\";s:53:\"twentytwentyfive/template-search-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:40:\"template-single-left-aligned-content.php\";a:6:{s:5:\"title\";s:30:\"Post with left-aligned content\";s:4:\"slug\";s:47:\"twentytwentyfive/post-with-left-aligned-content\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:29:\"template-single-news-blog.php\";a:6:{s:5:\"title\";s:34:\"News blog single post with sidebar\";s:4:\"slug\";s:42:\"twentytwentyfive/template-single-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:26:\"template-single-offset.php\";a:6:{s:5:\"title\";s:34:\"Offset post without featured image\";s:4:\"slug\";s:39:\"twentytwentyfive/template-single-offset\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:30:\"template-single-photo-blog.php\";a:6:{s:5:\"title\";s:22:\"Photo blog single post\";s:4:\"slug\";s:43:\"twentytwentyfive/template-single-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:29:\"template-single-text-blog.php\";a:6:{s:5:\"title\";s:27:\"Text-only blog, single post\";s:4:\"slug\";s:42:\"twentytwentyfive/template-single-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:40:\"template-single-vertical-header-blog.php\";a:6:{s:5:\"title\";s:25:\"Right-aligned single post\";s:4:\"slug\";s:53:\"twentytwentyfive/template-single-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:22:\"testimonials-2-col.php\";a:5:{s:5:\"title\";s:21:\"2 columns with avatar\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-2-col\";s:11:\"description\";s:42:\"Two columns with testimonials and avatars.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:22:\"testimonials-6-col.php\";a:5:{s:5:\"title\";s:35:\"3 column layout with 6 testimonials\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-6-col\";s:11:\"description\";s:86:\"A section with three columns and two rows, each containing a testimonial and citation.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:22:\"testimonials-large.php\";a:5:{s:5:\"title\";s:32:\"Review with large image on right\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-large\";s:11:\"description\";s:46:\"A testimonial with a large image on the right.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:13:\"text-faqs.php\";a:6:{s:5:\"title\";s:4:\"FAQs\";s:4:\"slug\";s:26:\"twentytwentyfive/text-faqs\";s:11:\"description\";s:68:\"A FAQs section with a FAQ heading and list of questions and answers.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:4:\"text\";i:1;s:5:\"about\";}s:8:\"keywords\";a:5:{i:0;s:3:\"faq\";i:1;s:5:\"about\";i:2;s:10:\"frequently\";i:3;s:5:\"asked\";i:4;s:9:\"questions\";}}s:19:\"vertical-header.php\";a:6:{s:5:\"title\";s:15:\"Vertical header\";s:4:\"slug\";s:32:\"twentytwentyfive/vertical-header\";s:11:\"description\";s:46:\"Vertical Header with site title and navigation\";s:13:\"viewportWidth\";i:300;s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:34:\"core/template-part/vertical-header\";}}}}','off'),(235,'new_admin_email','dev-email@wpengine.local','auto'),(236,'adminhash','a:2:{s:4:\"hash\";s:32:\"0b0afbbdf480cfc1e242b81e5ba23c3d\";s:8:\"newemail\";s:21:\"wordpress@example.com\";}','off'),(250,'_site_transient_update_plugins','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1747384735;s:8:\"response\";a:1:{s:37:\"advanced-custom-fields-6.3.12/acf.php\";O:8:\"stdClass\":11:{s:4:\"slug\";s:22:\"advanced-custom-fields\";s:6:\"plugin\";s:37:\"advanced-custom-fields-6.3.12/acf.php\";s:11:\"new_version\";s:5:\"6.4.1\";s:3:\"url\";s:36:\"https://www.advancedcustomfields.com\";s:6:\"tested\";s:5:\"6.8.1\";s:7:\"package\";s:276:\"https://connect.advancedcustomfields.com/v2/plugins/download?p=acf&s=plugin&version=6.4.1&token=eyJwIjoiYWNmIiwiayI6ZmFsc2UsIndwX3VybCI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4ODg4Iiwid3BfdmVyc2lvbiI6IjYuOC4xIiwid3BfbXVsdGlzaXRlIjowLCJwaHBfdmVyc2lvbiI6IjcuNC4zMyIsImJsb2NrX2NvdW50IjowfQ==\";s:5:\"icons\";a:1:{s:7:\"default\";s:64:\"https://connect.advancedcustomfields.com/assets/icon-256x256.png\";}s:7:\"banners\";a:2:{s:3:\"low\";s:66:\"https://connect.advancedcustomfields.com/assets/banner-772x250.jpg\";s:4:\"high\";s:67:\"https://connect.advancedcustomfields.com/assets/banner-1544x500.jpg\";}s:8:\"requires\";s:3:\"6.0\";s:12:\"requires_php\";s:3:\"7.4\";s:12:\"release_date\";s:8:\"20250508\";}}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:3:{s:9:\"hello.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/hello-dolly\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:5:\"1.7.2\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/hello-dolly.1.7.3.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-256x256.jpg?rev=2052855\";s:2:\"1x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-128x128.jpg?rev=2052855\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/hello-dolly/assets/banner-1544x500.jpg?rev=2645582\";s:2:\"1x\";s:66:\"https://ps.w.org/hello-dolly/assets/banner-772x250.jpg?rev=2052855\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"4.6\";}s:25:\"wp-graphql/wp-graphql.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:24:\"w.org/plugins/wp-graphql\";s:4:\"slug\";s:10:\"wp-graphql\";s:6:\"plugin\";s:25:\"wp-graphql/wp-graphql.php\";s:11:\"new_version\";s:5:\"2.3.0\";s:3:\"url\";s:41:\"https://wordpress.org/plugins/wp-graphql/\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/plugin/wp-graphql.2.3.0.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:63:\"https://ps.w.org/wp-graphql/assets/icon-256x256.png?rev=3111985\";s:2:\"1x\";s:63:\"https://ps.w.org/wp-graphql/assets/icon-128x128.png?rev=3111985\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:66:\"https://ps.w.org/wp-graphql/assets/banner-1544x500.png?rev=3111985\";s:2:\"1x\";s:65:\"https://ps.w.org/wp-graphql/assets/banner-772x250.png?rev=3111985\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"6.0\";}s:31:\"wpgraphql-acf/wpgraphql-acf.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:27:\"w.org/plugins/wpgraphql-acf\";s:4:\"slug\";s:13:\"wpgraphql-acf\";s:6:\"plugin\";s:31:\"wpgraphql-acf/wpgraphql-acf.php\";s:11:\"new_version\";s:5:\"2.4.1\";s:3:\"url\";s:44:\"https://wordpress.org/plugins/wpgraphql-acf/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/plugin/wpgraphql-acf.2.4.1.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:66:\"https://ps.w.org/wpgraphql-acf/assets/icon-256x256.png?rev=3125402\";s:2:\"1x\";s:66:\"https://ps.w.org/wpgraphql-acf/assets/icon-128x128.png?rev=3125402\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:69:\"https://ps.w.org/wpgraphql-acf/assets/banner-1544x500.png?rev=3125402\";s:2:\"1x\";s:68:\"https://ps.w.org/wpgraphql-acf/assets/banner-772x250.png?rev=3125402\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.9\";}}s:7:\"checked\";a:5:{s:37:\"advanced-custom-fields-6.3.12/acf.php\";s:6:\"6.3.12\";s:9:\"hello.php\";s:5:\"1.7.2\";s:29:\"hwp-previews/hwp-previews.php\";s:5:\"0.0.1\";s:25:\"wp-graphql/wp-graphql.php\";s:5:\"2.3.0\";s:31:\"wpgraphql-acf/wpgraphql-acf.php\";s:5:\"2.4.1\";}}','off'),(251,'wp-graphql_tracking_notice','hide','auto'),(252,'wpgraphql-acf_tracking_notice','hide','auto'),(255,'_transient_doing_cron','1747394440.8257310390472412109375','on'),(298,'_site_transient_timeout_browser_b977e10d1cb26107909e97d51a688323','1744370238','off'),(299,'_site_transient_browser_b977e10d1cb26107909e97d51a688323','a:10:{s:4:\"name\";s:6:\"Chrome\";s:7:\"version\";s:9:\"134.0.0.0\";s:8:\"platform\";s:9:\"Macintosh\";s:10:\"update_url\";s:29:\"https://www.google.com/chrome\";s:7:\"img_src\";s:43:\"http://s.w.org/images/browsers/chrome.png?1\";s:11:\"img_src_ssl\";s:44:\"https://s.w.org/images/browsers/chrome.png?1\";s:15:\"current_version\";s:2:\"18\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}','off'),(304,'_transient_timeout_acf_plugin_updates','1747495017','off'),(305,'_transient_acf_plugin_updates','a:5:{s:7:\"plugins\";a:1:{s:37:\"advanced-custom-fields-6.3.12/acf.php\";a:11:{s:4:\"slug\";s:22:\"advanced-custom-fields\";s:6:\"plugin\";s:37:\"advanced-custom-fields-6.3.12/acf.php\";s:11:\"new_version\";s:5:\"6.4.1\";s:3:\"url\";s:36:\"https://www.advancedcustomfields.com\";s:6:\"tested\";s:5:\"6.8.1\";s:7:\"package\";s:276:\"https://connect.advancedcustomfields.com/v2/plugins/download?p=acf&s=plugin&version=6.4.1&token=eyJwIjoiYWNmIiwiayI6ZmFsc2UsIndwX3VybCI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4ODg4Iiwid3BfdmVyc2lvbiI6IjYuOC4xIiwid3BfbXVsdGlzaXRlIjowLCJwaHBfdmVyc2lvbiI6IjcuNC4zMyIsImJsb2NrX2NvdW50IjowfQ==\";s:5:\"icons\";a:1:{s:7:\"default\";s:64:\"https://connect.advancedcustomfields.com/assets/icon-256x256.png\";}s:7:\"banners\";a:2:{s:3:\"low\";s:66:\"https://connect.advancedcustomfields.com/assets/banner-772x250.jpg\";s:4:\"high\";s:67:\"https://connect.advancedcustomfields.com/assets/banner-1544x500.jpg\";}s:8:\"requires\";s:3:\"6.0\";s:12:\"requires_php\";s:3:\"7.4\";s:12:\"release_date\";s:8:\"20250508\";}}s:9:\"no_update\";a:0:{}s:10:\"expiration\";i:172800;s:6:\"status\";i:1;s:7:\"checked\";a:1:{s:37:\"advanced-custom-fields-6.3.12/acf.php\";s:6:\"6.3.12\";}}','off'),(308,'_site_transient_timeout_browser_9ea86cc8fdda2895b9e38b9ab50c9c66','1747927679','off'),(309,'_site_transient_browser_9ea86cc8fdda2895b9e38b9ab50c9c66','a:10:{s:4:\"name\";s:6:\"Chrome\";s:7:\"version\";s:9:\"136.0.0.0\";s:8:\"platform\";s:9:\"Macintosh\";s:10:\"update_url\";s:29:\"https://www.google.com/chrome\";s:7:\"img_src\";s:43:\"http://s.w.org/images/browsers/chrome.png?1\";s:11:\"img_src_ssl\";s:44:\"https://s.w.org/images/browsers/chrome.png?1\";s:15:\"current_version\";s:2:\"18\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}','off'),(310,'_site_transient_timeout_php_check_990bfacb848fa087bcfc06850f5e4447','1747927679','off'),(311,'_site_transient_php_check_990bfacb848fa087bcfc06850f5e4447','a:5:{s:19:\"recommended_version\";s:3:\"7.4\";s:15:\"minimum_version\";s:6:\"7.2.24\";s:12:\"is_supported\";b:1;s:9:\"is_secure\";b:1;s:13:\"is_acceptable\";b:1;}','off'),(320,'_site_transient_timeout_wp_plugin_dependencies_plugin_timeout_wp-graphql','1747366084','off'),(321,'_site_transient_wp_plugin_dependencies_plugin_timeout_wp-graphql','1','off'),(322,'hwp_previews_settings','a:4:{s:4:\"post\";a:2:{s:7:\"enabled\";b:1;s:11:\"preview_url\";s:68:\"http://localhost:3000/api/preview?secret=CHANGE-SECRET-TOKEN&id={ID}\";}s:4:\"page\";a:2:{s:7:\"enabled\";b:1;s:11:\"preview_url\";s:68:\"http://localhost:3000/api/preview?secret=CHANGE-SECRET-TOKEN&id={ID}\";}s:10:\"attachment\";a:1:{s:11:\"preview_url\";s:68:\"http://localhost:3000/api/preview?secret=CHANGE-SECRET-TOKEN&id={ID}\";}s:8:\"building\";a:2:{s:7:\"enabled\";b:1;s:11:\"preview_url\";s:68:\"http://localhost:3000/api/preview?secret=CHANGE-SECRET-TOKEN&id={ID}\";}}','auto'),(329,'using_application_passwords','1','off'),(330,'_transient_timeout_settings_errors','1747393616','off'),(331,'_transient_settings_errors','a:1:{i:0;a:4:{s:7:\"setting\";s:7:\"general\";s:4:\"code\";s:16:\"settings_updated\";s:7:\"message\";s:15:\"Settings saved.\";s:4:\"type\";s:7:\"success\";}}','off'),(340,'_site_transient_timeout_community-events-44485c287b35f6187af786644b0948c8','1747428108','off'),(341,'_site_transient_community-events-44485c287b35f6187af786644b0948c8','a:4:{s:9:\"sandboxed\";b:0;s:5:\"error\";N;s:8:\"location\";a:1:{s:2:\"ip\";s:12:\"192.168.65.0\";}s:6:\"events\";a:3:{i:0;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:24:\"WordCamp Kraków, Poland\";s:3:\"url\";s:33:\"https://krakow.wordcamp.org/2025/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2025-06-27 11:30:00\";s:8:\"end_date\";s:19:\"2025-06-29 00:00:00\";s:20:\"start_unix_timestamp\";i:1751016600;s:18:\"end_unix_timestamp\";i:1751148000;s:8:\"location\";a:4:{s:8:\"location\";s:15:\"Kraków, Poland\";s:7:\"country\";s:2:\"PL\";s:8:\"latitude\";d:50.071798;s:9:\"longitude\";d:19.939965;}}i:1;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:18:\"WordCamp Lithuania\";s:3:\"url\";s:36:\"https://lithuania.wordcamp.org/2025/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2025-09-25 00:00:00\";s:8:\"end_date\";s:19:\"2025-09-26 00:00:00\";s:20:\"start_unix_timestamp\";i:1758747600;s:18:\"end_unix_timestamp\";i:1758834000;s:8:\"location\";a:4:{s:8:\"location\";s:6:\"Kaunas\";s:7:\"country\";s:2:\"LT\";s:8:\"latitude\";d:54.899647;s:9:\"longitude\";d:23.9615114;}}i:2;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:20:\"WordCamp Gdynia 2025\";s:3:\"url\";s:33:\"https://gdynia.wordcamp.org/2025/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2025-09-26 00:00:00\";s:8:\"end_date\";s:19:\"2025-09-28 00:00:00\";s:20:\"start_unix_timestamp\";i:1758837600;s:18:\"end_unix_timestamp\";i:1759010400;s:8:\"location\";a:4:{s:8:\"location\";s:14:\"Gdynia, Poland\";s:7:\"country\";s:2:\"PL\";s:8:\"latitude\";d:54.4925884;s:9:\"longitude\";d:18.5395029;}}}}','off'),(342,'_transient_timeout_feed_9bbd59226dc36b9b26cd43f15694c5c3','1747427936','off'),(343,'_transient_feed_9bbd59226dc36b9b26cd43f15694c5c3','a:6:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:52:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:8:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"WordPress News\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"https://wordpress.org/news\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"The latest news about WordPress and the WordPress community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:13:\"lastBuildDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 May 2025 14:01:21 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"en-US\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"generator\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"https://wordpress.org/?v=6.9-alpha-60236\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"image\";a:1:{i:0;a:6:{s:4:\"data\";s:11:\"\n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:3:\"url\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://s.w.org/favicon.ico?2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"WordPress News\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"https://wordpress.org/news\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"width\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"32\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:6:\"height\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"32\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}s:4:\"item\";a:10:{i:0;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"WordPress Campus Connect Expands\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://wordpress.org/news/2025/05/wordpress-campus-connect-expands/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 May 2025 12:40:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:9:\"Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:6:\"Events\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18726\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:391:\"WordPress Campus Connect, initially launched in October 2024 as a pilot program, has now been formally established as an official event series due to its resounding success. The inaugural program, spearheaded by myself, Anand Upadhyay, garnered immense enthusiasm from 400 Indian students who were eager to engage in hands-on WordPress training. WordPress Campus Connect transcends […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Anand Upadhyay\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:27763:\"\n

WordPress Campus Connect, initially launched in October 2024 as a pilot program, has now been formally established as an official event series due to its resounding success. The inaugural program, spearheaded by myself, Anand Upadhyay, garnered immense enthusiasm from 400 Indian students who were eager to engage in hands-on WordPress training.

\n\n\n\n\n\n\n\n

WordPress Campus Connect transcends the conventional workshop model by fostering a holistic learning community. It couples on-campus event learning with a diverse range of post-event activities, including meetups, website challenges, scholarships, and volunteering opportunities, all geared towards nurturing student development. The program’s efficacy has prompted other organizations in India to express interest in replicating its structure.

\n\n\n\n

Looking ahead, multiple local WordPress communities in India aim to reach more students in India through WordPress Campus Connect events. The curriculum will include beginner content, delve into more advanced WordPress concepts, and feature specialized sessions tailored for students with prior WordPress experience. 

\n\n\n\n
\n
\"\"
\n
\n\n\n\n

The official recognition of WordPress Campus Connect as an event series paves the way for further expansion, giving the series similar support and standing as WordCamps but with a student education-first goal and focus. Future plans include organizing large-scale student events, establishing WordPress clubs on college campuses, and facilitating mentorship connections for students.

\n\n\n\n

To support these ambitious goals, volunteers identified several key next steps:

\n\n\n\n
    \n
  • Volunteer Handbook Development: Creating a comprehensive guidebook to equip volunteers with the necessary resources and information.
  • \n\n\n\n
  • GatherPress Integration: Exploring the feasibility of integrating GatherPress as a tool for student groups.
  • \n\n\n\n
  • Volunteer Recruitment: Actively seeking and onboarding volunteers to support WordPress Campus Connect initiatives through activities such as:\n
      \n
    1. Creating a workflow and guidelines for processing Student Club applications
    2. \n\n\n\n
    3. On-site facilitation or assistance for WordPress Campus Connect events
    4. \n
    \n
  • \n\n\n\n
  • Landing Page Creation: Creating a landing page describing what WordPress Campus Connect is all about
  • \n\n\n\n
  • Student Groups: Drafting a framework for students to create their own groups for hosting WordPress events and activities. 
  • \n
\n\n\n\n

The overwhelming success of WordPress Campus Connect and the enthusiasm it has generated serve as a testament to the transformative power of passion and dedication. As WordPress Campus Connect continues to evolve and expand, it holds the promise of shaping the future of WordPress education and community engagement.

\n\n\n\n

If you’re interested in helping shape the future of education with WordPress, join us in the #campusconnect Make Slack channel today!

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18726\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"WordPress 6.8.1 Maintenance Release\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2025/04/wordpress-6-8-1-maintenance-release/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 30 Apr 2025 17:17:09 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18721\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:371:\"WordPress 6.8.1 is now available! This minor release includes fixes for 15 bugs throughout Core and the Block Editor addressing issues affecting multiple areas of WordPress including the block editor, multisite, and REST API. For a full list of bug fixes, please refer to the release candidate announcement. WordPress 6.8.1 is a short-cycle maintenance release. […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Aaron Jorbin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:6967:\"\n

WordPress 6.8.1 is now available!

\n\n\n\n

This minor release includes fixes for 15 bugs throughout Core and the Block Editor addressing issues affecting multiple areas of WordPress including the block editor, multisite, and REST API. For a full list of bug fixes, please refer to the release candidate announcement.

\n\n\n\n

WordPress 6.8.1 is a short-cycle maintenance release. More maintenance releases will be made available throughout 2025.

\n\n\n\n

If you have sites that support automatic background updates, the update process will begin automatically.

\n\n\n\n

You can download WordPress 6.8.1 from WordPress.org, or visit your WordPress Dashboard, click “Updates”, and then click “Update Now”. For more information on this release, please visit the HelpHub site.

\n\n\n\n

Thank you to these WordPress contributors

\n\n\n\n

This release was led by Aaron Jorbin.

\n\n\n\n

WordPress 6.8.1 would not have been possible without the contributions of the following people. Their asynchronous coordination to deliver maintenance fixes into a stable release is a testament to the power and capability of the WordPress community.

\n\n\n\n

Aaron Jorbin, Adam Silverstein, Aki Hamano, Ankit Panchal, bernhard-reiter, Carolina Nymark, Code Amp, Daniel Richards, David Baumwald, David Levine, Dilip Bheda, Dion Hulse, dsawyers, eduwass, Erick Hitter, Estela Rueda, Fabian Kägy, George Mamadashvili, Greg Ziółkowski, H. Kabir, hideishi, Himanshu Pathak, jarekmorawski, Jb Audras, Jeffrey Paul, Jeffro, Jeremy Felt, Joe Dolson, Joe McGill, Joen A., John James Jacoby, Jonathan Desrosiers, Jonny Harris, Joshua Goode, Karthikeya Bethu, Kingsley Felix, Konstantin Obenland, Lena Morita, LilGames, megane9988, Michelle Schulp Hunt, Mitchell Austin, Mukesh Panchal, nickwilmot, Nikunj Hatkar, Pascal Birchler, Paul Biron, Peter Wilson, Pratik Londhe, Presskopp, Sainath Poojary, Scott Kingsley Clark, Scott Reilly, Sergey Biryukov, SirLouen, Sören Wünsch, Sourav Pahwa, Stephen Bernhardt, takuword, Tushar Patel, Weston Ruter, Yogesh Bhutkar

\n\n\n\n

How to contribute

\n\n\n\n

To get involved in WordPress core development, head over to Trac, pick a ticket, and join the conversation in the #core and #6-8-release-leads channels. Need help? Check out the Core Contributor Handbook.

\n\n\n\n

Props to @estelaris and @joedolson for proofreading.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18721\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"WordPress Jubilee\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://wordpress.org/news/2025/04/jubilee/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 22 Apr 2025 02:07:36 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"General\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18716\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:289:\"As I said, we’re dropping all the human blocks. Community guidelines, directory guidelines, and such will need to be followed going forward, but whatever blocks were in place before are now cleared. It may take a few days, but any pre-existing blocks are considered bugs to be fixed.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:298:\"\n

As I said, we’re dropping all the human blocks. Community guidelines, directory guidelines, and such will need to be followed going forward, but whatever blocks were in place before are now cleared. It may take a few days, but any pre-existing blocks are considered bugs to be fixed.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18716\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:66:\"\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:25:\"WordPress 6.8 “Cecil”\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:41:\"https://wordpress.org/news/2025/04/cecil/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 15 Apr 2025 17:00:45 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:4:{i:0;a:5:{s:4:\"data\";s:7:\"General\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18701\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:395:\"WordPress 6.8, code-named “Cecil,” refines your creative workflow with a streamlined Style Book, now available in select Classic themes. Enjoy faster navigation via speculative loading, stronger security with bcrypt password hashing, and over 100 accessibility improvements. With thoughtful editor upgrades and behind-the-scenes performance boosts, 6.8 delivers polish, power, and precision.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:80563:\"\n
\"Simulated
\n\n\n\n

Each WordPress release celebrates an artist who has left an indelible mark on music.  WordPress 6.8, code-named “Cecil,” honors the legendary pianist and jazz pioneer Cecil Taylor.

\n\n\n\n

Classically trained yet relentlessly unconventional, Taylor reimagined the piano as a percussive instrument—layering tone clusters, polyphony, and rhythm into a sound both chaotic and precise. His music defied expectation, finding form in disorder and harmony in dissonance.

\n\n\n\n

That same spirit drives WordPress 6.8. Embrace its bold new features with the same curiosity and experimentation that defined Cecil’s sound.

\n\n\n\n

Welcome to WordPress 6.8!

\n\n\n\n

WordPress 6.8 polishes and refines the tools that you use every day, making your site faster, more secure, and easier to manage.  The Style Book now has a structured layout and works with Classic themes, giving you more control over global styles. Speculative loading speeds up navigation by preloading links before users navigate to them, bcrypt hashing strengthens password security automatically, and database optimizations improve performance.

\n\n\n\n

Download WordPress 6.8 “Cecil”

\n\n\n\n

A release polished to a high sheen.

\n\n\n\n

The Style Book gets a cleaner look—and a few new tricks.

\n\n\n\n

The Style Book has a new, structured layout and clearer labels, to make it even easier to edit colors, typography—almost all your site styles—in one place.

\n\n\n\n

Plus, now you can see it in Classic themes that have editor-styles or a theme.json file.  Find the Style Book under Appearance > Design and use it to preview your theme’s evolution, as you edit CSS or make changes in the Customizer.

\n\n\n\n
\"\"
\n\n\n\n

Editor improvements

\n\n\n\n

Easier ways to see your options in Data Views, and you can exclude sticky posts from the Query Loop.  Plus, you’ll find lots of little improvements in the editor that smooth your way through everything you build.

\n\n\n\n
\"\"
\n\n\n\n

Near-instant page loads, thanks to Speculative Loading

\n\n\n\n

In WordPress 6.8, pages load faster than ever.  When you or your user hovers over or clicks a link, WordPress may preload the next page, for a smoother, near-instant experience. The system balances speed and efficiency, and you can control how it works, with a plugin or your own code.  This feature only works in modern browsers—older ones will simply ignore it without any impact.

\n\n\n\n
\"\"
\n\n\n\n

Stronger password security with bcrypt

\n\n\n\n

Now passwords are harder to crack with bcrypt hashing, which takes a lot more computing power to break.  This strengthens overall security, as do other encryption improvements across WordPress.  You don’t need to do anything—everything updates automatically.

\n\n\n\n
\"\"
\n\n\n\n

Accessibility improvements

\n\n\n\n

100+ accessibility fixes and enhancements touch a broad spectrum of the WordPress experience.  This release includes fixes to every bundled theme, improvements to the navigation menu management, the customizer, and simplified labeling.  The Block Editor has over 70 improvements to blocks, DataViews, and to its overall user experience.

\n\n\n\n

Performance updates

\n\n\n\n

WordPress 6.8 packs a wide range of performance fixes and enhancements to speed up everything from editing to browsing.  Beyond speculative loading, WordPress 6.8 pays special attention to the block editor, block type registration, and query caching.  Plus, imagine never waiting longer than 50 milliseconds—for any interaction.  In WordPress 6.8, the Interactivity API takes a first step toward that goal.

\n\n\n\n

And much more

\n\n\n\n

For a comprehensive overview of all the new features and enhancements in WordPress 6.8, please visit the feature-showcase website.

\n\n\n\n

Check out what’s new

\n\n\n\n

Learn more about WordPress 6.8

\n\n\n\n

Learn WordPress is a free resource for new and experienced WordPress users.  Learn is stocked with how-to videos on using various features in WordPress, interactive workshops for exploring topics in-depth, and lesson plans for diving deep into specific areas of WordPress.

\n\n\n\n

Read the WordPress 6.8 Release Notes for information on installation, enhancements, fixed issues, release contributors, learning resources, and the list of file changes.

\n\n\n\n

Explore the WordPress 6.8 Field Guide.  Learn about the changes in this release with detailed developer notes to help you build with WordPress.

\n\n\n\n

The 6.8 release squad

\n\n\n\n

Every release comes to you from a dedicated team of enthusiastic contributors who help keep things on track and moving smoothly.  The team that has led 6.8 is a cross-functional group of contributors who are always ready to champion ideas, remove blockers, and resolve issues.

\n\n\n\n\n\n\n\n

Thank you, contributors

\n\n\n\n

The mission of WordPress is to democratize publishing and embody the freedoms that come with open source.  A global and diverse community of people collaborating to strengthen the software supports this effort.

\n\n\n\n

WordPress 6.8 reflects the tireless efforts and passion of more than 900 contributors in more than 60 countries all over the world. This release also welcomed over 250 first-time contributors! 

\n\n\n\n

Their collaboration delivered more than 320 enhancements and fixes, ensuring a stable release for all—a testament to the power and capability of the WordPress open source community.

\n\n\n

Aaron Jorbin · Aaron Robertshaw · Aashish Sharma · Abha Thakor · Abhay Kulkarni · Abhishek Sharma · AdaKaleh · Adam Silverstein · Adam Zieliński · Adhun Anand · Aditya Bansode · Adrian Jagusch · aduth · Ahir Hemant · Ahmar Zaidi · Ahmed Kabir Chaion · Ahmed Saeed · Ahsan Khan · Aishwarrya Pande · Ajay Ghaghretiya · Ajay Maurya · Ajit Bohra · Akanshu Singh · Aki Hamano · Akira Tachibana · aks30498 · Akshat Kakkad · Akshay Dhere · Albert Juhé Lluveras · Alessio · Alex Concha · Alex Florisca · Alex Lende · Alex Stine · Alexander Bigga · Alexandre Buffet · Alexei Samarschi · alexschmitz · Ali Akbar Reyad · allilevine · alpipego · Alvaro Gómez · Amaan Khan · Amber Hinds · Amimul Ihsan · Amin · Amin Charoliya · Amit Bhosale · Amit Raj · Ammar Mohamed Fath Allah Abd-Elaaty Massoud · amolebonde · Anand Raj · Anders Norén · Andrea Fercia · Andrea Roenning · Andreas Pedersen · Andrei Draganescu · Andrei Lupu · Andrew Nacin · Andrew Ozz · Andrew Serong · Andrew Ssanya · Andrey \"Rarst\" Savchenko · André Maneiro · Andy Fragen · Anh Tran · Ankit Gade · Ankit K Gupta · Ankit Kumar Shah · Ankit Panchal · Ankit Patel · Anmol Verma · annchichi · Anne-Mieke Bovelett · annezazu · Anthony Burchell · Anthony Hortin · Anton Vlasenko · Anuj Singh · Anveshika Srivastava · Ari Stathopoulos · Ariel Maidana · arnaudbroes · arnoutblueshell · Artemio Morales · Ashish Jain · Asish Chandra Mohon · Au · autotutorial · Ayesh Karunaratne · Azhar Deraiya · Béryl de La Grandière · back2backdvm · BackuPs · Balu B · Barry · Bayejid Ahmed · Beatriz Fialho · ben · Ben Dwyer · Ben Sutcliffe · Benazeer · Benedikt Ledl · Benjamin Zekavica · Benoit Chantre · bernhard-reiter · Bero · bgermann · Bhavik Kalpesh · Bijit Deb · Birgir Erlendsson (birgire) · Birgit Pauli-Haack · Bishal Shrestha · BjornW · bluantinoo · BogdanUngureanu · Boro Sitnikovski · Brad · Brad Jorsch · Bradley Taylor · Brandon Hubbard · Brandon Payton · brettsmason · brevilo · Brian Alexander · Brian Coords · Brian Haas · Bronson Quick · Bryan Schneidewind · burak · burnuser · Calvin Alkan · Calvin Alkan · Carlos Bravo · Carolina Nymark · cbirdsong · cgastrell · charleslf · chiilog (Chiaki Okamoto) · chintanmachhi207 · ChriCo · chriscct7 · chrisdotdotdot · Christoph Daum · claimableperch · Claudiu Lodromanean · Code Amp · codebymikey · codersantosh · Colin Stewart · ColinD · colinleroy · Corey Worrell · Courtney Robertson · Cris Busquets · Crisoforo Gaspar · ctienshi · cweiske · cybeardjm · Cyrille · Cyrille Sanson · Daedalon · Dakota Chichester · Damien Alleyne · Damon Cook · Dan Knauss · danht · Dani Guardiola · Daniel Bachhuber · Daniel Post · Daniel Richards · Daniele Scasciafratte · danielpataki · danielvann · darerodz · Darin Kotter · Darren Hewer · Dave Loodts · David Aguilera · David Arnado · David Baumwald · David Biňovec · David Bowman · David Calhoun · David FARGIER · David Herrera · David Innes · David Levine · David Rozando · David Shanske · David Smith · daymobrew · deadduck169 · Dean Sas · Debabrata Karfa · DEBARGHYA BANERJEE · Deep Patel · Deepak Rohilla · Dennis Ploetner · Dennis Snell · Densi Nakum · designsimply · Devansh Chaudhary · Dhananjay Kuber · Dharmesh Patel · Dhaval Kapadane · Dheeraj Bhosale · Dhrumil Kumbhani · Dhruvang21 · Dhruvi Shah · Dhruvik Malaviya · Digvijay Zite · dilip · Dilip Bheda · Dilip Hingarajiya · Dilip Modhavadiya · DingGuodong · Dion Hulse · Divyesh_kakrecha · dj.cowan · Django · dnnsjsk · Doeke Norg · dogee · domenicdenicola · Dominik Schilling · donalirl · dooperweb · Doug Wollison · dretzlaff · Drew Jaynes · Drivingralle · dsawyers · Dwain Maralack · Earthman Media · eclev91 · Eddy · eduwass · Edward Caissie · efc · Elena Brescacin · elizaan36 · Ella van Durpe · Emerson Maningo · Emilie LEBRUN · Emmanuel Atsé · Enrico Battocchi · Eric Dye · Erick Hitter · Erik · Erik · Eshaan Dabasiya · Estela Rueda · Evan Herman · Even Tobiesen · Fabian Kägy · Fabian Todt · Faisal Ahammad · Faisal Alvi · Faizan Nabi · Felix Arntz · Felix Renicks · finntown · Firoz Sabaliya · Francesca Marano · Francis Cabusas · Francisco · Frank B. · Frank Klein · Fransisca H · frkly · fushar · FX Bénard · gaellebesson · Gajendra Singh · Galib Hayder · Gan Eng Chin · Garrett Hyder · Gary Jones · Gary Pendergast · Gennady Kovshenin · George Mamadashvili · Gerardo Pacheco · ghinamt · Girish Panchal · giuriani · Glen Davies · Glynn Quelch · Gopal Krishnan · Grant M. Kinney · Greg Ziółkowski · gregbenz · grgarside · GrowwBuddy · Guido · Guillaume TURPIN · Gulamdastgir Momin · Héctor Prieto · H. Kabir · Halil Kaya · Halyna Yampolska · Hameem Mahdad Kader · Hannes Leismann · Hans-Gerd Gerhards · Hardip Parmar · Hareesh S · Hari Shanker R · harrym · Harshal Kadu · Haz · hekuranredev · Helen Hou-Sandi · Hemant Kothari · Henrique Iamarino · Henry Wright · Herve THOMAS · hideishi · Hidekazu Ishikawa · Hilay Trivedi · Himani Panchal · Himanshu Pathak · Hit Bhalodia · Hitendra Chopda · Hitesh Dhokai · Hovhannes Hovakimyan · hueitan · humanify · hussain896 · huubl · Huzaifa Al Mesbah · Ian Dunn · ilovecats7 · Imran · Imran Hossain (a11n) · Indira Biswas · indithemes · Isabel Brison · iseulde · Isu · Ivan Kristianto · Jack · Jagir Bahesh · Jainil Shah · Jake Spurlock · James Koster · James Monroe · James Payne · James Robinson · James Sansbury · Jamie Blomerus · jammycakes · Jan Lysý · janak Kaneriya · janusdev · Jarda Snajdr · jarekmorawski · Jason Cosper · Jason LeMahieu (MadtownLems) · Jason Sauerwald · Javier Casares · Jayaram · Jaydip Ahir · jdnd · Jean-Baptiste Audras · Jeff Chi · Jeff Golenski · Jeff Ong · Jeff Paul · Jeffro · jeflopo · Jenny Dupuy · jepperask · Jeremy Felt · jeremy80 · jeremyroman · jeryj · jessedyck · Jessica Lyschik · Jigar Bhanushali · Jigar Panchal · jnweaver · Joan Artes · jodamo5 · Joe Dolson · Joe Hoyle · Joe McGill · joecsmalley · Joen Asmussen · Johannes Jülg · John Blackbourn · John James Jacoby · John Regan · Jomar Jay Corona · Jomon Thomas Lobo · Jon Surrell · Jonathan Bossenger · Jonathan Desrosiers · Jong · Joni Erkkilä · Jonny Harris · jonnyauk · joomskys · Joost de Valk · jordesign · Jorge Costa · Jos Velasco · Jose Varghese · Josef Seidl · Joseph Scott · Joshua Goode · Joshua Wold · jottevanger · Jouni Kananen · Joy · Juan Aldasoro · juanbuis · JuanMa Garrido · juanwp22 · Jules Colle · julianmar · Julie Moynat · Juliette Reinders Folmer · Julio Potier · Justin Tadlock · Juzar · K. Adam White · KafleG · Kai Hao · Kaito Hanamori · Kamal Hosen · KAP ASIAs · Kapil Paul · karlgroves · Karol Manijak · Karthick Murugan · Karthik Thayyil · Karthikeya Bethu · Kaspars · Kathryn Presner · Kausar Alam · keithdevon · Kel Santiago-Pilarski · Kelly Choyce-Dwan · Kelly Mears · keoshi · Ketan Niruke · Ketan Patel · Kevin Leary · Kharis Sulistiyono · Kingsley Felix · Kira Schroder · KJ Roelke · kkmuffme · Knut Sparhell · kohheepeace · Konstantin Obenland · Konstantinos Galanakis · Konstantinos Xenos · kristastevens · Krupa Nanda · Krupal Lakhia · laurelfulford · Lax Mariappan · Laxman Prajapati · lcarevic · Lee · Lee Willis · leedxw · Lena Morita · lenasterg · leszeks · leup · levskipg · Liam Gladdy · LilGames · Louis · Lourens · Love Soni · Lovekesh Kumar · lovewpmu · Lovro Hrust · Lox · ltrihan · Luigi Teschio · Luis Felipe Zaguini · luisherranz · Lukasz · Luke Cavanagh · Mário Santos · maciejmackowiak · Madhu Dollu · madpeter · Magda Rogier · Maggie Cabrera · Mahesh Prajapati · Mai · maikelraow · Maja Benke · Makarand G. Mane · mallorydxw-old · manfcarlo · Manoj Maharrshi · Manzoor Wani · Marc · Marcelo de Moraes Serpa · marchalyoan · Marchetti Design · Marco Ciampini · Maria Yohana · marian1 · Marianna · Marie · Marin Atanasov · Marine EVAIN · Mario Peshev · Mario Santos · Marius L. J. · Mark Howells-Mead · Mark Uraine · Mark-k · martin.krcho · Mary Baum · Mary Hubbard · Masud Rana · Mathieu Paapst · Matias Benedetto · Matias Ventura · Matt (Thomas) Miklic · Matt Mullenweg · Matt Robinson · Matt West · Matteo Enna · Matthew · Matthew Boynes · mattryanwalker · Mauriac AZOUA · Maxime Meganck · maximebj · Mayank Tripathi · Mayur Prajapati · Md Abdullah Al Arif · Md Abul Bashar · Md Hafijur Rahman · MD Kawsar Chowdhury · Md Mahdi Hasan · Md. Ibrahim Khalil · Md. Najmul Islam · Md.Mehedi Hasan · mdviralsampat · megane9988 · MelissaH · metropolis_john · Michael Adams (mdawaffe) · Michael Burridge · Michael Willman · Michal Czaplinski · Michelle Frechette · Michelle Schulp Hunt · micromadness · Miguel Fonseca · Miguel Torres · Mijo T J · Mikael Korpela · Mike Bijon · Mike Ritter · Mikin Chauhan · Milana Cap · Milind More · mimi · miroku · Mitchell Austin · Modi Sahil · modulbuero · Mohamed Aboelfotoh Mohamed · Mohit Dadhich · mojorob · Morais Junior · Moses Cursor Ssebunya · Mosne / Paolo Tesei · mr660 · mreishus · mrunalkulkarni · mrwweb · mt · Muddassir Rahman Nasim · Muhibul Haque · mujuonly · Mukesh Panchal · Mukul Singh · My1 · n8finch · Nadir Seghir · nandow · NANI SAMIREDDY · Narendra Sishodiya · Naresh Bheda · Natalia T · Nathan Johnson · navneet · Navneet Kaur · Nazmul Hasan Robin · Ned Zimmerman · neotrope · NerQuiles · net · Nick Diego · nickgalvez · nickwilmot · Nicolas RIVIERE · nicolasleroy · nidhidhandhukiya · Nik Tsekouras · Nikan Radan · Nikita Solanki · Nikunj Hatkar · Nilesh Shiragave · Niraj Giri · Nithin SreeRaj · Noam Eppel · Noel Santos · Noruzzaman · nosilver4u · oceantober · Olaf Lederer · Olga Gleckler · Oliver Campion · Omer Korner · Oscar Arzola · Oskari Groenroos · Ov3rfly · Paal Joachim Romdahl · pampfelimetten · Parin Panjari · Parth Dodiya · Parth vataliya · Pascal Birchler · Pascal Casier · Patel Jaymin · Patricia BT · Patrick Lumumba · Paul · Paul Bearne · Paul Biron · Paul English · Paul Kevan · paullb · Paulo Pinto · Paulo Trentin · Pavan Patil · Pawan Kumar · Pedro Mendonça · Peter Rubin · Peter Westwood · Peter Wilson · peter8nss · peterdavehello · petitphp · philliproth · philwebs · Pitam Dey · pixlpirate · podpirate · Pooja Bhimani · Pooja Killekar (Muchandikar) · pooja9712 · Praful Patel · Prasad Karmalkar · prashant · Prashant Baldha · Prashant Patil · Prathamesh Shirke · prathameshbhagat1511 · Pratik Bhatt · Pratik Gandhi · Pratik Londhe · Presskopp · Pritam Sonone · Priyank Vadhavana · Pushpender Singh · Q · qhaensler · Rafael Fischmann · Rahul Prajapati · Raj Patel · Rajat Patel · Rajendra Patel · Rajendra Patil · Rajesh Radadiya · Rajesh Rathod · Rajin Sharwar · Ramon Ahnert · Ramon Corrales · Ramon James · Ravi Gadhiya · redkite · Rehan Ali · Rejaul Alom Khan · Remco · Renatho · Renz Jay Sanchez · Riad Benguella · Rich Tabor · Riddhi Dave · Rinkal Pagdar · Rishav Dutta · Rishi Mehta · Rishi Shah · Rishit Gupta · rkyburz · Robert Anderson · Robert Chapin · Robert Ghetau · Robert Seyfriedsberger · robertstaddon · Robin Martijn · Rodrigo Arias · Rodrigo Primo · Rogier Lankhorst · Rohan Jha · rohitmathur7 · rohjay · room34 · Rotem Gelbart · Roy Orbitson · Roy Tanck · roybellingan · Ruchir Goswami · Rudrakshi Gupta · Rupesh Patil · rupw · Ruturaj Raval · rvoigt · Ryan Fredlund · Ryan Hellyer · Ryan McCue · Ryan Welcher · Ryo · S P Pramodh · Sébastien SERRE · Sérgio Gomes · Sören Wünsch · Sabbir Ahmed · sabrineg · Saeed Piri · Sagar Lakhani · Sagar Prajapati · Sagar Tamang · sailpete · Sainath Poojary · Sajjad Hossain Sagor · sally · samiamnot · Sampat Viral · Samsul Islam Rana · Samuel Wood (Otto) · Sanyogg Shelar · Sarah Norris · Sarath AR · Sarthak Nagoshe · Sathiya Venkatesan · Saul Fougnier · saurabh.dhariwal · Saxon Fletcher · Sayan Datta · Sayedul Sayem · sbathompson · Scott Arciszewski · Scott Kingsley Clark · Scott Reilly · scribu · Sean Fisher · seanlanglands · Sebastian Pisula · Seif Radwane · Sergey Biryukov · sergiogutierrez · Seth Rubenstein · Severine Pozzo · Shadi G شادي جـ · Shail Mehta · Shalin Shah · Shane Muirhead · Shoe · Shraddha Gore · shreyashd21 · Shubham Kumar Bansal · Shubham Patil · shulard · Shyam Kariya · Siddharth Thevaril · siliconforks · Simone Maranzana · SirLouen · sjefen6 · Slava Abakumov · Slavco Mihajloski · smerriman · Sneha Patil · snehal5774 · Soham sham joshi · Sourabh Jain · Sourav Pahwa · soyeb salar · Spencer Finnell · Spenser Hale · spmultidots · spncr · Sridhar Katakam · Stefan Seidner-Britting · Stefano Minoia · stein2nd · Stephen Bernhardt · Stephen Edgar · Steve Dufresne · stimul · strarsis · Stuart McAlpine · Subodh Rajpopat · Subrata Sarkar · SUHAS SUTAR · Sukhendu Sekhar Guria · Sumit Bagthariya · Sumit Singh · Sumon Sarker · SunilPrajapati · Suraj Sutar · swalkinshaw · Sybre Waaijer · Synchro · t.schwarz · Taco Verdonschot · Taegon Kim · Takashi Irie · Takashi Kitajima · Takayuki Miyoshi · Takuro · Tammie Lister · Tanbir Ahmod · Tapan Kumer Das · th23 · Thakor Darshil · thelmachido a11n · ThemeBeans · thomaswm · threadi · Thrijith Thankachan · tiago · TigriWeb · Till Krüss · Tim Brathärig · Tim Sheehan · Tim W · Timi Wahalahti · Timothée Brosille · Timothy Jacobs · Timur Kamaev · Tirth Doshi · TJarrett · Tobias Bäthge · tobifjellner (Tor-Bjorn “Tobi” Fjellner) · Tom Gugel · Tom Rhodes · Tomoki Shimomura · Toni Viemerö · Tonya Mork · Toro_Unit (Hiroshi Urabe) · Torsten Landsiedel · tropicalista · Troy Chaplin · Trupti Kanzariya · Trusha · tunetheweb · Tung Du · Tushar Patel · TyB · tysonlmao · Ugyen Dorji · Umesh Singh · Unsal Korkmaz · up1512001 · upadalavipul · utrenkner · Vagelis · Vaibhav Singh Web · Vaibhav Tukaram Nawale · Valérie Galassi · Vania · vee · Vegard S. · vgnavada · Vicente Canales · Victoria - a11n · Vijayan · Vijaysinh Zala · Vikram · Viktor Szépe · Vinit · Vipul Gupta · Vipul Patil · Virgildia · Virginie Garnier · virginienacci · Vishy Moghan · vivekawsm · Vrishabh Jasani · vykesmac · wadowad · Web-Pepper · WebMan Design | Oliver Juhas · Wes Theron · Weston Ruter · whaze · Will Skora · williampatton · wongjn · World Web Technology · wpgerd · wplmillet · wprockstar2 · wwdes · xate · xavilc · xpurichan · Yahil Madakiya · Yani · Yash Kukreja · yellowafterlife · Yogesh Bhutkar · yudhisthirnahar · Yui · Yuliyan Slavchev · yuu · zaoyao · Zargarov · Zebulan Stanphill · zeelthakkar · Zunaid Amin · 耗子

\n\n\n\n

More than 60 locales have fully translated WordPress 6.8 into their language making this one of the most translated releases ever on day one.  Community translators are working hard to ensure more translations are on their way.  Thank you to everyone who helps make WordPress available in 200 languages.

\n\n\n\n

Last but not least, thanks to the volunteers who contribute to the support forums by answering questions from WordPress users worldwide.

\n\n\n\n

Get involved

\n\n\n\n

Participation in WordPress goes far beyond coding. And learning more and getting involved is easy.  Discover the teams that come together to Make WordPress and use this interactive tool to help you decide which is right for you.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18701\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:66:\"\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"WordCamp Europe 2025: Sali, Basel!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://wordpress.org/news/2025/04/wordcamp-europe-2025-sali-basel/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 14 Apr 2025 19:16:10 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:4:{i:0;a:5:{s:4:\"data\";s:6:\"Events\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"WordCamp\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:4:\"WCEU\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:9:\"WordCamps\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18683\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:411:\"WordCamp Europe 2025 will be held in gorgeous Basel, Switzerland, from June 5 to 7. It will bring together open source enthusiasts, developers, and WordPress professionals from across the region—and the world! This year’s event offers fresh perspectives, engaging conversations, and countless opportunities to connect with the WordPress community, agencies, and innovators over three action-packed […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Brett McSherry\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:6552:\"\n
\"\"
\n\n\n\n

WordCamp Europe 2025 will be held in gorgeous Basel, Switzerland, from June 5 to 7. It will bring together open source enthusiasts, developers, and WordPress professionals from across the region—and the world!

\n\n\n\n

This year’s event offers fresh perspectives, engaging conversations, and countless opportunities to connect with the WordPress community, agencies, and innovators over three action-packed days of learning, networking, and collaboration.

\n\n\n\n
\n
\n\n\n\n

\"🎟\" Tickets are limited—secure yours today!

\n\n\n\n
\n\n\n\n\n\n\n\n
\n
\n\n\n\n

Keynotes, panels, and deep dives

\n\n\n\n

The main conference, which will be held on June 6th and 7th, will feature a lineup of notable keynote sessions, including diverse sessions on business strategy and building innovative modern features, open-source advocacy, accessibility, and more. For those looking to sharpen their skills, presentations will dive deep into topics like SEO for WordPress, performance optimization, speed-builds, and leveraging AI.

\n\n\n\n

Q&A Fireside Chat

\n\n\n\n

You can join Mary Hubbard, the WordPress Executive Director, and Matt Mullenweg, co-founder of the WordPress project on June 7th to discuss WordPress and its community, followed by an in-person Q&A session here in Basel.

\n\n\n\n

Explore Basel

\n\n\n\n

Basel, the third-largest city in Switzerland, is filled with historical buildings, a cathedral, museums, and hidden gems! You can get around Basel and experience it yourself using your BaselCard, which allows you to hop on and off all public transportation without a worry. A walk down Basel’s river Rhine could be the perfect evening during your visit to WordCamp Europe!

\n\n\n\n

\"🛏\" Find accommodations in Basel
\"🚌\" Learn about BaselCard benefits
\"📄\" Need a visa? Apply by May 10, 2025

\n\n\n\n

\"📅\" Plan Your WordCamp Europe Experience See the full schedule, plan your sessions, and maximize your time in Basel.

\n\n\n\n

Get WordCamp-ready

\n\n\n\n

\"🎟\" Make sure to secure your WordCamp Europe 2025 tickets (if you haven’t already!)

\n\n\n\n

Follow WordCamp Europe news on Bluesky, Instagram, Facebook, LinkedIn, Threads, Mastodon, and X/Twitter for real-time updates!

\n\n\n\n

You can also help us spread the word about WordCamp Europe this year! Post about your attendance using our ready-made texts or we also encourage you to use your own voice – you know your community best.

\n\n\n\n

And as always, be part of the conversation! Whether you’re attending in-person in Basel or following along online, share your experiences using the tags #WCEU and #WordPress on all social media networks!

\n\n\n\n

Basel is calling—see you at WordCamp Europe 2025! \"🇨🇭\"

\n\n\n\n
\n\n\n\n

Thank you to @dolgelukkig for drafting this copy.

\n\n\n\n

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18683\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 6.8 Release Candidate 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2025/04/wordpress-6-8-release-candidate-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 08 Apr 2025 15:54:49 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6-8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18673\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:260:\"WordPress 6.8 RC 3 is ready for download and testing! The scheduled final release date for WordPress 6.8 is April 15, 2025. Your help testing over the next week is vital to ensuring the final release is everything it should be: stable, powerful, and intuitive.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:8765:\"\n

The third release candidate (“RC3”) for WordPress 6.8 is ready for download and testing!

\n\n\n\n

This version of the WordPress software is under development.  Please do not install, run, or test this version of WordPress on production or mission-critical websites.  Instead, it’s recommended that you evaluate RC3 on a test server and site.

\n\n\n\n

Reaching this phase of the release cycle is an important milestone.  While release candidates are considered ready for release, testing remains crucial to ensure that everything in WordPress 6.8 is the best it can be.

\n\n\n\n

You can test WordPress 6.8 RC3 in four ways:

\n\n\n\n
PluginInstall and activate the WordPress Beta Tester plugin on a WordPress install.  (Select the “Bleeding edge” channel and “Beta/RC Only” stream).
Direct DownloadDownload the RC3 version (zip) and install it on a WordPress website.
Command LineUse the following WP-CLI command: wp core update --version=6.8-RC3
WordPress PlaygroundUse the 6.8 RC3 WordPress Playground instance (available within 35 minutes after the release is ready) to test the software directly in your browser without the need for a separate site or setup.
\n\n\n\n

The current target for the WordPress 6.8 release is April 15, 2025. Get an overview of the 6.8 release cycle, and check the Make WordPress Core blog for 6.8-related posts leading up to next week’s release for further details.

\n\n\n\n

What’s in WordPress 6.8 RC3?

\n\n\n\n

Get a recap of WordPress 6.8’s highlighted features in the Beta 1 announcement. For more technical information related to issues addressed since RC2, you can browse the following links:

\n\n\n\n\n\n\n\n

How you can contribute

\n\n\n\n

WordPress is open source software made possible by a passionate community that collaborates and contributes to its development. The resources below outline various ways you can help the world’s most popular open source web platform, regardless of your technical expertise.

\n\n\n\n

Get involved in testing

\n\n\n\n

Testing for issues is critical to ensuring WordPress is performant and stable. It’s also a meaningful way for anyone to contribute. This detailed guide will walk you through testing features in WordPress 6.8.  For those new to testing, follow this general testing guide for more details on getting set up.

\n\n\n\n

If you encounter an issue, please report it to the Alpha/Beta area of the support forums or directly to WordPress Trac if you are comfortable writing a reproducible bug report. You can also check your issue against a list of known bugs.

\n\n\n\n

Curious about testing releases in general?  Follow along with the testing initiatives in Make Core and join the #core-test channel on Making WordPress Slack.

\n\n\n\n

Search for vulnerabilities

\n\n\n\n

From now until the final release of WordPress 6.8 (scheduled for April 15, 2025), the monetary reward for reporting new, unreleased security vulnerabilities is doubled.  Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Update your theme or plugin

\n\n\n\n

For plugin and theme authors, your products play an integral role in extending the functionality and value of WordPress for all users.  For more details on developer-related changes in 6.8, please review the WordPress 6.8 Field Guide.

\n\n\n\n

Thanks for continuing to test your themes and plugins with the WordPress 6.8 beta releases.  With RC3, you’ll want to conclude your testing and update the “Tested up to” version in your plugin’s readme file to 6.8.

\n\n\n\n

If you find compatibility issues, please post detailed information to the support forum.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English?  ¿Español?  Français?  Русский?  日本語? हिन्दी? मराठी? বাংলা?  You can help translate WordPress into more than 100 languages.

\n\n\n\n

An RC3 haiku

\n\n\n\n

The launch draws closer,
Six-eight sings through RC3,
Almost time to shine.

\n\n\n\n

Thank you to the following contributors for collaborating on this post: @audrasjb, @mamaduka, @krupajnanda, @benjamin_zekavica, @narenin, @joedolson, @courane01, @joemcgill, @marybaum, @kmgalanakis, @umeshsinghin, @wildworks, @mkrndmane.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18673\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 6.8 Release Candidate 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2025/04/wordpress-6-8-release-candidate-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 01 Apr 2025 15:53:20 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18662\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:367:\"The second Release Candidate (“RC2”) for WordPress 6.8 is ready for download and testing! This version of the WordPress software is under development. Please do not install, run, or test this version of WordPress on production or mission-critical websites. Instead, it’s recommended that you evaluate RC2 on a test server and site. Reaching this phase […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:19:\"Jonathan Desrosiers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:8741:\"\n

The second Release Candidate (“RC2”) for WordPress 6.8 is ready for download and testing!

\n\n\n\n

This version of the WordPress software is under development. Please do not install, run, or test this version of WordPress on production or mission-critical websites. Instead, it’s recommended that you evaluate RC2 on a test server and site.

\n\n\n\n

Reaching this phase of the release cycle is an important milestone. While release candidates are considered ready for release, testing remains crucial to ensure that everything in WordPress 6.8 is the best it can be.

\n\n\n\n

You can test WordPress 6.8 RC2 in four ways:

\n\n\n\n
PluginInstall and activate the WordPress Beta Tester plugin on a WordPress install. (Select the “Bleeding edge” channel and “Beta/RC Only” stream).
Direct DownloadDownload the RC2 version (zip) and install it on a WordPress website.
Command LineUse the following WP-CLI command: wp core update –version=6.8-RC2
WordPress PlaygroundUse the 6.8 RC2 WordPress Playground instance (available within 35 minutes after the release is ready) to test the software directly in your browser without the need for a separate site or setup.
\n\n\n\n

The current target for the WordPress 6.8 release is April 15, 2025.  Get an overview of the 6.8 release cycle, and check the Make WordPress Core blog for 6.8-related posts in the coming weeks for further details.

\n\n\n\n

What’s in WordPress 6.8 RC2?

\n\n\n\n

Get a recap of WordPress 6.8’s highlighted features in the Beta 1 announcement. For more technical information related to issues addressed since RC1, you can browse the following links:

\n\n\n\n\n\n\n\n

Want to look deeper into the details and technical notes for this release? These recent posts cover some of the latest updates:

\n\n\n\n\n\n\n\n

How you can contribute

\n\n\n\n

WordPress is open source software made possible by a passionate community of people collaborating on and contributing to its development. The resources below outline various ways you can help the world’s most popular open source web platform, regardless of your technical expertise.

\n\n\n\n

Get involved in testing

\n\n\n\n

Testing for issues is critical to ensuring WordPress is performant and stable.  It’s also a meaningful way for anyone to contribute.  This detailed guide will walk you through testing features in WordPress 6.8.  For those new to testing, follow this general testing guide for more details on getting set up.

\n\n\n\n

If you encounter an issue, please report it to the Alpha/Beta area of the support forums or directly to WordPress Trac if you are comfortable writing a reproducible bug report.  You can also check your issue against a list of known bugs.

\n\n\n\n

Curious about testing releases in general?  Follow along with the testing initiatives in Make Core and join the #core-test channel on Making WordPress Slack.

\n\n\n\n

Search for vulnerabilities

\n\n\n\n

From now until the final release of WordPress 6.8 (scheduled for April 15, 2025), the monetary reward for reporting new, unreleased security vulnerabilities is doubled. Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Update your theme or plugin

\n\n\n\n

For plugin and theme authors, your products play an integral role in extending the functionality and value of WordPress for all users.

\n\n\n\n

Thanks for continuing to test your themes and plugins with the WordPress 6.8 beta releases. With RC2, you’ll want to conclude your testing and update the “Tested up to” version in your plugin’s readme file to 6.8.

\n\n\n\n

If you find compatibility issues, please post detailed information to the support forum.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English? ¿Español? Français? Русский? 日本語? हिन्दी? বাংলা? मराठी? ಕನ್ನಡ?  You can help translate WordPress into more than 100 languages. This release milestone (RC2) also marks the hard string freeze point of the 6.8 release cycle.

\n\n\n\n

An RC2 haiku

\n\n\n\n

Testing, 1, 2, 3
It’s almost April fifteenth
Squashing all the bugs

\n\n\n\n

Thank you to the following contributors for collaborating on this post: @michelleames, @tacoverdo, @jopdop30, @vgnavada, @jeffpaul.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18662\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 6.8 Release Candidate 1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2025/03/wordpress-6-8-release-candidate-1/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Mar 2025 16:19:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18639\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:267:\"WordPress 6.8 RC 1 is ready for download and testing! The scheduled final release date for WordPress 6.8 is April 15, 2025. Your help testing over the next three weeks is vital to ensuring the final release is everything it should be: stable, powerful, and intuitive.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:9475:\"\n

The first Release Candidate (“RC1”) for WordPress 6.8 is ready for download and testing!

\n\n\n\n

This version of the WordPress software is under development.  Please do not install, run, or test this version of WordPress on production or mission-critical websites.  Instead, it’s recommended that you evaluate RC1 on a test server and site.

\n\n\n\n

Reaching this phase of the release cycle is an important milestone.  While release candidates are considered ready for release, testing remains crucial to ensure that everything in WordPress 6.8 is the best it can be.

\n\n\n\n

You can test WordPress 6.8 RC1 in four ways:

\n\n\n\n
PluginInstall and activate the WordPress Beta Tester plugin on a WordPress install.  (Select the “Bleeding edge” channel and “Beta/RC Only” stream).
Direct DownloadDownload the RC1 version (zip) and install it on a WordPress website.
Command LineUse the following WP-CLI command: wp core update --version=6.8-RC1
WordPress PlaygroundUse the 6.8 RC1 WordPress Playground instance (available within 35 minutes after the release is ready) to test the software directly in your browser without the need for a separate site or setup.
\n\n\n\n

The current target for the WordPress 6.8 release is April 15, 2025.  Get an overview of the 6.8 release cycle, and check the Make WordPress Core blog for 6.8-related posts in the coming weeks for further details.

\n\n\n\n

What’s in WordPress 6.8 RC1?

\n\n\n\n

Get a recap of WordPress 6.8’s highlighted features in the Beta 1 announcement.  For more technical information related to issues addressed since Beta 3, you can browse the following links:

\n\n\n\n\n\n\n\n

Want to look deeper into the details and technical notes for this release? These recent posts cover some of the latest updates:

\n\n\n\n\n\n\n\n

How you can contribute

\n\n\n\n

WordPress is open source software made possible by a passionate community of people collaborating on and contributing to its development.  The resources below outline various ways you can help the world’s most popular open source web platform, regardless of your technical expertise.

\n\n\n\n

Get involved in testing

\n\n\n\n

Testing for issues is critical to ensuring WordPress is performant and stable.  It’s also a meaningful way for anyone to contribute.  This detailed guide will walk you through testing features in WordPress 6.8.  For those new to testing, follow this general testing guide for more details on getting set up.

\n\n\n\n

If you encounter an issue, please report it to the Alpha/Beta area of the support forums or directly to WordPress Trac if you are comfortable writing a reproducible bug report.  You can also check your issue against a list of known bugs.

\n\n\n\n

Curious about testing releases in general?  Follow along with the testing initiatives in Make Core and join the #core-test channel on Making WordPress Slack.

\n\n\n\n

Search for vulnerabilities

\n\n\n\n

From now until the final release of WordPress 6.8 (scheduled for April 15, 2025), the monetary reward for reporting new, unreleased security vulnerabilities is doubled.  Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Update your theme or plugin

\n\n\n\n

For plugin and theme authors, your products play an integral role in extending the functionality and value of WordPress for all users.

\n\n\n\n

Thanks for continuing to test your themes and plugins with the WordPress 6.8 beta releases.  With RC1, you’ll want to conclude your testing and update the “Tested up to” version in your plugin’s readme file to 6.8.

\n\n\n\n

If you find compatibility issues, please post detailed information to the support forum.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English?  ¿Español?  Français?  Русский?  日本語? हिन्दी? বাংলা? मराठी?  You can help translate WordPress into more than 100 languages.  This release milestone (RC1) also marks the hard string freeze point of the 6.8 release cycle.

\n\n\n\n

An RC1 haiku

\n\n\n\n

March fades, nearly there,
Six-eight hums—a steady beat,
RC greets the world.

\n\n\n\n

Thank you to the following contributors for collaborating on this post: @joemcgill @benjamin_zekavica @courane01 @mkrndmane @audrasjb @areziaal @ankit-k-gupta @krupajnanda @bph.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18639\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 6.8 Beta 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2025/03/wordpress-6-8-beta-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 18 Mar 2025 15:35:14 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18634\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:289:\"WordPress 6.8 Beta 3 is ready for download and testing! The scheduled final release date for WordPress 6.8 is April 15, 2025. Your help testing Beta and RC versions over the next four weeks is vital to ensuring the final release is everything it should be: stable, powerful, and intuitive.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:5627:\"\n

WordPress 6.8 Beta 3 is now ready for testing!

\n\n\n\n

This beta version of the WordPress software is under development. Please do not install, run, or test this version of WordPress on production or mission-critical websites. Instead, it is recommended you evaluate Beta 3 on a test server and site.

\n\n\n\n

You can test WordPress 6.8 Beta 3 in four ways:

\n\n\n\n
PluginInstall and activate the WordPress Beta Tester plugin on a WordPress install.  (Select the “Bleeding edge” channel and “Beta/RC Only” stream).
Direct DownloadDownload the Beta 3 version (zip) and install it on a WordPress website.
Command LineUse the following WP-CLI command: wp core update --version=6.8-beta3
WordPress PlaygroundUse the 6.8 Beta 3 WordPress Playground instance to test the software directly in your browser without the need for a separate site or setup.
\n\n\n\n

The current target date for the final release of WordPress 6.8 is April 15, 2025. Get an overview of the 6.8 release cycle, and check the Make WordPress Core blog for 6.8-related posts in the coming weeks for more information.

\n\n\n\n

Catch up on what’s new in WordPress 6.8: Read the Beta 1 and Beta 2 announcements for details and highlights.

\n\n\n\n

How to test this release

\n\n\n\n

Your help testing the WordPress 6.8 Beta 3 version is key to ensuring everything in the release is the best it can be. While testing the upgrade process is essential, trying out new features is equally important. This detailed guide will walk you through testing features in WordPress 6.8.

\n\n\n\n

If you encounter an issue, please report it to the Alpha/Beta area of the support forums or directly to WordPress Trac if you are comfortable writing a reproducible bug report. You can also check your issue against a list of known bugs.

\n\n\n\n

Curious about testing releases in general?  Follow along with the testing initiatives in Make Core and join the #core-test channel on Making WordPress Slack.

\n\n\n\n

Vulnerability bounty doubles during Beta/RC

\n\n\n\n

Between Beta 1, released on March 4, 2025, and the final Release Candidate (RC) scheduled for April 8, 2025, the monetary reward for reporting new, unreleased security vulnerabilities is doubled. Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Beta 3 updates and highlights

\n\n\n\n

WordPress 6.8 Beta 3 contains more than 3 Editor updates and fixes since the Beta 2 release, including 16 tickets for WordPress core.

\n\n\n\n

Each beta cycle focuses on bug fixes; more are on the way with your help through testing. You can browse the technical details for all issues addressed since Beta 3 using these links:

\n\n\n\n\n\n\n\n

A Beta 3 haiku

\n\n\n\n

Beta three refines,
WordPress shapes with steady hands,
Code grows into form.

\n\n\n\n

Props to @benjamin_zekavica @krupajnanda @ankit-k-gupta @joemcgill for proofreading and review.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18634\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 6.8 Beta 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2025/03/wordpress-6-8-beta-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 11 Mar 2025 15:46:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18619\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:289:\"WordPress 6.8 Beta 2 is ready for download and testing! The scheduled final release date for WordPress 6.8 is April 15, 2025. Your help testing Beta and RC versions over the next five weeks is vital to ensuring the final release is everything it should be: stable, powerful, and intuitive.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:5940:\"\n

WordPress 6.8 Beta 2 is now ready for testing!

\n\n\n\n

This beta version of the WordPress software is under development. Please do not install, run, or test this version of WordPress on production or mission-critical websites.  Instead, you should evaluate Beta 2 on a test server and site.

\n\n\n\n

You can test WordPress 6.8 Beta 2 in four ways:

\n\n\n\n
PluginInstall and activate the WordPress Beta Tester plugin on a WordPress install. (Select the “Bleeding edge” channel and “Beta/RC Only” stream.)
Direct DownloadDownload the Beta 2 version (zip) and install it on a WordPress website.
Command LineUse this WP-CLI command: wp core update --version=6.8-beta2
WordPress PlaygroundUse the 6.8 Beta 2 WordPress Playground instance to test the software directly in your browser.  No setup is required–just click and go! 
\n\n\n\n

The current target date for the final release of WordPress 6.8 is April 15, 2025. Get an overview of the 6.8 release cycle, and check the Make WordPress Core blog for 6.8-related posts in the coming weeks for more information.

\n\n\n\n

Catch up on what’s new in WordPress 6.8: Read the Beta 1 announcement for details and highlights.

\n\n\n\n

How to test this release

\n\n\n\n

Your help testing the WordPress 6.8 Beta 2 version is key to ensuring everything in the release is the best it can be. While testing the upgrade process is essential, trying out new features is equally important.  This detailed guide will walk you through testing features in WordPress 6.8.

\n\n\n\n

If you encounter an issue, please report it to the Alpha/Beta area of the support forums or directly to WordPress Trac if you are comfortable writing a reproducible bug report. You can also check your issue against a list of known bugs.

\n\n\n\n

Curious about testing releases in general? Follow along with the testing initiatives in Make Core and join the #core-test channel on Making WordPress Slack.

\n\n\n\n

Vulnerability bounty doubles during Beta/RC

\n\n\n\n

Between Beta 1, released on March 4, 2025, and the final Release Candidate (RC) scheduled for April 8, 2025, the monetary reward for reporting new, unreleased security vulnerabilities is doubled. Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Beta 2 updates and highlights

\n\n\n\n

WordPress 6.8 Beta 2 contains more than 14 Editor updates and fixes since the Beta 1 release, including 21 tickets for WordPress core.

\n\n\n\n

Each beta cycle focuses on bug fixes; more are on the way with your help through testing. You can browse the technical details for all issues addressed since Beta 1 using these links:

\n\n\n\n\n\n\n\n

A Beta 2 haiku

\n\n\n\n

Second wave refines,
Lines of code like rivers flow,
WordPress finds its form.

\n\n\n\n

Props to @ankitkumarshah @vgnavada @krupajnanda @michelleames @audrasjb @marybaum @ecgan for proofreading and review.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"18619\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}s:27:\"http://www.w3.org/2005/Atom\";a:1:{s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:4:\"href\";s:32:\"https://wordpress.org/news/feed/\";s:3:\"rel\";s:4:\"self\";s:4:\"type\";s:19:\"application/rss+xml\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:44:\"http://purl.org/rss/1.0/modules/syndication/\";a:2:{s:12:\"updatePeriod\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"\n hourly \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:15:\"updateFrequency\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"\n 1 \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:4:\"site\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"14607090\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:48:\"WpOrg\\Requests\\Utility\\CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:12:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Fri, 16 May 2025 08:38:56 GMT\";s:12:\"content-type\";s:34:\"application/rss+xml; charset=UTF-8\";s:4:\"vary\";s:37:\"Accept-Encoding, accept, content-type\";s:25:\"strict-transport-security\";s:12:\"max-age=3600\";s:6:\"x-olaf\";s:3:\"⛄\";s:13:\"last-modified\";s:29:\"Wed, 07 May 2025 14:01:21 GMT\";s:4:\"link\";s:63:\"; rel=\"https://api.w.org/\"\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:16:\"content-encoding\";s:2:\"br\";s:7:\"alt-svc\";s:19:\"h3=\":443\"; ma=86400\";s:4:\"x-nc\";s:9:\"HIT ord 1\";}}s:5:\"build\";i:1747322142;s:21:\"cache_expiration_time\";i:1747427936;s:23:\"__cache_expiration_time\";i:1747427936;}','off'),(344,'_transient_timeout_feed_d117b5738fbd35bd8c0391cda1f2b5d9','1747427937','off'); +INSERT INTO `wp_options` VALUES (345,'_transient_feed_d117b5738fbd35bd8c0391cda1f2b5d9','a:6:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:61:\"\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"WordPress Planet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"en\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"WordPress Planet - http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:50:{i:0;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"Do The Woo Community: Why Contributor Day in Basel is a Must-Do\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96961\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://dothewoo.io/blog/why-contributor-day-in-basel-is-a-must-do/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:168:\"Contributor Day at WordCamp Europe 2025 is a community event on June 5th in Basel, Switzerland, encouraging contributions to the WordPress project for all skill levels.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 16 May 2025 07:41:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:37:\"Matt: Jony Ive & Patrick Collison\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=142505\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"https://ma.tt/2025/05/jony-ive/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:85:\"

A really beautiful interview.

\n\n\n\n
\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 16 May 2025 00:08:37 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:108:\"Do The Woo Community: Lessons Learned From 15 Years of Building Complex WooCommerce Sites with Matt Schwartz\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=96975\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:107:\"https://dothewoo.io/lessons-learned-from-15-years-of-building-complex-woocommerce-sites-with-matt-schwartz/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:241:\"In Woo AgencyChat, host Robert Jacobi chats with Matt Schwartz from Inspry about their journeys in WordPress, WooCommerce insights, lessons in agency growth, and the importance of educating clients on Woo\'s capabilities and responsibilities.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 15 May 2025 08:57:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"WPTavern: #169 – Wes Tatters on the Evolution of Internet Communities and WordPress Open Source\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=195791\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:111:\"https://wptavern.com/podcast/169-wes-tatters-on-the-evolution-of-internet-communities-and-wordpress-open-source\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:49582:\"Transcript
\n

[00:00:19] Nathan Wrigley: Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.

\n\n\n\n

Jukebox is a podcast which is dedicated to all things WordPress. The people, the events, the plugins, the blocks, the themes, and in this case a personal journey through the history of the internet from start to now.

\n\n\n\n

If you’d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to wp tavern.com/feed/podcast, and you can copy that URL into most podcast players.

\n\n\n\n

If you have a topic that you’d like us to feature on the podcast, I’m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wp tavern.com/contact/jukebox, and use the form there.

\n\n\n\n

So on the podcast today, we have Wes Tatters. Wes has been immersed in the tech space for close to four decades, starting his journey with early computers like the Commodore 64 and TRS 80. He’s been an author, with multiple books on internet technologies to his name, has worked across AV and media, and today he’s the driving force behind Rapyd Cloud, a globally distributed hosting company. Wes’ perspective is shaped as much by his hands-on experience building communities on CompuServe, AOL and MSN, as by his deep involvement with modern open source platforms like WordPress.

\n\n\n\n

Wes starts off by sharing some of the fascinating stories from the early web, when getting online meant stringing together modems and bulletin boards, and long distance communication felt nothing short of miraculous. He talks about the evolution of the internet as a space for community, and how chance encounters in early online forums led to opportunities like writing for Netscape and shaping the very first JavaScript Developer Guides.

\n\n\n\n

We then discuss the changing meaning of community across different eras of the internet, touching on the shift from closed walled gardens, like AOL, to the open source ethos that powers projects like WordPress, and much else that we take for granted online. Wes describes how WordPress’ flexibility and openness allowed anyone, anywhere, to claim their own piece of the web without technical barriers, and how this has contributed to its rise as a cornerstone of global digital freedom and self-expression.

\n\n\n\n

Our conversation also examines the challenges, and potential missteps, of the modern internet from social loneliness, to the commercial world of social media. And reflects on WordPress’s role in helping steer a path back to more positive, open, and empowering online experiences.

\n\n\n\n

If you’re interested in how the history of the internet directly shaped WordPress, the Open Web, and the communities we build today, this episode is for you.

\n\n\n\n

If you’d like to find out more, you can find all of the links in the show notes by heading to wp tavern.com/podcast, where you’ll find all the other episodes as well.

\n\n\n\n

And so without further delay, I bring you Wes Tatters.

\n\n\n\n

I am joined on the podcast today by Wes Tatters. Hello, Wes.

\n\n\n\n

[00:03:50] Wes Tatters: Nathan, good to be talking together again.

\n\n\n\n

[00:03:53] Nathan Wrigley: I’ve got to be very, very, accommodating of Wes’ time, because for me it’s about four in the afternoon, something like that. Wes, on the other side of the planet, is giving up his time at about one in the morning. I have no idea why you are here, but I appreciate it. Thank you.

\n\n\n\n

[00:04:07] Wes Tatters: Oh look, my day tends to be largely focused on talking to people in Europe, and in the United States. Half my employees are in those parts of the world as well. So I tend to work midnight to midnight. And we’re in the middle of a big product launch, for Rapyd, which has meant we’re just talking, and being visible, and I’m awake and happy to chat.

\n\n\n\n

[00:04:25] Nathan Wrigley: So you literally pivot your day, your Australian day, you pivot it so that you are available for North American and European customers. So we should probably say you work for a hosting company called Rapyd Cloud, And that’s where the thrust of your marketing endeavors go. So you pivot your day?

\n\n\n\n

[00:04:41] Wes Tatters: Yeah, like about, I think about 60% of our customers are in the United States, and about 30, 45, 35 are in Europe, and 5% or something in Asia, Which is pretty generic for the WordPress space. Our focus is around obviously those markets, but also because we’re a global company, we don’t have a head office.

\n\n\n\n

Everyone who works in our team is doing it remotely. It might be Dubai, or Chicago or the Philippines or Pakistan, India. So we choose times of the day, we have this great calendar and for every meeting we post up a list of all the times, and then there’s happy faces, red faces and smiley faces. And someone will go, all right, I’ll take the red face. That’s the nature of WordPress though.

\n\n\n\n

[00:05:21] Nathan Wrigley: Yeah, madness though, when you think about it. If you were to rewind the clock 30 years none of this was possible. I mean here, I am talking you through a web browser, as if it’s nothing, and it is utterly remarkable. And actually that’s going to be the thrust of this conversation, I think. We’re going to trace the WordPress community in particular, not just the community, the software and what have you, over the period of time it’s been in existence, 21 years odd.

\n\n\n\n

So, do you want just give us your backstory, specifically I guess around WordPress, but just generally in tech? Because I know you’ve done quite a lot of other AV related things as well.

\n\n\n\n

[00:05:54] Wes Tatters: I’ve, been in the tech space for close to 40 years. I was trying to work it out a little while ago, and it’s like, I remember my first computer. It was a Commodore 64 or something, or a TRS 80, or something like that. And I would’ve been 16 or 17, and even then it was like, I was programming them, not playing games on them. I enjoyed programming and coding.

\n\n\n\n

So I started very early in the tech space, but as a result of which, even modems didn’t really exist when I first started in the IT space. Laptops and PCs and computers and certainly iPhones and all that wonderful technology we have today didn’t exist.

\n\n\n\n

But there was already people in the space at places like DARPA, that were going, how do we connect the world? It was a government military strategy. How do we connect the world in the event of a nuclear war? That was the driving mentality behind what they were planning. It was originally going to be a network of radio towers sending, a bit like we had with the old modems, the buzzing noises.

\n\n\n\n

But it was this whole concept of, how do we build a disconnected system that can survive massive breakdowns in the structure of communication? And a part of what they build, ironically, is what makes the internet so powerful these days. It’s that ability to interconnect disparate technologies, disparate systems, all different types of capabilities and devices and all those sorts of things, in ways that are transparent.

\n\n\n\n

As you just said, we’re in two parts of the world and we are talking together in real time. I grew up in the, as a part of my life, in the media world, and film and television and primarily television. In a point in time where if we wanted to conduct a live interview with someone on the other side of the world, firstly, we had to book satellite space in the thousands of dollars per minute almost. And then we would go, Nathan, are you there?

\n\n\n\n

And Nathan would come back four seconds later, and we would conduct these really bizarre interviews, with delays on this crazy technology. So much so that when live television was first starting, obviously there was a big fear that someone would say naughty words, or swear on television for the want of a better word. And one of the early ways that they originally managed, we have what’s called, a lot of television stations had this big red button called a dump button.

\n\n\n\n

The whole idea was someone said f, someone had to slam the big dump button. But the way they we’re actually handling it was they were actually sending the entire signal up to a satellite and back down to the ground station before they transmitted it. Because that gave them roughly two or three seconds of delay, which gave them the ability for that big red button to stop the transmission point. But the signal had gone up and down through a satellite just to even achieve that craziness.

\n\n\n\n

I came into that world, and started in that world. I was incredibly lucky that I lucked into an IT firm, here in Australia, that was at that stage of company that doesn’t even exist anymore. It’s a company called Wang Microsystems. Dr. Wang was the guy that invented the first memory ship, so he, he’s reasonably well healed, but that entire platform doesn’t exist. But Wang was one of the first it companies to release a processor with a box. There was this three racks that was a modem.

\n\n\n\n

300 characters per second. It was bleedingly fast. But for, its time, and I was one of the first people that got to play with one of those things in Australia. And I’ll tell you what, I was hooked. I just went, even then I could go, oh my goodness. There were dreams of we can make it faster.

\n\n\n\n

And we got 1200 baud, and then we got 1600 baud, and then we got 3,200 baud and 56 k. And every bit was exciting. Because what it was allowing me as a person to do, especially a person in Australia, was to reach out and communicate with people that weren’t in my part of the world. And we had things like America Online, well CompuServe first, I guess prior to America Online.

\n\n\n\n

We had bulletin boards and local BBS software and things like that. And all of them were creating communities. All of them were starting to build communities around this same space. It was something that I really engaged with.

\n\n\n\n

When I got into CompuServe though, it for me changed a lot of things. Because until that stage it was hard to communicate with anyone outside Australia. But with CompuServe, all of a sudden, I was connected to people around the world.

\n\n\n\n

[00:10:37] Nathan Wrigley: What did that connection actually feel like though? Was it literally, you’d type something, and was it you’d leave the computer, like the email sort of exchange?

\n\n\n\n

[00:10:46] Wes Tatters: They were really very, very similar to an early sort of discussion board. People would leave comments, and people would make comments back and respond, and people built relationships and discussions were built. And in my early life I was an author. I’ve written a number of books on internet technologies.

\n\n\n\n

This is the guy in Brisbane, Australia, who happened to luck into a forum on CompuServe with a guy named Mark Tabor, who was the head of publishing acquisitions for Schuster and Schuster, which is McMillan, and sams.net, the biggest publisher on the planet.

\n\n\n\n

And Mark was going, we are looking for authors to write in this space. They were releasing a new imprint at the time called sams.net, which was going to be like. Theirs was Teach Yourself series.

\n\n\n\n

They were building it at McMillan, and their biggest problem was respectfully that IT people don’t make good writers. Love us, or like us, we don’t even like writing comments in code, let alone knocking out 4 or 500 pages of a book, to tell someone how to do something.

\n\n\n\n

But that ability to be in a community outside of my own space, this is me in Brisbane, Australia, talking to the head of acquisitions for Macmillan, going, yeah, I can write a book. I’d already been doing some writing. I had, as I said from, because I have a media background, I’d been writing for magazine articles in Australia, and I’d been involved in communications and had some journalism experience, so I was kind of already in the space.

\n\n\n\n

And yeah, the book got written. We actually wrote a book that told people how to connect CompuServe to the internet, because previously CompuServe couldn’t be connected to the internet.

\n\n\n\n

[00:12:21] Nathan Wrigley: Do you remember those times like halcyon day’s, rose tinted spectacles. Because that was real pioneering stuff. The idea that, okay, so dear listener, if you are under the age of 30, your world was entirely connected from the moment you could conceive a thought. In some respect you could turn the tele on and be live tele from around the globe. You may not have had internet access.

\n\n\n\n

[00:12:44] Wes Tatters: I remember trying to explain to my parents what I was doing, and they were looking at me going, you’re doing what? And it wasn’t until the first book, 500 pages, 50 copies arrived in a box from McMillan, that the lights went on in parents’ head who went, okay.

\n\n\n\n

[00:13:04] Nathan Wrigley: There’s something in this.

\n\n\n\n

[00:13:05] Wes Tatters: This is odd. And we sold hundreds of thousands of copies of edition of these books. I wrote the same book for America Online.

\n\n\n\n

The joke was America Online actually wasn’t even in Australia at that stage, which was interesting. But it gave me lots of opportunities, and this was about communities. This was about getting into communities. While I was in that community, talking, working with the a AOL team on how they were going to connect to this thing called the internet. There was a little crowd called Netscape banging around, going hey, love what you did, Tim. Love that original browser. We’re going to build a better one.

\n\n\n\n

[00:13:37] Nathan Wrigley: An open one.

\n\n\n\n

[00:13:38] Wes Tatters: An open one. And the Netscape guys had seen my books, came to my publisher and said, hey, could we do a book with Wes on how to write, how to build websites for Netscape? So we wrote six books for Netscape over the next five years, going teach yourself HTML development for Netscape. So community was the whole basis of it.

\n\n\n\n

[00:14:03] Nathan Wrigley: It’s so curious that for people that are born in the last, like I said, 20 years or so, the internet has just been a feature of their life, almost like a utility. Almost in certain parts of the world, like a human right. You might even describe it on that level.

\n\n\n\n

This conduit of information that can come in. This capacity to talk to people, any point on the globe almost immediately with almost zero cost. And in the time that you are describing just the merest foundations of that were beginning. Little glimmers of that would beginning to emerge.

\n\n\n\n

[00:14:34] Wes Tatters: Really edge.

\n\n\n\n

[00:14:35] Nathan Wrigley: Really interesting though. I can imagine your passion and interest and all of that must have been. The curiosity that was spiked by that.

\n\n\n\n

[00:14:42] Wes Tatters: It was. I loved it. But even then, we still didn’t truly understand where it was going.

\n\n\n\n

I remember a call from the team at Netscape going, it was around, I think it was around version three of the Netscape. Going we’ve got this idea we’re going to, we’re going to put a scripting thing in Netscape. What do you think? And I’m going, yeah. What do you mean? What do you think? We need you to include it in the next book. It’s this little thing called JavaScript.

\n\n\n\n

[00:15:04] Nathan Wrigley: Just little thing.

\n\n\n\n

[00:15:06] Wes Tatters: And I remember sitting there going, interesting idea. Can you tell me more about what it can do? And they went, we don’t really know yet. We’re still working on those bits. So we ended up writing the first JavaScript development guide, me and my technical writer, who was my technical editor for my Netscape books. And I wrote the first JavaScript Developers Guide for Netscape.

\n\n\n\n

So we were there in the middle of it, but all the way through, we still didn’t truly get it. It was still such this small thing. I was talking with Bud.

\n\n\n\n

[00:15:37] Nathan Wrigley: Bud Kraus.

\n\n\n\n

[00:15:38] Wes Tatters: Yeah, I was talking with Bud at PressConf, and we were chatting about just the way the internet’s evolved. I had the opportunity to meet Tim Burnes Lee.

\n\n\n\n

[00:15:46] Nathan Wrigley: Nice, the Godfather.

\n\n\n\n

[00:15:48] Wes Tatters: The Godfather of the internet. And listening to Tim talking about his dream of the internet and the worldwide web, this was a worldwide web conference seven, which was back before WordCamps. It was, that was what a WordCamp looked like before it was WordPress. And I look back and I was thinking, and I’m going, there were some serious names at that event. Tim Burnes Lee was there. James Gosling, the founder of Java, was there.

\n\n\n\n

And these were guys doing for the want of a better WordCamp style sessions, chatting about these ideas they’ve had. Seeing even then that what the worldwide web, and what we’ve grown into with WordPress had the potential to be, was entirely different to the way the world thought before that.

\n\n\n\n

I remember there was like, I think it was the Friday night. I actually ran the media for that particular conference, that was held in Australia. It was the first time being held out of the northern hemisphere. But no fully explained reason, it was being held in Australia, in my hometown, and I ran all the media for it.

\n\n\n\n

And I remember some guys, they had this sort, they were going to create this shoe library, it was like, this is the early web. Who knows what we’re going to do with it? We want a shoe library.

\n\n\n\n

[00:17:00] Nathan Wrigley: A shoe library, yeah.

\n\n\n\n

[00:17:01] Wes Tatters: They taking photographs of people’s shoes, and I remember it was like 7:30 on a Friday night, and Tim’s in a pair of slacks and a t-shirt. Taking his shoes off so that they could photograph his shoes, so that his photograph of his shoes could go into the shoe library.

\n\n\n\n

[00:17:19] Nathan Wrigley: Of course.

\n\n\n\n

[00:17:20] Wes Tatters: And this is the guy that invented the thing that we all live on. This is the father of everything we do today. But even then, he was this amazingly humble person, that was happy to have a chat with a bunch of kids and take photos of his shoes. It’s a different world.

\n\n\n\n

[00:17:38] Nathan Wrigley: When you are where you’re at. So in the year 2025, we’re concerned about the internet now. And so the way it ended up is how it now is. And honestly, it’s not one of those things that you pick apart, as like what is the history? What were the dominoes that fell to make the internet, what it now is?

\n\n\n\n

Like, history, politics and warfare, and all of those kind of things get dealt with by historians. The migration of people over great land masses, all of the kings, queens, all of that.

\n\n\n\n

But this, this kind of doesn’t, and it’s fascinating to listen to you there, because it feels like it could have gone in so many different directions. Maybe would’ve been a more AOL type thing, where everything was closed and you had to buy into AOL, and everything was handled by AOL. It didn’t turn out that way. Open won. I’m not entirely sure that we didn’t swing back to closed with things social media?

\n\n\n\n

[00:18:29] Wes Tatters: One of the things that caused that was the people who started using the technology that DARPA invented first, and it was universities.

\n\n\n\n

[00:18:41] Nathan Wrigley: Oh, interesting. That was the client base, wasn’t it? It was the academics.

\n\n\n\n

[00:18:44] Wes Tatters: It was the academics. So Tim’s original agenda was to obviously create a way to communicate with all the scientists in Cern what was happening in the accelerator that was sitting under three countries. Even then it was about community and communication. But as it’s walked forward, I look at the whole journey of the internet and at every point community has been a part of that.

\n\n\n\n

The ability to share things. The whole basis of what we have today in open source, moving towards WordPress, is about communication. So you can’t have open source without a group of people coming together to collaborate on a project as large as WordPress, or as large as, Linux or as large as Drupal, or as large as all of these other projects. And they’re not being paid for the most part.

\n\n\n\n

They’re doing it because of community, and the underlying technology behind that obviously is the internet. And more insignificantly since then this thing called the World Wide Web that Tim originally envisaged as a tool for sharing.

\n\n\n\n

[00:19:56] Nathan Wrigley: Yeah. But just tool for sharing with a handful of academics, and then it just grew exponentially. Do you remember the first time that the internet became more social. No, let me rephrase that. Do you remember when the internet shifted from something which a few people did? To something where, not the majority, but it was like hard to ignore at that point. Because definitely as a child have a of no internet.

\n\n\n\n

[00:20:20] Wes Tatters: Done badly, but Microsoft MSN. Windows 95 was the watershed. So Windows 95 launched, and for the first time, anyone, in inverted commas, with a modem didn’t need to know someone at a university. Didn’t need to know how to hard wire AOL to connect to something else. They could literally go get me on the internet, and it happened. So that was the watershed moment.

\n\n\n\n

Now, MSN as a platform also was heavily driven by community. And again, like it or love them, the original version of Messenger, an embarrassing mess, but it started the concept of community. The original version of MSN was a place where you could go and chat. Their design philosophies around. I remember, in Australia, 9 MSN was, the branding of it. 9 here is our major television network, and they partnered with MSN, in Microsoft and Australia and our major telco to bring MSN to Australia. But it was heavily geared around building communities. And I was quite active in that MSN community in Australia.

\n\n\n\n

We used to do things like popular TV shows would go to air, and then we would host forums where the actor, or the presenter, or someone from the show would hop literally straight off, the show would end at 9:30, and they would be in a forum going, and hey, tonight we’ve got insert name of whoever it is.

\n\n\n\n

And people could ask them questions. And we curated it. I was a part of the curations team at 9 MSN at that stage. And, again, it was using this crazy technology to build community, and to expand communities.

\n\n\n\n

Now for that network they were using as just obviously a marketing tool, but what it was doing underneath it was again, building this ethos of communities and spaces.

\n\n\n\n

We then have obviously Facebook that took that and ran with it in crazy directions, and commercialized it. But underneath it we’re still this open source thing. There’s still whole open source community.

\n\n\n\n

[00:22:31] Nathan Wrigley: Do you remember the moment as well when the internet went more from a consumption kind of thing? So you know, you would log onto somebody else’s property, MSNs Messenger or whatever it may be. I do remember that, by the way. To I can own a bit of the web, a bit of that whole thing can be something that I am in control of. And now we move towards CMSs I guess.

\n\n\n\n

[00:22:51] Wes Tatters: So this is probably 98 initially. So we were still writing books and Netscape was still trying to work out what they were doing in the world. And, Tim was, Tim was out telling people how big the internet could be. And I remember lots and lots of people, as I said, James Gosling’s come down, Tim Berners Lee’s come. The BBC had flown two camera teams, journalists, The Times had flown out people. NBC and CBS had flown out camera crews and to be at this event. Because Sir Tim was becoming Professor Tim at that stage. He was being reordered, a honorary doctorate from an Australian university. It was a big event.

\n\n\n\n

Could not get a single Australian broadcaster to even show up. Now, put this in perspective. I knew them all. I was actually in that industry. I knew the people. I literally was on the phone to news directors going, dude, just send me one cameraman. Oh, what’s this thing? What’s this thing? It was the internet.

\n\n\n\n

So 95 to 98, it was still a bit hokey. I think where it really started to change though is when things like WordPress started to arrive. Because before that my books on how to build a website, I love meeting people and go, I think I’ve got your book on a shelf somewhere. It was, and it was always either mine or Laura Lemay’s.

\n\n\n\n

Laura and I were both writing in parallel for the same publisher. And some of her chapters are in my books, my chapters in her books. But then it was, we were still hacking HTML. If you wanted to use JavaScript, it wasn’t jQuery or anything like that. You were writing lines of code and hoping it worked.

\n\n\n\n

And there were some predecessors and other things. Microsoft had to go at the same thing. Microsoft released a product called ASP, a little thing that.

\n\n\n\n

[00:24:32] Nathan Wrigley: Oh yeah, that’s right. Active Server Pages.

\n\n\n\n

[00:24:35] Wes Tatters: Yeah, and then they released a thing called asp.net, and this wonderful new programming language called C#. And that was their push into this community space. They released open source product with it. They released a product which was called I Buy Spy Portal, which was eventually then forked into a product by a guy named Sean Walker to become a product called DotNetNuke, which was literally their version of WordPress.

\n\n\n\n

I was there, I know Sean. I was in that space, and we were building communities again, coming outta the Microsoft space on DotNetNuke. At the same time, this little thing called WordPress was happening in parallel. At that stage, ironically, at that stage, I think DotNetNuke was actually more a CMS than WordPress was. Because WordPress was still really a blogging tool. It was still really MySpace for people who actually had a desire to code a bit.

\n\n\n\n

But I think it was then, that WordPress journey, the arrival of a mechanism that did two things. It allowed you to create a website without knowing how to code, and it allowed you to become a part of something, a community online, where you could all of a sudden reach out of your local neighborhood, your local city, your country, into the rest of the world. And take things to the rest of the world. Sell products to the rest of the world. Communicate to the rest of the world. Share your opinions and thoughts. In the past, you could do that on CompuServe. You could do that on America Online. But in all those places, you didn’t own your content.

\n\n\n\n

[00:26:16] Nathan Wrigley: Right, exactly that.

\n\n\n\n

[00:26:18] Wes Tatters: Even MySpace, sort of like the predecessor to almost Facebook. Facebook groups and forums. None of these spaces you owned your content. And so I think WordPress in its initial incarnation, a blog, was a way for people to start expressing their feelings. And the concept of blogging. And then we started to grow that how do we get our blog to the world? Well, RSS feeds, and then aggregators, and then this wonderful thing called Google came along.

\n\n\n\n

[00:26:45] Nathan Wrigley: Discoverability.

\n\n\n\n

[00:26:47] Wes Tatters: Discoverability, and visibility. And all along that journey, there’s this guy in the states beavering away, we’re talking about Matt, with a vision of what WordPress could be in that space. And he was creating that in parallel to these communities starting to emerge, to these other companies like Google, and Facebook building closed enclaves.

\n\n\n\n

Where Matt, obviously very passionate about open source, had a philosophy to build this space that people could use, that people could communicate and share. It was incredibly open. Anyone could write a plugin. Anyone could write a theme. Anyone could decide that they wanted to commercialize that space by selling their theme or selling their plugin.

\n\n\n\n

Hosting companies could host that platform. So the fact that was such an open product, tweaked something in the consciousness of the time. It tweaked something in that desire to communicate, but also I guess a concept of freedom to communicate.

\n\n\n\n

Freedom of speech is a passionate position of a lot of countries. The right to freedom of speech, and to a certain extent the right to express an opinion, safely. Or in some cases the rights to communicate in communities.

\n\n\n\n

I discovered during Covid that the platform that Rapyd grew out of Buddy Boss, which is a social media platform creation tool for WordPress. Install Buddy Boss and you’ve got your own private Facebook.

\n\n\n\n

We discovered that there were communities using Buddy Boss to communicate things to their people that they were terrified to communicate on private spaces, like social media or Facebooks. I know people specifically in some of those communities, doctors, other frontline groups and organizations that were facing the real challenges of what was happening in Covid and impacts of those things. They were able to use that gift of community, freely given, freely shared, where you own your raw data in ways that I hadn’t even considered.

\n\n\n\n

And for reasons that I hadn’t even considered. And each time I look at it, people find ways to use community creatively and in incredible ways. And we find that at the core of WordPress.

\n\n\n\n

[00:29:14] Nathan Wrigley: Yeah, we really do. I remember the first time I ever produced anything online, and it wasn’t with a CMS, it was just HTML. There was no CSS at the time, it was just tables and things. But I remember publishing that, a friend of mine knew more than I did, and he said, okay, here’s the environment. Here’s the text file. Just write it in there and, I’ll click a button and it’ll go to some server.

\n\n\n\n

And then I saw it, saw it on his computer. And then I said to him, but it’s on your computer. And he said, no, no, no, if you go home, it’ll be on that computer well.

\n\n\n\n

[00:29:44] Wes Tatters: And if, you go down the library, or you go up the road, and all you needed to know was where it was.

\n\n\n\n

[00:29:50] Nathan Wrigley: And I remembered this profound feeling of, what the heck. That’s so amazing. What, I just put something on your computer, and now anybody in the world should they, discoverability is the big problem, but they could find it. He’s yeah, that’s it. That’s what the internet basically is. And I remember thinking, gosh, what a force for good.

\n\n\n\n

[00:30:10] Wes Tatters: Huge force for good. Unfortunately, it’s also been a force for other things. I had a conversation with Tim, as a part of a set of interviews that the BBC were doing, this was in 1998. And at that stage, Tim was just exploring the idea of what he called the semantic web, which was zaml, and underlying metadata. And what Tim always envisaged the worldwide web should be, he always envisaged that every page, because he’s a data scientist, he envisaged that every page would have a beautiful set of metadata and structures, so that it could be searched and indexed.

\n\n\n\n

Of course that’s everything the worldwide web didn’t become, respectfully. We have enough trouble in the WordPress space remembering to put a, an alt text on a photo that we upload. But his envision was of this beautiful semantic web. So it hasn’t gone exactly the same way as he envisaged.

\n\n\n\n

But even without that semantic web, the additions and add-ons of things like Google, and Google search, and the ability to create an index, a massive index of the web. And now in 2025 going, hey, ChatGPT, can you just tell me the answer to this question please? And then can you write me a presentation?

\n\n\n\n

I was having a meeting with an associate of mine. I haven’t caught up with each other for about six years, and he’s deeply involved in the concept of human centered design, which is, a business practice where you, look at the customer to identify the problem. Not look at the business and try to solve a problem.

\n\n\n\n

He wanted to know about what I was doing in AI and that sort of stuff. And I said, did you know that I could write you a business plan? And they used to spend a lot of money creating business plans for people, and creating sessions and seminars. And I went, I can write you a seminar structure and plan in two minutes, on any topic.

\n\n\n\n

I said, no, we’ll do better. Hey, ChatGPT, tell me what you know about human-centered design and why it’s good. And of course it printed out 20 paragraphs. And then I went, can you summarize that for a presentation seminar? And of course it did that. And then I said, now can you give me the structure of the seminar?

\n\n\n\n

And it did that. And this guy sitting there going, are you kidding? And I said, that’s where we’ve come. But underlying all that is data and information. And none of that’s of any relevance unless you’ve got a community to share it with.

\n\n\n\n

[00:32:23] Nathan Wrigley: Do you have a sense that the internet has gone in a, I’m going to use the word bad or poor direction over the last decade? Do you have a sense that mistakes have been made? If you could rewind the clock, were there any moments in time where you think, I wish it hadn’t have gone in that direction?

\n\n\n\n

Because I often think things like proprietary platforms that kind of want to put a wall around the conversations that we have. They seem like, maybe in 50 years time when we look back, maybe they’ll seem like missteps. I don’t know. Maybe they’ll carry on and it’ll all be, as it is now.

\n\n\n\n

But it does feel like there’s a resurgence more to owning your own conversation. So obviously we do that in WordPress, but it does feel like there’s a bit of a groundswell towards more federated protocols. Things like the AT protocol that Bluesky are doing, but Mastodon and an ActivityPub and those kind of things.

\n\n\n\n

[00:33:12] Wes Tatters: I think again, if you harken back to Tim’s semantic web and, he wrote a document, 2022 I think, which was 30 years on. And he talked about where things had gone. I can tell you right now that the way I read Tim’s take on the worldwide web is that e-commerce was not a part of it. That was not a part of his idea of.

\n\n\n\n

[00:33:36] Nathan Wrigley: Yeah, how would you even have conceived that?

\n\n\n\n

[00:33:38] Wes Tatters: Yeah, e-commerce wasn’t a thing. I don’t truly think, Snapchatting or no fully explained reason, 15 second videos in TikTok were anywhere on the radar, because there was this whole deal of philosophy. But each of these things actually has the same underlying traits.

\n\n\n\n

It’s all about communities, it’s all about relationships and building relationships with people. Where I think personally we have made a misstep is in how our younger generations consume that community.

\n\n\n\n

[00:34:12] Nathan Wrigley: It’s a lot.

\n\n\n\n

[00:34:12] Wes Tatters: Well, it’s more than a lot. There was a survey done and I haven’t got the figures in front of me, because I wasn’t planning on discussing where we were here. That’s looked at the level of loneliness of people in 2025, compared to the level of loneliness of 20 and 30 years ago. And it directly related this online community thing. The, unfortunately, what do we call false community sometimes. The people we have never met that we talk to in a Snapchat or something like that, that are not community, and they’re not really our friends.

\n\n\n\n

And there is an increase in loneliness. And I think if there’s any misstep that we as a society have maybe taken out of this thing, is a lack of understanding of the impacts of loneliness. And I think the internet’s to blame for that.

\n\n\n\n

[00:35:13] Nathan Wrigley: The internet is so beguiling, isn’t it? Because there’s so much interesting stuff there. I think throw the mobile phone into that equation as well. This always on device, which is available 24 7. But it’s that capacity, incapacity, to put it down. You start doing something with it and then five minutes later you realize, often, in many cases, five minutes is not even the benchmark. More like an hour or something.

\n\n\n\n

[00:35:36] Wes Tatters: And, there are clinical reasons for that. We’re actually getting out of these devices the same dopamine hits that lead to depression. The same dopamine hits that lead to mood swings and to a certain extent mental health issues.

\n\n\n\n

We now have this whole, go on the internet and you’ll get, especially when you’re hitting my age, are you dopamine deprived? Join this, get on this dopamine detox. And it’s real. It’s a real problem. And the five minutes bursts, the swiping, the scrolling, the doom, scrolling, they’re not things that you could have even comprehended. We have all this data, massive amounts of data available to it, but we prefer to consume a, TikTok video, or look at photos of funny dogs or kittens, or dogs and kittens or whatever it is. The internet and the things that have grown out of that, have all contributed to that.

\n\n\n\n

[00:36:32] Nathan Wrigley: It really is interesting. Bit of a double-edged sword, really. Like on the one hand, the internet is probably the greatest innovation, maybe of all time. Or the electric light or, you know, what did the Romans us kind of thing.

\n\n\n\n

But also, curiously, it also has aspects of it which are really deleterious to humanity, and can really bring out the worst. It allows us to consume the worst to, I don’t know, to spend hours where we probably got other things that we should be doing, but for some reason we can’t let go of the phone, and things like that. So it is really curious.

\n\n\n\n

[00:37:06] Wes Tatters: It’s the speed that it’s happened.

\n\n\n\n

[00:37:08] Nathan Wrigley: And continues to happen. I don’t see any slowing down.

\n\n\n\n

[00:37:12] Wes Tatters: At PressConf the other day, one of the sessions was an AI session. Of course there’s going to be an AI session. Seriously, if you go to the opening of a restaurant in the town center, there’s some guy doing a presentation, and we’ve got Barry to talk about AI for 15 minutes. It feels like that anyway.

\n\n\n\n

One of the demonstrations was about two paragraph script, and it said effectively, hey, insert name of AI tool. I want you to create me a five second video, and I want the five second video to be of a dinosaur running out of a valley with a volcano erupting in the background. And as the dinosaur runs towards the camera, the ground shakes and the dinosaur’s then going to pass to the right hand side. And I’d like it to look a bit like Jurassic Park. That was literally the wording, and you hit enter not that long later, here’s a 15 second video that looks lifelike, realistic.

\n\n\n\n

[00:38:05] Nathan Wrigley: Jurassic Park.

\n\n\n\n

[00:38:06] Wes Tatters: It literally was, you may as well have been in the feature film. 10 years ago, 20 years ago, that would’ve cost couple of million dollars for that five seconds of animation. Now it’s literally something you can get on your mobile phone.

\n\n\n\n

[00:38:20] Nathan Wrigley: Anybody can get on their mobile phone.

\n\n\n\n

[00:38:22] Wes Tatters: I was looking at a video thing today. I was like, some AI tool where you can go, hey, can you, put me in a video of me flying? Yeah, sure. I just need 10 photos of you please. And, now what would you like to fly over? Yeah, technology’s changed.

\n\n\n\n

[00:38:35] Nathan Wrigley: Madness though, when you think about it, if you were to rewind the clock 30 years none of this was possible. I mean here I am talking you through a web browser as if it’s nothing. And it is utterly remarkable.

\n\n\n\n

[00:38:48] Wes Tatters: So we live in a society where we’ve moved from the first time anyone heard of a deep fake, but now it’s just what you do when you’re at lunch break.

\n\n\n\n

Things are changing. Forget about the ethics, the morals, and all those things, but our technology has changed. So yeah, to answer the question, are there missteps? Probably. But the interesting thing about the internet, and it’s something that was built into it at the beginning at DARPA, it’s actually got this amazing ability in technology to recorrect itself.

\n\n\n\n

And that was how DARPA was built. The whole idea was, if you can’t get it this way, it’ll go this way. And if you can’t get it this way, you’ll find a carrier pigeon, and you’ll keep the communications going. What we’ve discovered with communities, and with groups, is that they seem to have an inordinate way of self-correcting as well, through moderation, through conversations.

\n\n\n\n

When you get critical mass, and you pull enough people together, there is this inordinate ability to self-correct. I don’t fully understand the psychological basis behind it, but it’s fascinating how the internet has this ability to self-correct itself. So maybe over time it will, who knows?

\n\n\n\n

[00:40:02] Nathan Wrigley: Certainly in the world at large at the moment, we do seem to be in need of some sort of self-correction in all sorts of walks of life. And the WordPress community that we are both a part of definitely has had its schism over the last six months or so.

\n\n\n\n

[00:40:17] Wes Tatters: Look, and it’s been, and that’s happened before. And even those things self-correct, because there are communities that are passionate in this space. Yes, there’s been some drama. and there’s no point in having conversation about that. But one of the outputs of that has been interesting new conversations in communities. Not looking at things like how we destroy WordPress, or how we, what we do next, but actually going, how do we build our community? How do we assist our community?

\n\n\n\n

So even in those sort of challenges that every big ecosystem has, the community itself can self-correct. The community itself, can develop new relationships. And people grow out of those things.

\n\n\n\n

PressConf was an amazing example of that. Obviously it had happened before in a slightly different form a number of years ago, but this was, let’s put 150 odd in a space for a weekend, and let ’em all chat and have conversations. And actually have intelligent dialogues and a whole heap of things grew out of it.

\n\n\n\n

When we have WordPress events, we have WordCamps. We have Word Camp Europe coming up. Groups creating new vision. We talk about things like contribution and what contribution looks like. There’s been some negatives about contribution in the recent space, but there’s also been some huge positives about contribution. Out of the drama we’ve had, actually created a new conversation. Many people who didn’t even understand the concept. Oh yeah, I just assumed WordPress was this thing. I never thought that there was actually people giving up their weekends to go to a day in Hyderabad to fix bugs in wordPress. But that’s what people do.

\n\n\n\n

And it actually helped us have a new conversation with a lot of people in the WordPress space that actually hadn’t even comprehended. Because they just assumed that they were, oh yeah, I just downloaded this WordPress thing.

\n\n\n\n

[00:42:13] Nathan Wrigley: Yeah, I do wonder if some things will come out of the year 2025 that would’ve been in the year 2024 unimaginable.

\n\n\n\n

[00:42:21] Wes Tatters: I would say I’m quietly positive. There are lots of conversations, at many layers. I do think, and this is my own personal opinion, that there is a time for speaking and a time for listening. And I think that right now there is a need for a lot of listening from disparate part of the community, and by listening I think a lot of people need to listen to what other people have to say. And then as a community, look at what all those things are. What’s being said, and look at what we do to self correct. I think it’s important to listen.

\n\n\n\n

[00:43:00] Nathan Wrigley: Yeah, a conversation which drifted through what the internet even was and is. Then finally landing on CMSs and WordPress and the community built up around that. So Wes, what a pool of knowledge you are. You’ve really done the entire internet circuit and I’m really glad that we got a chance to speak today. Thank you.

\n\n\n\n

[00:43:19] Wes Tatters: Nathan, it’s been a pleasure. Always happy to chat. It’s about conversation and communities. That’s what matters at the end of the day.

\n
\n\n\n\n

On the podcast today we have Wes Tatters.

\n\n\n\n

Wes has been immersed in the tech space for close to four decades, starting his journey with early computers like the Commodore 64 and TRS-80. He’s been an author, with multiple books on internet technologies to his name, has worked across AV and media, and today, he’s the driving force behind Rapyd Cloud, a globally distributed hosting company. Wes’s perspective is shaped as much by his hands-on experience building communities on CompuServe, AOL, and MSN as by his deep involvement with modern open source platforms, like WordPress.

\n\n\n\n

Wes starts off by sharing some of the fascinating stories from the early web, when getting online meant stringing together modems and bulletin boards, and long-distance communication felt nothing short of miraculous. He talks about the evolution of the internet as a space for community, and how chance encounters in early online forums led to opportunities like writing for Netscape and shaping the very first JavaScript Developer Guides.

\n\n\n\n

We then discuss the changing meaning of “community” across different eras of the internet, touching on the shift from closed, walled gardens like AOL, to the open source ethos that powers projects like WordPress and much else that we take for granted online. Wes describes how WordPress’s flexibility and openness allowed anyone, anywhere, to claim their own piece of the web without technical barriers, and how this has contributed to its rise as a cornerstone of global digital freedom and self-expression.

\n\n\n\n

Our conversation also examines the challenges and potential missteps of the modern internet, from social loneliness to the commercial world of social media, and reflects on WordPress’s role in helping steer a path back to more positive, open, and empowering online experiences.

\n\n\n\n

If you’re interested in how the history of the internet directly shaped WordPress, the open web, and the communities we build today, this episode is for you.

\n\n\n\n

Useful links

\n\n\n\n

Rapyd Cloud

\n\n\n\n

DARPA

\n\n\n\n

AOL

\n\n\n\n

CompuServe

\n\n\n\n

JavaScript Developers Guide written by Wes

\n\n\n\n

PressConf

\n\n\n\n

Worldwide Web Conference

\n\n\n\n

 Tim Burnes Lee

\n\n\n\n

James Gosling

\n\n\n\n

Laura Lemay

\n\n\n\n

ASP

\n\n\n\n

asp.net

\n\n\n\n

DotNetNuke

\n\n\n\n

MySpace

\n\n\n\n

BuddyBoss

\n\n\n\n

Bluesky

\n\n\n\n

AT Protocol

\n\n\n\n

Mastodon

\n\n\n\n

ActivityPub protocol

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 14 May 2025 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:103:\"Do The Woo Community: Why Agency Maturity Matters When Choosing WooCommerce (or Any Ecommerce Platform)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96863\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:106:\"https://dothewoo.io/blog/why-agency-maturity-matters-when-choosing-woocommerce-or-any-e-commerce-platform/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:197:\"This post highlights the significance of assessing business maturity when recommending WooCommerce to clients, ensuring they understand long-term commitments for successful online store management.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 14 May 2025 11:45:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"Matt: Upcoming Talks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=142414\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:37:\"https://ma.tt/2025/05/upcoming-talks/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:233:\"

It’s a busy speaking season! I just spoke at the Intelligent Change summit, and will be at SaaStock in Austin on May 14, SXSW London, on June 4, Brilliant Minds in Stockholm, and WordCamp EU in Basel, Switzerland, on June 7.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 13 May 2025 16:29:51 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"Do The Woo Community: A Recap of PressConf 2025\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=96913\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"https://dothewoo.io/a-recap-of-pressconf-2025/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:253:\"The episode of WordPress Event Talk discusses PressConf, led by new host Michelle Frechette. Our hosts share insights on networking, event structure, participant feedback, and the unique atmosphere of the event, emphasizing community and business focus.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 13 May 2025 11:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"Do The Woo Community: WordPress 6.8 Moved to bcrypt: A Quiet Revolution in Password Security\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96876\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:95:\"https://dothewoo.io/blog/wordpress-6-8-moved-to-bcrypt-a-quiet-revolution-in-password-security/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:178:\"WordPress 6.8 upgrades password security by transitioning to bcrypt, enhancing protection against attacks without disrupting users, while setting new industry security standards.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 12 May 2025 09:31:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:127:\"Gutenberg Times: Gutenberg Changelog 117 – WooCommerce Starter Theme and Blocks, WordCamp Europe, and Gutenberg 20.7 and 20.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://gutenbergtimes.com/?post_type=podcast&p=40406\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:96:\"https://gutenbergtimes.com/podcast/gutenberg-changelog-117-woocommerce-starter-theme-and-blocks/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:48285:\"

Welcome to episode 117 of the Gutenberg Changelog podcast! In this jam-packed episode, host Birgit Pauli-Haack is joined by Ellen Bauer, product lead at WooCommerce for an insightful conversation covering all the latest developments in the WordPress ecosystem.

\n\n\n\n

Together, they dive into the progress on the new WooCommerce Starter Theme, its underlying “workhorse” philosophy, and the ongoing efforts to improve block theme adoption for e-commerce. Ellen shares behind-the-scenes challenges and a sneak peek into the team’s priorities—plus, learn how you can get involved and provide feedback as WooCommerce gears up for a first release in early June.

\n\n\n\n

The episode also offers a preview of what to expect at WordCamp Europe, from Ellen’s session (spoiler: it’s all about WooCommerce and block themes) to hands-on workshops like Birgit’s upcoming walkthrough of using WordPress Playground for product demos. They tackle a listener question on overriding block styles, highlight recent updates to WP-CLI, WordPress 6.8, and the Create Block Theme plugin, and break down the newest features in Gutenberg 20.7 and the upcoming 20.8 release.

\n\n\n\n

Whether you’re a theme builder, plugin developer, or a curious WordPress enthusiast, this episode is packed with actionable insights, pro tips, and friendly encouragement to explore the full potential of the block editor—especially for e-commerce sites. Tune in, and stay up-to-date with the fast-moving world of WordPress!

\n\n\n\n

Show Notes / Transcript

\n\n\n\n\n\n\n\n

Show Notes

\n\n\n\n

Ellen Bauer

\n\n\n\n\n\n\n\n

WooCommerce

\n\n\n\n\n\n\n\n

Listener Question on block styles and block themes

\n\n\n\n\n\n\n\n

What’s released:

\n\n\n\n\n\n\n\n

Gutenberg Plugin releases

\n\n\n\n\n\n\n\n

\n\n\n\n

Stay in Touch

\n\n\n\n
\n\n
\n\n\n\n

Transcript

\n\n\n\n

Birgit Pauli-Haack: Hello, and welcome to our 117th episode of the Gutenberg Changelog podcast. In today’s episode, we will talk about WooCommerce Starter Theme and Blocks, WordCamp Europe, Gutenberg 20.7 and 20.8. I’m your host, Birgit Pauli-Haack, curator at the Gutenberg Times, core contributor for the WordPress open source project, and I work for Automattic as a developer advocate. And I have with me Ellen Bauer, who is the Woo product lead and my resident theme wizard. So how are you today, Ellen? It’s so great that you can join me again.

\n\n\n\n

Ellen Bauer: Thank you very much, Birgit. I’m great and I’m very excited to be on your podcast again. It has been a while and it’s always exciting for me to catch up with everything going on with the Gutenberg updates or like surrounding things like create block theme and yeah, I’m excited. I’m on my way to like halfway on the way to Europe for WordCamp Europe, which is exciting. I’m in Thailand right now in Bangkok, and there’s actually a thunderstorm just rolling in, so I hope that won’t add to any noise in our podcast today. But yeah, I’m great. Thanks for having me.

\n\n\n\n

Birgit Pauli-Haack: Oh, you’re welcome. You’re welcome. Yeah, well, it’s always good when we have some sudden movements on our podcast. It kind of gets us excited, but it’s not so good when you have a lightning strike and this. The power goes out. So that happens America quite often..

\n\n\n\n

Ellen Bauer: In New Zealand as well, where we live. I hope it doesn’t happen. Yeah, I don’t think so.

\n\n\n\n

WooCommerce Starter Theme and Block

\n\n\n\n

Birgit Pauli-Haack: I don’t think so either. So. Yeah, but you mentioned the last time that was the longer time that you’re on the show. So the last time it’s about 10 months ago, and you just had started at WooCommerce and you went on a quest to increase block theme adoption for WooCommerce. So how is it going?

\n\n\n\n

Ellen Bauer: I’m still on the same quest and yeah, we are doing a lot of work and obviously there are a lot of complicated topics to solve because Ecommerce is just another level of complexity compared to just WordPress and blogs like Core WordPress. So the first thing we had to tackle and still like, really, I feel more or less still in the beginnings of it is improving the Woo blocks and, and then like, as a next layer we are building a pattern library. But we really needed to dig into the Woo blocks and we wanted to align them more with core blocks, make it like one experience for users and there were quite a lot of discrepancies and there still are. And we are about to release the first edition of new default Woo starter theme. Not replacing but kind of as an update to the classic theme storefront. Because yeah, it is the last default Woo theme that was there that people recommended or that that was released from WooCommerce. So we are updating that and there will be a first version. It’s really just a starter. I call it the Working Horse because it’s not meant to be a pretty like shiny theme, but really a starter point and also a reference for us to. To kind of test our own blocks to make them practical to see like what can we build and what can we not, and what do we want to build for the front end of Ecommerce stores with. With WooCommerce and what is just not possible at the moment to kind of set priorities on our work on blocks for WooCommerce. And I think that has really helped us to prioritize things that this kind of prioritization hasn’t really happened before. Yeah, you really need to use your own product to kind of see the shortcomings and what you want to fix. So that is the thing. That’s why I call it the Working Horse. And then as a next step once we have this released, we want to improve documentation. We want to help theme builders use this theme as a starting point to see how we think theme builders should work with Ecommerce and like similar to the default WordPress theme Twenty Twenty-Four, Twenty Twenty-Five just as a good reference point. And we are kind of concentrating on one theme because we want to leverage styles and yeah make it more like a mix and match of styles of font sets and a pattern library. Like use the components and make them mix and match rather than having it be one kind of stiff default theme that can’t be changed. So it will become quite creative I feel. And yeah, there’s still lots to do but it’s exciting and I think it really helps us to improve what is possible in a block WooCommerce WordPress world.

\n\n\n\n

Birgit Pauli-Haack: Well, there was a lot to unpack. So yes.

\n\n\n\n

Ellen Bauer: It’s a big project that kind of occupied me for the last 10 months.

\n\n\n\n

Birgit Pauli-Haack: No, no kidding. And others before you. So. So you mentioned first that the work on a theme is also based on the core blocks that are in Woo and that they need to be refined. If I remember correctly. Do you have a call for input or for feedback out for WooCommerce developers? Is that still ongoing or is that already closed? I wasn’t really up to that.

\n\n\n\n

Ellen Bauer: No, definitely we have a call out at any time for we need especially also extension builders. We need their feedback on what they want in our blocks. We need feedback from theme builders what they want the Woo blocks to be able to do. We are also working quite a lot with what we want to bring into core WordPress, and there’s a lot of changes happening to bring more of the default things that users expect from ECommerce into core. So that is happening and it does affect the blocks as well. So yeah, we can add some links to requests for feedback and I’m also always available for any kind of feedback and I think once the theme is out we haven’t promoted it really because it’s still in the works, but it will kind of come out with the next WooCommerce release which is beginning of June. And then we are going to really say hey, we need people to test it and extension builders to test it out and give us feedback.

\n\n\n\n

Birgit Pauli-Haack: Is there a GitHub repo where people can do a sneak peek?

\n\n\n\n

Ellen Bauer: Yes, there is a public GitHub repo where people can add the link to the podcast as well. And it’s yeah, we’re still doing a lot of changes, it’s being worked on. But yeah, we definitely need any kind of feedback we can get. And I think one of the disclaimers, and I put it in the readme file as well is that it’s a real work in progress, it’s not prettified or so. And I do like that. I think it’s good to show the sweat that goes into the work. And we also kind of still talk about a lot of changes like the patterns, where do we want to put the patterns and kind of looking in. For instance, what Rich Table has built on WordPress.com with a pattern library and if we can do something like that for Woo that they are just available outside of themes and really the next step I want to work on is also what kind of default patterns are shipped with WooCommerce. They will get a complete overhaul and kind of make everything more compatible. The starter theme is also based on the same theme JSON setting the assembler Rich Table’s assembler theme uses so it’s practically based on the same theme foundation. And I remember Nick Diego said to all his themes he kind of replaced to work on the basis of assembler because then we can really mix and match patterns across themes, and I think that’s a little bit limitation of block themes that in theory it’s possible, but it’s not really usable to do that. So that’s one of the things we want to improve.

\n\n\n\n

Birgit Pauli-Haack: Yeah, the standardizations is a little bit harder to do with block themes because people can mesh and mash the patterns from all kinds of different sources. Yeah. So timeline wise, the first sneak peek or the first version comes out of the starter theme in beginning of June. But the block work is ongoing but it needs to come to a certain place so you can release that theme and it’s actually a working example. And then it depends on the feedback that you get and also the integration with other extensions, what the next updates on the theme are going to be.

\n\n\n\n

Ellen Bauer: Yeah, my goal for the next step after this initial release is look at the top 10 extensions and work with all of them to make it comfortable with this theme. And I think this will help all block themes to be more streamlined. And we are also really looking at all the cart and checkout pages and order confirmation. My account page is still not blockified. That’s on my wish list. It has been a little bit on the backlog, and I want to change that and kind of everything. Post purchase still needs a lot of work all the page templates there and yeah we will redo the whole default WooCommerce patterns that are shipped. Redo work on the default page templates that are that are in WooCommerce and kind of have a deep look into them and really make sure that this default starter theme just out of the box really works with everything that kind of WooCommerce recommends. That is the goal and yeah that it’s still a lot of work to be able to do that but it’s good to have a theme like a product that we can test it on. I think that was missing the WooCommerce that a lot of times we really didn’t know where to test and I think we have done it with Twenty Twenty-Four, Twenty Twenty-Five. But these themes are not meant to be ECommerce first themes, and I think that’s what we want to change with that project that we just felt we needed an E Commerce first theme to.

\n\n\n\n

Birgit Pauli-Haack: Yeah, absolutely.

\n\n\n\n

Ellen Bauer: To really test all our product range and our core plugin with makes total sense.

\n\n\n\n

WordCamp Europe

\n\n\n\n

Birgit Pauli-Haack: So beginning of June, I’m coming back to that because that’s also the week of WordCamp Europe and I know.

\n\n\n\n

Ellen Bauer: So exciting.

\n\n\n\n

Birgit Pauli-Haack: It’s so exciting that we finally are to that place again that we meet up and at WordCamp Europe and if our listeners come. When you see us at the WordCamp Europe and we’re talking to somebody, it’s all just come up to us, introduce yourself and then be included in any conversation. That’s what the WordCamp is all about. It’s not that people who know each other can click together. It’s meet new people, meet new discussions, have a deeper discussion on certain WordPress topics in a face-to-face settings. So. So what’s your talk about then Ellen?

\n\n\n\n

Ellen Bauer: It’s about WooCommerce and block themes.

\n\n\n\n

Birgit Pauli-Haack: Oh no, you’re just kidding.

\n\n\n\n

Ellen Bauer: Yes. Yay. So yeah, I’m available to talk about these topics actually. Anything I love to be able to meet in person. I loved last year’s being there at interim and I’m really excited to be able to to be there and getting myself up on stage. I’m a little bit frightened and my talk is going to be the last ones on the second day. So yeah, I’m not sure. I hope I won’t be nervous through the whole WordCamp two days or three days with contributor day having the talk kind of on the end. But yeah, please say hi and reach out to me as well if you see me around. 

\n\n\n\n

Yeah, it’s so it I will talk about the benefits of block themes for Ecommerce because a lot of people I think kind of have the idea that block themes are great for blogs or for websites, for WordPress sites, but don’t use a block theme for Ecommerce. And I think that’s just a little bit of a perception that people put this in this box in this drawer, and it’s difficult to take WooCommerce out of that. I think once people have that kind of thought in their head that it’s not a great idea or not ready yet or so yeah, I want to give some examples to why I think that is not true. For instance the blog checkout, how much better the performance is and what kind of benefits people get. Because I think a lot of times users really don’t know about the benefits and benefits of customizing your single product page and just getting creative on what you can do in regards to maybe even different product pages. And just mainly I really want to show examples to make it just really visually appealing that you can drop in patterns and get a really customized WooCommerce experience with block themes and also way better performance and just the flexibility of it, and the ease and the speed and just all the benefits that are there. And also not forget to mention some limitations obviously that are still there that mainly come from plugin extensions WooCommerce extensions not being compatible and we are really hardly working on it. But there are a lot of extensions. Obviously some Ecommerce WooCommerce sites have limitations but I think it’s just good to highlight that and that we are working on it and remind people that maybe it’s a good idea to switch to a block theme with your Ecommerce site.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Even if not to switch to definitely try it out and kind of see.

\n\n\n\n

Ellen Bauer: Where that is or build a road map.

\n\n\n\n

Birgit Pauli-Haack: Yeah, no, I’m. I’m excited about that. I’m gonna, I will be able to come to kind of learn about all that and bring it back to our listeners later on or in the Gutenberg Times Weekend Edition kind of thing.

\n\n\n\n

Ellen Bauer: So what is the topic of your talk or workshop?

\n\n\n\n

Birgit Pauli-Haack: I’m doing a workshop and from zero to demo how to use WordPress playground to put a demo for your product together and we are probably looking at. So it’s a 75-minute workshop and we do it hands-on. We use the Playground built in Blueprint builder. We talk about the steps and the settings and how you get the different landing pages that you could do for your demo. You don’t have to start with the front end. You can go deep into it. So if you have a plugin that shows something in the, that works in the editor that you have a landing page that drops the person who wants to test it out right into the block editor of the Playground instance and have all the settings in there that your plugin needs or your theme needs to be to show off the better part of it and have that ready for one click. And you don’t have to think about a server, you don’t have to think about a database, you don’t have to think about hosting it somewhere. You just use Playground Instance and have can demo your product. So I think the workshop is going to be hands-on. It’s. It’s going really from zero. Okay, what’s this JSON file and all that and then we will build a little demo out. What are the pitfalls for content imports? How the content import needs to kind of be structured so the pictures that you need are actually showing and all these little things that sometimes trip up people who try it out.

\n\n\n\n

Ellen Bauer: That’s exciting. I’m just wondering, do people have to register beforehand for the workshops?

\n\n\n\n

Birgit Pauli-Haack: Yes.

\n\n\n\n

Ellen Bauer: How does it work?

\n\n\n\n

Birgit Pauli-Haack: Registration for workshops on the website has just opened a couple of days ago or even just a couple of days ago, and you need to register and you also Registration is not all. It’s a free registration. Of course. If you already have your WordCamp ticket, you need to use the same email with which you bought your ticket and then they can match up the two tickets there. It’s also necessary that you are at the workshop 10 minutes before because if there’s a waiting list and you are not there to claim your seat, it will go to the waiting list members. Well, I’m not in. Workshops are all competing against all the rest of the talks in three tracks, so I don’t know how many people will show up. So it’s going to. It’s going to be on Friday after lunch at 2:30. No 1:30, sorry, at 1:30 in the Singapore Place, I think. Yeah. Workshops. There’s also a workshop with Milana Cap on the Interactivity API, and there is a workshop with the Block Development Cookbook with Ryan Welcher. It’s always great fun to do. And then Berislav also has a web playground workshop and that is a little bit going deeper into using it for automatic testing. So building automatic tests with WordPress Playground. And then those are the four workshops Interactivity API, automatic testing with Playground, demo site with Playground, and the Block Developer cookbook every day. Friday too and Saturday too. So it’s really cool. Well, thank you for asking.

\n\n\n\n

Ellen Bauer: I have to register myself too.

\n\n\n\n

Listener Questions

\n\n\n\n

Birgit Pauli-Haack: Yeah, absolutely. So we had a listener question since the previous Gutenberg Changelog podcast and one is how to override the block styles that come with the theme. 

\n\n\n\n

So I did a little short post on the Gutenberg Times on how to do this. If they are registered correctly, then you can do it over the global styles in the site editor. If you can’t because they’re registered with an older version of the interface, you can definitely unregister them. So add your own block styles to it. I have the link to the how to in the show notes and they are also published on the or that particular post also published on the Gutenberg Times. It’s very short but it dives a little bit deeper into how to do that. You could also how you override it in theme JSON. This is also a it’s not a no code variation but it’s also the theme JSON is fairly human readable and it gives you an example on how the JSON needs to look so you can override it in the theme JSON. And then there’s also a resource and that’s a huge resource on custom block styles in WordPress where you get theme developers and plugin developers can learn if they haven’t yet developed six methods to do block styles. What are block styles? Block styles is a way to add CSS to a Gutenberg core block. So it’s available for the content creator in the sidebar to just switch it over to the style. So if you have an image style and you want a, you want a certain border, you want a certain radius on the border, you want a certain color on it and you want to also a shadow on it, if that’s a standard for you, the theme developer can put that into a block style, and then every time the content creator wants to create use that block, it will show it has a button to show that particular comp more complicated styling and doesn’t have to do it every time click by click by click. So it’s a one click replacing the style of the core block.

\n\n\n\n

Ellen Bauer: One of my favorites is always the button block like outline button. I think that’s like the one of the best examples where we, where we kind of use that main button, a primary button, secondary button, outline button.

\n\n\n\n

Birgit Pauli-Haack: Yeah, yeah. And the core blocks come with rounded corners and that’s normally not everybody’s a fan of rounded corners, so you need to override that. But it’s relatively easy to do. You can certainly also do block styles very much more complicated than what’s in the examples there. I’ve seen some very interesting block styles for the separator or quotes and pull quotes. They can have some very intriguing designs, but you need to put them into the theme JSON so people can adopt them through the global styles, not theme JSON in the theme JSONs, or with WordPress 6.6 comes a very easy way to add block styles is to put it in a JSON file under your styles and then just have the naming conventions there in terms of which block they attribute to and what the styles are. So and then WordPress picks up that from that particular place and adds it automatically to it. So you don’t have to worry about your CSS files. You don’t have to worry about enqueuing it on the editor or enqueuing it on the front end. WordPress does that all for you. So box hunts have been in Gutenberg for or in the since the beginning but this is now the most streamlined way to get them into the theme.

\n\n\n\n

Ellen Bauer: And I, I always love that because you can reuse it. It’s like a, just a snippet a component, and you can you reuse it on multiple projects. That is like such a game changer, I think.

\n\n\n\n

Birgit Pauli-Haack: Absolutely. Yeah. And you can build your own style kind of library. Yeah. And then just move in the ones that you need. Yeah. If you want to go really out, then you can actually put together your own webpack building process where you kind of pull depending on which parameters pull in the particular styles, the patterns and the templates for a new bespoke theme for a client. So yeah, I like that. It’s all now file based and with less code, even more power. Yeah, so it’s pretty cool. So the two articles will be in the show notes linked. 

\n\n\n\n

What’s Released – WPCLI Update

\n\n\n\n

Now we come to the what’s Released section and I just wanted to give a shout out to Alain Schlesser who has done a tremendous job in maintaining the WPCLI components or features, and he just released another update for the version 2.12. Of course the release notes will be linked in the show notes, but I just wanted to highlight a few things. 

\n\n\n\n

Now it’s very developer focused. That’s why it probably doesn’t get so many shoutouts on all the WordPress news. But it’s so called plug and patch commands for caches and transients. That means it can directly manipulate those individual entries. Wired the WPCLI command. And then there are the post list. Can now handle complex query flags in a JSON notation, which just makes it much easier to build the commands out with a text underscore query, which means taxonomy query, meter query and posted date fields. Just to add those with a flag in your command. Post meta can now be forced to return a single value. Sometimes post meta has a certain key, has multiple values over the course of a site existence. So you can now flag WordPress to only return the latest one and you don’t have to deal with all the other entries for that particular key value. That’s a pretty good neat feature there. The make JSON command is part of the WPCLI International component and it’s more powerful now. You can set the custom text domain, and you can also define the file extensions to parse. So that’s a side note. WPI18N make-JSON is the command that is used for JavaScript internationalization on WordPress with Gutenberg. A lot of interfaces have been built through JavaScript and they also need to be translated. So this helps you with organizing those strings for translation. Yeah, and WPCLI is then also fully compatible with PHP 8.4. So if you found that exciting as I do, go and read the release notes because Alain has published quite a few example code and commands and what the output is from those commands. So you can improve your WPCLI knowledge right there from the release notes. Yeah, so that was one thing. Do you want to talk us through the WordPress 6.8 release?

\n\n\n\n

WordPress 6.1.8 Release

\n\n\n\n

Ellen Bauer: Yes. So the 6.81 was the maintenance release and there were a few, maybe you have to help me out, Birgit.

\n\n\n\n

Birgit Pauli-Haack: Yeah. So yeah, Aaron Jorbin mentioned that there are 15 bugs through core and Block editor that had been released on April 30th. So the most important one is the regression fix that the meta boxes area had unwanted size handles and it broke the auto scroll. So you couldn’t just scroll down in a post to your meta boxes and fill them out. You had to kind of grab the handle and push pull them up because they’re now in a separate iframe or were. And that didn’t work well for many sites. And that’s why we have a release two weeks after the main release that is going to be fixed. So there was a revert on that feature. Also a revert was the edit site link.

\n\n\n\n

Ellen Bauer: The edit site link?

\n\n\n\n

Birgit Pauli-Haack: Yeah, in the top admin bar it had the behavior that when you click on it, you landed automatically on the template of the page that you were looking at. But in 6.8 it changed that. You always went back to the first page of the site editor, and somehow the muscle memory of a lot of people who were accustomed to the other one, it was very irritating for them, and they made their feedback known and it’s definitely a 50/50 split. And so they reverted that change and are now thinking of what could be a better solution. And maybe it needs to be an edit site menu. Yeah. With multiple different menu items in there like edit template and a pattern edit page kind of thing. But yeah, that’s out in discussion and I don’t know where it’s going to land. But at least we have the previous fix again in there. And then also. Oh, and the rest API handing out the sticky post was a little haphazardous and it’s now fixed. The full list is in the release note, and we put them in the show notes of course. But yeah, update definitely. Yeah. Because it will be a more streamlined experience. And yeah, a lot of releases today. So create Block theme was released with 2.7. Do you want to grab that?

\n\n\n\n

Ellen Bauer: Yeah, I can, I can take over. So yeah, I love that plugin. I use it quite a lot and it had been. It’s really improved over the years. And so if you maybe haven’t checked it out yet or don’t even know that it exists, it’s really, really cool for quickly creating block themes or child themes or just kind of creating patterns, like building out your patterns. So some updates that were done in the latest release 2.7 was that there was a bug with the figcaptions not being translated and that was fixed for image and video blocks. The icons for the sidebar. I think there were problems with translations and right to left language. The icons weren’t on the right side or. And the help kind of the help button wasn’t aligned. So you can see the before and after screenshots of the changes. And I think the chevron. I’m not sure if I’m saying that word correctly. I think, correct me if I’m wrong, but I never know how to pronounce the chevron. Yeah, they weren’t switching on to the other side, so that was fixed. And I think also some sizing for the icons, and then php CS removed unused files and it just released files. I’m not 100% sure what was the problem there.

\n\n\n\n

Birgit Pauli-Haack: I don’t know what the problem was, but it’s fixed.

\n\n\n\n

Ellen Bauer: Just some unused files were deleted.

\n\n\n\n

Birgit Pauli-Haack: Yeah, there were some unused files that were not used in the composer when you were putting together a development environment for the plugin. So because yeah, contributors want to contribute but they want to make sure that the environment is in the right place. Then there were some. Yeah, also code quality fixes and the wp-env that’s the testing WordPress the configuration has been improved and offers now certain environment variables that you can set on the command.

\n\n\n\n

Ellen Bauer: So the create block, the major. Say again that were the major updates for that release.

\n\n\n\n

Birgit Pauli-Haack: There’s right now a discussion going on on GitHub and on the repo about what to do with the pattern management because the advantage of putting the patterns in there doesn’t offset the disadvantages while working with it in the site. So what it does right now is when you say okay, save the patterns, it will remove the patterns from the. From the database and put it all in the theme. But of course all the sync patterns will become normal patterns because in a theme you don’t have sync patterns. So it’s kind of that in between problem that sync patterns are not yet available for themes but you actually want them in your site. So it confuses people quite a bit. And that’s a discussion on how not to confuse people, which is actually a pretty good goal.

\n\n\n\n

Ellen Bauer: It’s tough.

\n\n\n\n

Birgit Pauli-Haack: Totally tough. Yeah. 

\n\n\n\n

Gutenberg 20.7

\n\n\n\n

So, and that brings us to the Gutenberg releases we have Gutenberg 20.7 came out with 22 contributors. Two of them were first timers. 

\n\n\n\n

Enhancements

\n\n\n\n

And I’ll start with the format library. The format library is the library that controls the dropdown on the block toolbar with different formatting options. And now you can also set the alpha value for the highlight. So you could actually highlight some words in a paragraph and click on the format drop down, and then highlight that and it would give you a color theme. But now you can also set the alpha value for the highlight manually. That format features are now also available for the details block. Now you can highlight stuff in the details blocks in the summary or in the expansion thing.

\n\n\n\n

Ellen Bauer: Yeah, I think there was some kind of hard coded things in there that you couldn’t do that. And now you can do all the formatting in the details block.

\n\n\n\n

Birgit Pauli-Haack: Yeah, what was hard coded was the allow list in the details block. So they removed that. So now the formatting, all the formatting is available for the details block.

\n\n\n\n

Ellen Bauer: The next one was the navigation in the site view. Now it automatically the default is that it expanded. And before it was not expanded, you had to have an extra click to. To open the sub menus. And in the PR there’s a before and after. And it’s really an improvement because you can see right away the entire menu. I love the site view.

\n\n\n\n

Birgit Pauli-Haack: Oh, the it’s actually a list called List.

\n\n\n\n

Ellen Bauer: View, the list view and also in the, the like in the page editor in the template on both sides, it’s. It’s now automatic by default expanded. Is that correct?

\n\n\n\n

Birgit Pauli-Haack: Oh yeah, right. Right now the navigation block, when you try to edit it, it has a nice sidebar as well. And it’s also there expanded. 

\n\n\n\n

So next item I want to talk about is the table block. Table block doesn’t get a whole lot of love from Gutenberg developers, but it’s actually pretty cool. And what’s mostly cool about it is when you have a markdown table from GitHub or from any other. So even if you work with AIs, I had a list of posts with views, and all that and the AI created that, but I told them to give me a markdown table so when I do, I can copy paste it into a post. And that was really cool because it now also preserves the column alignment in the pasting. Before you had to just fiddle around with it quite a bit on certain things where it wouldn’t come over. But that’s actually a really good feature to be that it possible that you can paste markdown tables. Not only markdown that we knew, but you can also mark down tables and it’s pulling it into a table block. I think that was it for 20.7. Yep. Okay, that brings us to 20.8. 

\n\n\n\n

Gutenberg 20.8

\n\n\n\n

And 20.8 hasn’t been released yet when we record the show, but the release candidate was out and that’s what our changelog is about. 

\n\n\n\n

Enhancements

\n\n\n\n

So the Create block package can now also have a text domain flag when you start out your scaffolding. So it will be repeated throughout the plugin your text domain for the translation as well. And you don’t have to manually put this all in.

\n\n\n\n

Ellen Bauer: I think the next one was that the text is now customizable for the next and previous button text, which wasn’t possible before to customize the text. That was an improvement.

\n\n\n\n

Birgit Pauli-Haack: Absolutely. There are now two new properties for the component available where you can customize it by code when you use them in your plugins, and that’s for the guide component. The guide is what pops up but nobody reads is the guide that comes up with the block editor. If you first time install a site and go into the editor. That’s the guide. Yeah. You can use it also for your plugins, and you can use it also for your theme. If you want to add text in there you to guide your users to certain things and then also makes those buttons are now customizable.

\n\n\n\n

Ellen Bauer: The next one was search functionality for page templates. When you want to change the page template or swap them out. There wasn’t a way to understand correctly to like a proper or easy way to search for your templates if you have a lot of them. And now that’s improved. Is that correct, Birgit?

\n\n\n\n

Birgit Pauli-Haack: Yeah. And it’s also for the pattern selection search.

\n\n\n\n

Ellen Bauer: Oh, the same.

\n\n\n\n

Birgit Pauli-Haack: It’s both. Yeah.

\n\n\n\n

Ellen Bauer: I think that is really, really helpful.

\n\n\n\n

Birgit Pauli-Haack: Yeah. The testing instructions starts out, make sure you have at least 15 templates in there.

\n\n\n\n

Ellen Bauer: Yeah.

\n\n\n\n

Birgit Pauli-Haack: That cannot be applied to a page.

\n\n\n\n

Ellen Bauer: Which can quickly happen. And that’s cool to have custom templates, right?

\n\n\n\n

Birgit Pauli-Haack: Yeah. But that’s…

\n\n\n\n

Ellen Bauer: You need a lot.

\n\n\n\n

Birgit Pauli-Haack: You definitely need a search component in there. Yes.

\n\n\n\n

Ellen Bauer: To roll through them.

\n\n\n\n

Birgit Pauli-Haack: Yeah. The next one mentions the reverse of the split view for the meta boxes that were in 28. It was released in Gutenberg, but it then was backported to the 6.8.1 release. So this is definitely already out and it’s also in the WordPress versions. Yeah, the widget editor. I don’t. I didn’t even know we had a widget editor.

\n\n\n\n

New API

\n\n\n\n

Ellen Bauer: Yeah, I was just saying I didn’t quite understand that one, to be honest.

\n\n\n\n

Birgit Pauli-Haack: Yeah. In the classic theme you have the widget menu and that is for a long time already a block based interface. So you need to lock the widget saving or the update button and all that. So now you can lock some of the functionality because not everybody should be able to do stuff there. Yeah. 

\n\n\n\n

Bug Fixes

\n\n\n\n

And then there are some fixes on the block editor. Now that was actually always a pet peeve of mine that when you get invalid blocks that you can’t at least edit the HTML because you don’t know what needs to be fixed. And now you can edit the HTML for invalid blocks.

\n\n\n\n

Ellen Bauer: I do like that a lot too because sometimes it happens and you have that code there and you like want to get in.

\n\n\n\n

Birgit Pauli-Haack: Yeah. The last time I think I had.

\n\n\n\n

Ellen Bauer: It with the no you can chat.

\n\n\n\n

Birgit Pauli-Haack: Pack with Jetpack AI features. Yeah. Somehow when I mark two paragraphs and then the first paragraph becomes invalid when I hit on the AI feature and it was only because there’s one of the HTML wasn’t closed well enough. I need to figure that out. But do a bug report. But yeah, it would have been really helpful to. To just manipulate the HTML of that. The next one is that PR or update will prevent spacer block to have a negative width when it’s used in a row block. That offsets all kinds of different things and that can definitely ruins your design. You can have a spacer block with a negative margin or negative width. That’s no problem. Yeah, but it doesn’t.

\n\n\n\n

Ellen Bauer: But not inside a roadblock.

\n\n\n\n

Birgit Pauli-Haack: Yeah, because that.

\n\n\n\n

Ellen Bauer: So now it’s chooses to design the browser detects. Hey, I’m a spacer block inside a row block and the negative margin option is not available any longer. That is cool.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And there’s a quality fix on that. Some of the block HTML now get box sizing property so that the overflow into the next block or into the next design element can be prevented. That’s definitely a good fix because some people are kind of getting really elaborate on those designs. And then how do you handle that? 

\n\n\n\n

Documentation

\n\n\n\n

We already mentioned the create block and the text domain flag. So that’s now in the create block readme. The block bindings API has a post meta limitation. This new update prevents protected post meta that are prefixed with underscore that cannot be used for block bindings. And the post meta also has to be available in the REST API. Those are the two limitations and they were not yet mentioned in the documentation. And also block bindings are only available for four blocks. So that’s the heading block, the paragraph block, the image block and the button block. All other blocks cannot yet handle block bindings. So those are all three limitations there. And now it’s in the documentation with working on those block style articles I found that the latest register block style parameter that came in with 6.6 called style underscore data hasn’t been documented which has been done now because that’s. That’s the most. That’s a great way to use it in a plugin to use the style underscore data because only the styled underscore data for the register block style function also puts the styles into the global styles for content creators to modify them. All the others you can do it on the page by page level. It’s in the styles but you cannot change them globally for a site. Yeah, that’s interesting. That was an interesting find there. So. Yeah, those are our Gutenberg releases. Wow, that’s. That’s cool. We are done with that. The release is either Friday May 9th for 20.8 or even today. We are recording this on May 8th. Well, we come to the end of things. So Ellen, I wish you safe travels to Europe.

\n\n\n\n

Ellen Bauer: Thank you.

\n\n\n\n

Birgit Pauli-Haack: When are you flying in? I don’t want to stalk you.

\n\n\n\n

Ellen Bauer: Saturday night and arriving Sunday early morning and then heading actually to Berlin for a team meetup first. Then heading to Sweden for another meetup and then kind of taking a little family holiday break before arriving freshly rested in Basel.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And with all the updates from the team. Freshly rested. So.

\n\n\n\n

Ellen Bauer: Yes.

\n\n\n\n

Birgit Pauli-Haack: Yeah. You get the latest from WooCommerce for. From Ellen Bower at WordCamp Europe.

\n\n\n\n

Ellen Bauer: Yeah, it’s going to be an exciting trip. I’m looking forward to coming to Europe. Should be fun. Is there any good weather I’ve seen the weather.

\n\n\n\n

Birgit Pauli-Haack: It’s like quite coldish beginning of June. It’s normally pretty warm during the day. Yeah. Especially in that area that’s always a little bit ahead towards summer than the rest of Germany.

\n\n\n\n

Ellen Bauer: The warmer.

\n\n\n\n

Birgit Pauli-Haack: Yeah, because it’s a little.

\n\n\n\n

Ellen Bauer: Yeah, I know that’s. I didn’t bring any warm clothes though.

\n\n\n\n

Birgit Pauli-Haack: Well, I would get rid of.

\n\n\n\n

Ellen Bauer: I think I have to buy one.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Yeah. I’m. We are actually heading out for vacation at the end of June. So we have team meetup at the end of June. And then afterwards, right away, I’m going to be in Norway for our family vacation. So I don’t know when we have the next, I think between WordCamp Europe and end of June, we will have another Gutenberg Changelog episode. And until then, as always, the show notes will be published on gutenbergtimes.com forward slash podcast. This is episode 117. 117. And if you have questions or suggestions, as you know, we are gonna discuss them on the next episode or in a post on Gutenberg Times or both. And if you have any news that you want to include, send them to changelog@gutenbergtimes.com that’s changelog@gutenbergtimes.com or ping me on Twitter, Blue Sky, Mastodon. And that’s all. All the ends are open. So thank you for coming, Ellan, and thank you to our listeners. And this is goodbye for me until the next time.

\n\n\n\n

Ellen Bauer: Yeah, take care, everyone. And yeah, please reach out to us. There’s any questions also for my side.

\n\n\n\n

Birgit Pauli-Haack: All right.

\n\n\n\n

Ellen Bauer: Thank you for having me, Birgit.

\n\n\n\n

Birgit Pauli-Haack: Oh, you’re welcome. 

\n\n\n\n

Ellen Bauer: Thank you.

\n\n\n\n

Birgit Pauli-Haack: It is.

\n\n\n\n

Ellen Bauer: Bye Bye.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 11 May 2025 09:00:30 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:106:\"Gutenberg Times: Block Styles, Woo Product Collection, Deepwiki, Accessibility Day — Weekend Edition 329\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=40222\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:110:\"https://gutenbergtimes.com/block-styles-woo-product-collection-deepwiki-accessibility-day-weekend-edition-329/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:20572:\"

Hi,

\n\n\n\n

“And just like that, winter has faded from our collective memory…”, Om Malik wrote in his Letter from Om, May edition. In Munich, we just had another cold spell, though. There is no doubt we are heading into the next hot summer.

\n\n\n\n

So it’s Saturday afternoon, and I am way behind on your newsletter edition. This week, I published approximately 7,500 words over three posts. Definitely a record! Plus, two podcast episodes (one is still with the editor).

\n\n\n\n

Don’t worry, this weekend edition is not entirely about me. \"😜\"

\n\n\n\n

Have a splendid weekend ahead!

\n\n\n\n

Yours, \"💕\"
Birgit

\n\n\n\n\n\n\n\n
\n

\"🎙\" The latest episode Gutenberg Changelog 117 – WooCommerce Starter Theme and Blocks, WordCamp Europe, and Gutenberg 20.7 and 20.8 I sat down with Ellen Bauer, WooCommerce product lead and discussed what she is working on, WordCamp Europe, Create Block Theme, WP-CLI, Gutenberg 20.7 and Gutenberg 20.8 releases.

\n\n\n\n\"Ellen\n
\n\n\n\n

Workshop Registration Now Open for WordCamp Europe 2025 – Secure Your Spot Today! A reminder of the workshops offered:

\n\n\n\n\n\n\n\n

Here is the Workshop Registration page. You already need to have a ticket, and use for this registration the same email.

\n\n\n\n
\n\n\n\n

Global Accessibility Awareness Day (GAAD) is celebrated on May 15, 2025. Amber Hinds from Equalize Digital invites people to join in a virtual accessibility contributor day. This event aims to improve accessibility in WordPress. Whether you’re a developer, designer, content creator, or site owner, you have the skills. You can help make the internet more usable. You can make a difference for millions of people with disabilities. she wrote. You pledge your time Global Accessibility Awareness Day Pledge – May 15, 2025.

\n\n\n\n

Suggested activities include reporting issues for Core, plugins, or themes. They also cover testing patches on accessibility tickets. You can offer feedback on existing accessibility issues or add captions to videos on WordPressTV. Additionally, running a webinar is another activity choice.

\n\n\n\n\"cover\n\n\n\n

Plugins, Themes, and Tools for #nocode site builders and owners

\n\n\n\n

Brian Coords published the release notes for WooCommerce 9.8.4. It addresses a fatal error that occurred as the result of a remote service failure.

\n\n\n\n

Stephanie Pi issued a Developer advisory: Subscriptions core code moving into WooCommerce Subscriptions plugin. he core code that powers WooCommerce Subscriptions will now be managed directly within the main plugin repository, rather than the separate, public Automattic/woocommerce-subscriptions-core codebase. This change, effective May 20, 2025, aims to reduce complexity, streamline versioning, and align with management of other WooCommerce extensions. Only developers directly depending on the core package or monitoring its repository are affected; regular plugin users or API integrators need not take action.

\n\n\n\n
\n\n\n\n

Fabian Kägy and I hung out with Nathan Wrigley for the third episode of the At the Core show. We dove into the latest buzz in WordPress. We especially focused on the 6.8 release. We covered some cool new features like

\n\n\n\n
    \n
  • better details and accordion blocks,
  • \n\n\n\n
  • tweaks to the stylebook,
  • \n\n\n\n
  • fresh pattern section styles,
  • \n\n\n\n
  • upgraded gallery image options, and
  • \n\n\n\n
  • some nice improvements in template editing.
  • \n
\n\n\n\n

We discussed the shift toward a slower, more thoughtful approach to WordPress core releases. There are changes in the dev workflow. We also talked about some new plugins like ClassifAI and ThemeSwitcher Pro. These plugins make it easier to integrate AI. They also help to gradually move to block themes. This episode is packed with great tips for anyone looking to stay updated on new developments in WordPress. You also get hands-on insights about the latest features.

\n\n\n\n\"cover\n\n\n\n
\n\n\n\n

Kaspars Dambis created a nifty optimizing plugin called Lazy Load Blocks for WordPress. It does exactly what it says on the tin. Configurable per block, even. Lazy loading blocks improves the Web Vitals. It enhances the Page Speed metrics. It does not impact the layout shift (CLS) when the lazy loading is triggered. There is a great demo video on the page. You will also find screenshots and instructions. Explanations of how this actually works are also included. It’s comes with a small price tag of $5 per month, billed annually.

\n\n\n\n
\n\n\n\n

In his latest video: How Thousands Use WordPress to Get Customer Feedback, Wes Theron demonstrates techniques for content creators and site owners. He shows how to use blocks by Crowdsignal to gather feedback. You can use highly interactive elements like polls, surveys, voting buttons, and more. Theron provides a step-by-step guide on how to add feedback tools to your site. This helps you start making smarter decisions based on real data.

\n\n\n
\n
\n\n
\n
\n\n\n\n\n

Theme Development for Full Site Editing and Blocks

\n\n\n\n

In my latest post, Mastering Custom Block Styles in WordPress: 6 Methods for Theme and Plugin Developers, I’m sharing some cool tips. These tips are for theme and plugin developers. They cover how to create and manage block styles in WordPress. The article discusses using JSON files. It also covers PHP functions like register_block_style().

\n\n\n\n\"list\n\n\n\n
\n\n\n\n

In, Seven Tasks to a Custom Block Theme: Anders Norén’s Weekend Workflow, A year ago, over a weekend, Anders Norén shared his block theme building process in a X thread. I finally found the time to make it a more enhanced tutorial for theme builders’ perusal. You learn about Norén’s tools, his methods, and his tricks to enhance his designs.

\n\n\n\n\"An\n\n\n\n

 “Keeping up with Gutenberg – Index 2025” 
A chronological list of the WordPress Make Blog posts. It includes contributions from various teams involved in Gutenberg development. These teams are Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test, and Meta team from Jan. 2024 on. Updated by yours truly. The previous years are also available: 2020 | 2021 | 2022 | 2023 | 2024

\n\n\n\n

Building Blocks and Tools for the Block editor.

\n\n\n\n

Eric Karkovack just published a tutorial on how to display WordPress custom field data with blocks. He introduces you to the Block Bindings API and walks you through an example from start to finish.

\n\n\n\n
\n\n\n\n

Jonathan Bossenger shared with me DeepWiki, a service by Devin AI. it introduces itself as “your collaborative AI teammate, built to help ambitious engineering teams achieve more.”

\n\n\n\n

You can make it your companion developing for the Block Editor by visiting the sub-site for WordPress/Gutenberg. It provides you with access to the documentation and code in a human-readable form. The chatbot will answer your questions. I tested it with two questions:

\n\n\n\n
    \n
  • What are Gutenberg stores and what information can you find there? You can read the answer here.
  • \n\n\n\n
  • Is there a good analogy for state to better explain state management? The answer shows quite a few real live analogies: working with a notebook, a collaborative drawing board and a room with light switches and fixtures.
  • \n
\n\n\n\n

Try it out yourself! It’s pretty helpful as it searches the documentation and digs through the whole Gutenberg code base for answers.

\n\n\n\n
\n\n\n\n

In his tutorial on how to build blocks with WooCommerce, Marco Lucio Giannotta and Karol Manijak guide developers. They show how to build a WooCommerce Product Collection block. They break it down with an easy-going video and some code examples. You’ll get the scoop on block theory. You’ll watch a live-coding session where they create interactive blocks. You’ll dig deep into the default Product Collection block. There are two hands-on exercises. One teaches how to add a “Featured” filter. Another focuses on registering a custom collection of “on-sale products under $40.” It’s a great way to get the hang of block settings, custom queries, and using the WooCommerce API!

\n\n\n\n\"Screenshot\n\n\n\n

The second part of the Unit test (with Jest) for WordPress Blocks is out. JuanMa Garrido programs unit tests for the copyright block from the “Tutorial: Build your first block”. He also explores how to debug the Save component of a block.

\n\n\n\n
\n\n\n\n

The Codeable Team published How to Get Started with the Interactivity API. This article introduces WordPress developers to a way of adding real-time features to websites without using heavy scripts or plugins. It explains that the Interactivity API, available from WordPress 6.5, allows developers to update page elements quickly, enhancing site performance and making development easier. It highlights the API’s benefits in performance, scalability, and WordPress integration.

\n\n\n\n

The next episode of Jon learns to code with AI is up. In WordPress as a MCP Server, Jonathan Bossenger reviewed the WordPress MCP plugin from Automattic. This plugin turns your WordPress site into an MCP server that your AI Agent can interact with. To learn what that exactly means, you need to watch the video.

\n\n\n
\n
\n\n
\n
\n\n\n

Need a plugin .zip from Gutenberg’s master branch?
Gutenberg Times provides daily build for testing and review.

\n\n\n\n

Now also available via WordPress Playground. There is no need for a test site locally or on a server. Have you been using it? Email me with your experience

\n\n\n\n

\"GitHub

\n\n\n\n

Questions? Suggestions? Ideas?
Don’t hesitate to send them via email or
send me a message on WordPress Slack or Twitter @bph.

\n\n\n\n
\n\n\n\n

For questions to be answered on the Gutenberg Changelog,
send them to changelog@gutenbergtimes.com

\n\n\n\n
\n\n\n\n

Featured Image: New York – View from The Highline 2015 by Birgit Pauli-Haack

\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n

We hate spam, too, and won’t give your email address to anyone
except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 10 May 2025 14:30:32 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:10;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"Gutenberg Times: Seven Tasks to a Custom Block Theme: Anders Norén’s Weekend Workflow\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=28477\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"https://gutenbergtimes.com/seven-steps-to-a-custom-block-theme-anders-norens-weekend-workflow/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:91385:\"

Have you ever wondered how a modern WordPress block theme comes together – from first sketches to a polished, production-ready design? Over a single weekend, Anders Norén built Pulitzer, a new block theme, from the ground up. In this post, I’ll walk you through Anders’ process. I’ll highlight the tools, decisions, and little tricks that helped him move quickly.

\n\n\n\n
\n

“I have the house to myself this weekend, so I thought I’d try something new. My goal is to build and submit a new free block theme to before Monday. While I work, I’ll describe my dev process in this thread.”

\nAnders Norén on X (formerly known as Twitter)
\n\n\n\n

About a year ago, Anders Norén posted an X (formerly known as Twitter) thread about his process. He gave me permission to collect the tweets into a blog post. Since then, he deleted his account and content on X. The valuable information is not lost. Here you go.

\n\n\n\n\n\n\n\n

The inspiration and seven tools

\n\n\n\n

The theme Norén set out to build that weekend is called Pulitzer. It is meant for long-form writing with a special consideration for writers with newsletters.

\n\n\n\n

Figma

\n\n\n\n

You can find a Figma presentation here. The video walks you through the Pulitzer Figma space.

\n\n\n\n \n
\n \n \n \n \n\n\n

Jetpack and Block Bindings

\n\n\n\n

Some elements in the design stand out:

\n\n\n\n
    \n
  1. Reading time
  2. \n\n\n\n
  3. Like button
  4. \n\n\n\n
  5. Share buttons
  6. \n\n\n\n
  7. Newsletter signup
  8. \n
\n\n\n\n

For a self-hosted WordPress site, those blocks are not available out of the box unless you install the Jetpack plugin. For the reading time, comment count and copyright year in the footer, Norén experimented with the Block Bindings API.

\n\n\n\n
\n\"Mockup\n
\n\n\n\n

Studio app

\n\n\n\n

This was also the first time, Norén used the Studio app by WordPress.com for local development. It’s free and open-source.

\n\n\n\n
\n

“First impressions are very good. It probably doesn’t tick all the boxes for people with more advanced needs, but for what I’m doing, it seems perfect.”

\n\n\n\n

Anders Norén

\n
\n\n\n\n\"Screenshot\n\n\n\n

WordPress.com hosting

\n\n\n\n

Norén hosts his sites on WordPress.com. Because of the GitHub Deployment feature, he found it easy to keep the Pulitzer demo site updated.

\n\n\n\n

Create Block Theme

\n\n\n\n

Another tool he used is the community plugin Create Block theme. Once installed, it helps you make design decisions in the Site Editor and save them back to your theme’s file.

\n\n\n\n

Twenty Twenty-Four

\n\n\n\n
\n

“Twenty Twenty-Four is my go-to starting point on most projects these days.”

\nAnders Norén
\n\n\n\n

He also found that it’s probably the best default theme ever. He gave a special shout-out to the theme leads Jessica Lyschik and Maggie Cabrera.

\n\n\n\n

Both the demo and the GitHub repo are publicly accessible:

\n\n\n\n\n\n\n\n

With all the tools in place, Anders Norén ventured to build the WordPress theme.

\n\n\n\n

First task: remove many things

\n\n\n\n

Norén began by taking the Twenty-Twenty-Four default theme. He started with removing all the templates, template parts, patterns, fonts, images, and styles that won’t be needed. Then, he renamed the rest.

\n\n\n\n\"Screenshot\n\n\n\n

Second task: update theme.json

\n\n\n\n

In a second step, Norén updated the theme settings with those from the design in the theme.json file

\n\n\n\n
    \n
  • spacing sizes,
  • \n\n\n\n
  • colors, and
  • \n\n\n\n
  • typography
  • \n
\n\n\n\n

Spacing and Colors

\n\n\n\n
\n
\n
HTML
\"spacing\": {\n			\"spacingScale\": {\n				\"steps\": 0\n			},\n			\"spacingSizes\": [\n				{\n					\"name\": \"4px\",\n					\"size\": \"4px\",\n					\"slug\": \"10\"\n				},\n				{\n					\"name\": \"8px\",\n					\"size\": \"8px\",\n					\"slug\": \"20\"\n				},\n				{\n					\"name\": \"12px\",\n					\"size\": \"12px\",\n					\"slug\": \"30\"\n				},\n				{\n					\"name\": \"16px\",\n					\"size\": \"16px\",\n					\"slug\": \"40\"\n				},\n				{\n					\"name\": \"24px\",\n					\"size\": \"24px\",\n					\"slug\": \"50\"\n				},\n				{\n					\"name\": \"32px\",\n					\"size\": \"32px\",\n					\"slug\": \"60\"\n				},\n				{\n					\"name\": \"48px\",\n					\"size\": \"clamp(32px, 4.8vw, 48px)\",\n					\"slug\": \"70\"\n				},\n				{\n					\"name\": \"64px\",\n					\"size\": \"clamp(48px, 6.4vw, 64px)\",\n					\"slug\": \"80\"\n				},\n				{\n					\"name\": \"96px\",\n					\"size\": \"clamp(64px, 9.6vw, 96px)\",\n					\"slug\": \"90\"\n				},\n				{\n					\"name\": \"128px\",\n					\"size\": \"clamp(64px, 12.8vw, 128px)\",\n					\"slug\": \"100\"\n				},\n				{\n					\"name\": \"Body Margin (24px)\",\n					\"size\": \"24px\",\n					\"slug\": \"body-margin\"\n				}\n			],\n			\"units\": [\n				\"%\",\n				\"px\",\n				\"em\",\n				\"rem\",\n				\"vh\",\n				\"vw\"\n			]\n		}
Click to see more
\n
\n\n\n\n
\n
HTML
\"color\": {\n			\"defaultPalette\": false,\n			\"palette\": [\n				{\n					\"color\": \"#FFFFFF\",\n					\"name\": \"Base\",\n					\"slug\": \"base\"\n				},\n				{\n					\"color\": \"#F9F9F9\",\n					\"name\": \"Base / Two\",\n					\"slug\": \"base-2\"\n				},\n				{\n					\"color\": \"#191716\",\n					\"name\": \"Contrast\",\n					\"slug\": \"contrast\"\n				},\n				{\n					\"color\": \"#666666\",\n					\"name\": \"Contrast / Two\",\n					\"slug\": \"contrast-2\"\n				},\n				{\n					\"color\": \"#767676\",\n					\"name\": \"Contrast / Three\",\n					\"slug\": \"contrast-3\"\n				},\n				{\n					\"color\": \"#DADADA\",\n					\"name\": \"Contrast / Four\",\n					\"slug\": \"contrast-4\"\n				},\n				{\n					\"color\": \"#EEEEEE\",\n					\"name\": \"Contrast / Five\",\n					\"slug\": \"contrast-5\"\n				}\n			]\n		}
Click to see more
\n
\n
\n\n\n\n

Typography

\n\n\n\n
\n
\n
HTML
\"fontFamilies\": [\n				{\n					\"fontFace\": [\n						{\n							\"fontFamily\": \"Newsreader\",\n							\"fontStretch\": \"normal\",\n							\"fontStyle\": \"normal\",\n							\"fontWeight\": \"200 900\",\n							\"src\": [\n								\"file:./assets/fonts/newsreader/newsreader-var.woff2\"\n							]\n						},\n						{\n							\"fontFamily\": \"Newsreader\",\n							\"fontStretch\": \"normal\",\n							\"fontStyle\": \"italic\",\n							\"fontWeight\": \"200 900\",\n							\"src\": [\n								\"file:./assets/fonts/newsreader/newsreader-var-italic.woff2\"\n							]\n						}\n					],\n					\"fontFamily\": \"\\\"Newsreader\\\", ui-serif, \\\"Times New Roman\\\", serif\",\n					\"name\": \"Newsreader\",\n					\"slug\": \"body\"\n				},\n				{\n					\"fontFamily\": \"ui-sans-serif, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", sans-serif\",\n					\"name\": \"System Sans-serif\",\n					\"slug\": \"system-sans-serif\"\n				},\n				{\n					\"fontFamily\": \"ui-serif, \\\"Times New Roman\\\", serif\",\n					\"name\": \"System Serif\",\n					\"slug\": \"system-serif\"\n				}\n			],
Click to see more
\n
\n\n\n\n
\n
HTML
\"fontSizes\": [\n				{\n					\"fluid\": false,\n					\"name\": \"XXS\",\n					\"size\": \"12px\",\n					\"slug\": \"xx-small\"\n				},\n				{\n					\"fluid\": false,\n					\"name\": \"XS\",\n					\"size\": \"14px\",\n					\"slug\": \"x-small\"\n				},\n				{\n					\"fluid\": false,\n					\"name\": \"Small\",\n					\"size\": \"16px\",\n					\"slug\": \"small\"\n				},\n				{\n					\"fluid\": false,\n					\"name\": \"Medium\",\n					\"size\": \"18px\",\n					\"slug\": \"medium\"\n				},\n				{\n					\"fluid\": false,\n					\"name\": \"Large\",\n					\"size\": \"21px\",\n					\"slug\": \"large\"\n				},\n				{\n					\"fluid\": {\n						\"max\": \"24px\",\n						\"min\": \"21px\"\n					},\n					\"name\": \"XL\",\n					\"size\": \"24px\",\n					\"slug\": \"x-large\"\n				},\n				{\n					\"fluid\": {\n						\"max\": \"32px\",\n						\"min\": \"24px\"\n					},\n					\"name\": \"XXL\",\n					\"size\": \"32px\",\n					\"slug\": \"xx-large\"\n				},\n				{\n					\"fluid\": false,\n					\"name\": \"Massive\",\n					\"size\": \"clamp( 96px, 19.2vw, 128px )\",\n					\"slug\": \"massive\"\n				}\n			],\n			\"writingMode\": true\n		}
Click to see more
\n
\n
\n\n\n\n
\n

“With the theme settings in place, it’s time to put them to use in block and element-specific styles. This is when the theme starts taking shape. You can do this in the site editor, but it’s faster to edit theme.json directly. Also, many styles can’t be changed in the interface,” Norén wrote.

\n
\n\n\n\n

As the new theme, Pulitzer doesn’t have any working templates yet, Norén checked the theme.json styles in the Site editor Stylebook view. You get the vibe of the theme. You can also use it to make sure you haven’t forgotten any styling for core blocks.

\n\n\n\n
\n\n\"Screenshot\n\n\n\n\"Screenshot\n\n
\n\n\n\n

Third task: Templates and Patterns

\n\n\n\n

This is the moment to work on the theme layouts. Norén uses what he calls “the one indispensable tool in the Block Theming toolbox,” the Create Block Theme (CBT) plugin.

\n\n\n\n
    \n
  • Step 1: Make the changes in the site editor.
  • \n\n\n\n
  • Step 2: Save them to the theme with CBT.
  • \n
\n\n\n\n\n\n\n\n

Header and Footer

\n\n\n\n
\n

“When I’m building a theme, I almost always start with the header and footer. It fools you into thinking the theme is nearly finished. I’ll wait with the newsletter form and the other Jetpack blocks until all the templates are in place.” — Norén shared in his thread.

\n
\n\n\n\n
\n
\n\"Screenshot\n\n\n\n

Working in the Site Editor

\n
\n\n\n\n
\n\"Screenshot\n\n\n\n

Saving changes to the theme with CBT

\n
\n
\n\n\n\n
\n\n\n\n

The header template part is only the container for the hidden-header pattern. The reason to use patterns is that you can add php code. The advantage is that the text wrapped in esc_html_e() function can be translated. See below an example of a group of Navigation links.

\n\n\n\n\"Screenshot\n\n\n\n
\n

Template part: header.html

\n\n\n\n
PHP
<!-- wp:pattern {\"slug\":\"pulitzer/hidden-header\"} /-->
\n\n\n\n
\n

hidden-header.php

\n\n\n\nClick the arrow to see the Pattern code\n
PHP
<?php\n/**\n * Title: header\n * Slug: pulitzer/hidden-header\n * Inserter: no\n */\n?>\n<!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|60\",\"bottom\":\"var:preset|spacing|60\"}},\"border\":{\"bottom\":{\"color\":\"var:preset|color|contrast-5\",\"width\":\"1px\"},\"top\":[],\"right\":[],\"left\":[]}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignwide\" style=\"border-bottom-color:var(--wp--preset--color--contrast-5);border-bottom-width:1px;padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)\">\n\n	<!-- wp:columns {\"isStackedOnMobile\":false,\"style\":{\"spacing\":{\"blockGap\":{\"left\":\"var:preset|spacing|50\"}}}} -->\n	<div class=\"wp-block-columns is-not-stacked-on-mobile\">\n		\n		<!-- wp:column {\"verticalAlignment\":\"stretch\"} -->\n		<div class=\"wp-block-column is-vertically-aligned-stretch\">\n			<!-- wp:group {\"style\":{\"dimensions\":{\"minHeight\":\"100%\"},\"spacing\":{\"blockGap\":\"var:preset|spacing|40\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"verticalAlignment\":\"space-between\"}} -->\n			<div class=\"wp-block-group\" style=\"min-height:100%\">\n				<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"var:preset|spacing|10\"},\"layout\":{\"selfStretch\":\"fit\",\"flexSize\":null}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n				<div class=\"wp-block-group\">\n					<!-- wp:site-title {\"level\":0} /-->\n					<!-- wp:site-tagline /-->\n				</div>\n				<!-- /wp:group -->\n\n				<!-- wp:navigation {\"hasIcon\":false,\"layout\":{\"type\":\"flex\",\"orientation\":\"horizontal\"}} -->\n\n				<!-- wp:navigation-link {\"label\":\"<?php esc_html_e( \'Blog\', \'pulitzer\' ); ?>\",\"url\":\"#\"} /-->\n				<!-- wp:navigation-link {\"label\":\"<?php esc_html_e( \'Profile\', \'pulitzer\' ); ?>\",\"url\":\"#\"} /-->\n				<!-- wp:navigation-link {\"label\":\"<?php esc_html_e( \'Newsletter\', \'pulitzer\' ); ?>\",\"url\":\"#\"} /-->\n\n				<!-- /wp:navigation -->\n\n			</div>\n			<!-- /wp:group -->\n		</div>\n		<!-- /wp:column -->\n\n		<!-- wp:column {\"width\":\"1em\",\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"right\"},\"fontSize\":\"massive\"} -->\n		<div class=\"wp-block-column has-massive-font-size\" style=\"flex-basis:1em\">\n			<!-- wp:site-logo {\"width\":128,\"shouldSyncIcon\":true,\"className\":\"is-style-rounded\"} /-->\n		</div>\n		<!-- /wp:column -->\n\n	</div>\n	<!-- /wp:columns -->\n\n</div>\n<!-- /wp:group -->
\n\n
\n
\n\n\n\n

The same system applied to the template part footer.html that includes the hidden-footer.php.

\n\n\n\n

Archives

\n\n\n\n
\n

“For the line clamped excerpts, I registered custom block styles for the ‘Excerpt’ block and enqueues a CSS file when the block is in use on the page. You can do a lot with theme.json styles, but stuff like this still requires CSS,” Norén found.

\n
\n\n\n\n

Register_block_style

\n\n\n\n
HTML
register_block_style(\n			\'core/post-excerpt\',\n			array(\n				\'name\'	=> \'pulitzer-clamp-lines-2\',\n				\'label\'	=> __( \'Clamp: 2 lines\', \'pulitzer\' )\n			)\n		);\n\n		register_block_style(\n			\'core/post-excerpt\',\n			array(\n				\'name\'	=> \'pulitzer-clamp-lines-3\',\n				\'label\'	=> __( \'Clamp: 3 lines\', \'pulitzer\' )\n			)\n		);
\n\n\n\n

CSS for post/excerpt clamp lines styles

\n\n\n\n
HTML
[class*=\"is-style-pulitzer-clamp-lines-\"] p:first-child {\n	display: -webkit-box;\n	-webkit-box-orient: vertical;  \n	overflow: hidden;\n}\n\n.is-style-pulitzer-clamp-lines-2 p:first-child {\n	-webkit-line-clamp: 2;\n}\n\n.is-style-pulitzer-clamp-lines-3 p:first-child {\n	-webkit-line-clamp: 3;\n}
\n\n\n\n
\n\"List\n
\n\n\n\n

For basic steps on block styles, you should read my tutorial. It is titled Mastering Custom Block Styles in WordPress: 6 Methods for Theme and Plugin Developers.

\n\n\n\n

Alternative post layouts

\n\n\n\n

Norén followed a tutorial on the WordPress Developer Blog: Upgrading the site-editing experience with custom template part areas by Justin Tadlock. He added different post layouts as template parts. They are registered to a custom “posts” template parts area.

\n\n\n\n\n\"Screenshot\n\n\n\n\"Screenshot\n\n\n\n\n
\n

“It’s a shame that you can’t use the ‘Choose a header/footer’ modal for custom template part areas yet. It would make switching between template parts a lot more intuitive. There’s an open issue for it here: Add support for replacing “general” template parts,” Norén discovered.

\n
\n\n\n\n\"Examples\n\n\n\n

The extra post layouts were created as patterns to be added into the respective template parts.

\n\n\n\n

The patterns are in separate files in the patterns folder prefixed with hidden-posts– with the settings: Categories: hidden and Inserter: no

\n\n\n\n\n\"File\n\n\n\n\n\n\n\n\n

404-template and the Search block

\n\n\n\n

For the 404-template, the search form is loaded as a hidden pattern, both here and in the search template. This ensures that styling and translatable strings stay consistent.

\n\n\n\n

This is a great example for nesting template parts and patterns.

\n\n\n\n

The Search pattern is the smallest unit. It is included in the 404 pattern. Then, with the header and footer template parts, it is included in the 404.html template.

\n\n\n\n

The 404 Template schematic

\n\n\n\n
\n

Header

\n\n\n\n
\n

404 Pattern

\n\n\n\n
\n

Search Pattern

\n
\n
\n\n\n\n

Footer

\n
\n\n\n\n

Search Pattern

\n\n\n\n
PHP
<?php\n/**\n * Title: Search\n * Slug: pulitzer/hidden-search\n * Inserter: no\n */\n?>\n<!-- wp:search {\n							 \"label\":\"<?php echo esc_attr_x( \'Search\', \'search form label\', \'pulitzer\' ); ?>\",\n               \"showLabel\":false,\n               \"placeholder\":\"<?php echo esc_attr_x( \'Search for...\', \'search form placeholder\', \'pulitzer\' ); ?>\",\n               \"buttonText\":\"<?php echo esc_attr_x( \'Search\', \'search button text\', \'pulitzer\' ); ?>\",\n               \"buttonPosition\":\"button-inside\",\n               \"buttonUseIcon\":true\n                } /-->
\n\n\n\n

404-Page Pattern

\n\n\n\n
PHP
<?php\n/**\n * Title: 404\n * Slug: pulitzer/hidden-404\n * Inserter: no\n */\n?>\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"var:preset|spacing|40\"}},\"layout\":{\"type\":\"constrained\",\"contentSize\":\"21em\"}} -->\n<div class=\"wp-block-group\">\n	<!-- wp:heading {\"textAlign\":\"center\",\"level\":1} -->\n	<h1 class=\"wp-block-heading has-text-align-center\" id=\"page-not-found\"><?php echo esc_html_x( \'Error 404\', \'Heading for a webpage that is not found\', \'pulitzer\' ); ?></h1>\n	<!-- /wp:heading -->\n\n	<!-- wp:paragraph {\"align\":\"center\"} -->\n	<p class=\"has-text-align-center\"><?php echo esc_html_x( \'We can’t find the page you’re looking for. Go back to the front page, or try the search form below.\', \'Message to convey that a webpage could not be found\', \'pulitzer\' ); ?></p>\n	<!-- /wp:paragraph -->\n</div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"layout\":{\"type\":\"constrained\",\"contentSize\":\"240px\"}} -->\n<div class=\"wp-block-group\">\n	<!-- wp:pattern {\"slug\":\"pulitzer/hidden-search\"} /-->\n</div>\n<!-- /wp:group -->
\n\n\n\n

404-Page Template

\n\n\n\n
PHP
<!-- wp:template-part {\"slug\":\"header\",\"area\":\"header\",\"tagName\":\"header\"} /-->\n\n<!-- wp:group {\"tagName\":\"main\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|100\",\"bottom\":\"var:preset|spacing|100\"}}},\"layout\":{\"type\":\"constrained\"}} -->\n<main class=\"wp-block-group alignfull\" style=\"padding-top:var(--wp--preset--spacing--100);padding-bottom:var(--wp--preset--spacing--100)\">\n	<!-- wp:pattern {\"slug\":\"pulitzer/hidden-404\"} /-->\n</main>\n<!-- /wp:group -->\n\n<!-- wp:template-part {\"slug\":\"footer\",\"area\":\"footer\",\"tagName\":\"footer\"} /-->
\n\n\n\n
\n\"Screenshot\n
\n\n\n\n

Fourth task: handling blocks

\n\n\n\n

There are specific blocks outside core blocks that need more than styling. Some php code will definitely be involved:

\n\n\n\n

Jetpack blocks

\n\n\n\n

For Jetpack blocks, conditional output is simple since the plugin registers blocks only when modules are active. Norén implemented a helper function to check if blocks are registered before using them in pattern PHP files.

\n\n\n\n

In functions.php Norén created a helper function to check if a certain block is available pulitzer_is_block_registered().

\n\n\n\n
PHP
/**\n * Check if a block is registered.\n */\nif ( ! function_exists( \'pulitzer_is_block_registered\' ) ) :\n	/**\n	 * Check if a block is registered\n	 *\n	 * @since Pulitzer 1.0\n	 * @return bool\n	 */\n	function pulitzer_is_block_registered( $block_name ) {\n		$registry = WP_Block_Type_Registry::get_instance();\n 		return $registry->get_registered( $block_name );\n	}\nendif;
\n\n\n\n

This helper function is then available for the conditional check in the pattern:

\n\n\n\n

Examples for the jetpack/like button. You can inspect the whole code for the hidden-single sharing-row pattern on GitHub.

\n\n\n\n
PHP
<?php if ( pulitzer_is_block_registered( \'jetpack/like\' ) ) : ?>\n			<!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"6px\"}}}} -->\n			<div class=\"wp-block-group\" style=\"padding-top:6px\">\n				<!-- wp:jetpack/like /-->\n			</div>\n			<!-- /wp:group -->\n<?php endif; ?>
\n\n\n\n

For the like button, share buttons and newsletter signup, he utilized styled versions of Jetpack blocks. Using block stylesheet registration ensures the CSS is loaded only when a block is in use.

\n\n\n\n
\n\"\"\n\n\n\n

\n
\n\n\n\n

Block Bindings API blocks

\n\n\n\n

In the final version, Pulitzer includes three use cases of the Block Binding API:

\n\n\n\n
    \n
  • Number of comments on a post, with a link to the post comments form.
  • \n\n\n\n
  • Reading time of a post.
  • \n\n\n\n
  • Current year next to the copyright note in the footer.
  • \n
\n\n\n\n
\n

“Wow. Those of you who said the new Block bindings API is easy to use weren’t kidding. It took me all of 40 mins to get the reading time and copyright year blocks up and running, having never touched it before. Game changer.”

\nAnders Norén
\n\n\n\n

The two blog posts that helped Norén to catch up on the feature:

\n\n\n\n\n\n\n\n

The php code is in functions.php, starting line 240

\n\n\n\n\n\n\n\n

Step one: register the block binding and its callback in functions.php.

\n\n\n\n
PHP
function pulitzer_register_block_bindings() {\n/*\n		 * Copyright character with current year.\n		 */\n		register_block_bindings_source( \n			\'pulitzer/copyright-year\', \n			array(\n				\'label\'              => __( \'Copyright year\', \'pulitzer\' ),\n				\'get_value_callback\' => \'pulitzer_block_binding_callback_copyright_year\'\n			)\n		);\n}\nadd_action( \'init\', \'pulitzer_register_block_bindings\' );
\n\n\n\n

Step two: create the callback function reference in the step before.

\n\n\n\n
pulitzer_block_binding_callback_copyright_year
/*\n * Block bindings callback:\n * Copyright character with current year.\n */\nif ( ! function_exists( \'pulitzer_block_binding_callback_copyright_year\' ) ) :\n	/**\n	 * Block bindings callback\n	 * Copyright character with current year\n	 *\n	 * @since Pulitzer 1.0\n	 * @return string\n	 */\n	function pulitzer_block_binding_callback_copyright_year() {\n		return \'© \' . date( \'Y\' );\n	}\nendif;\n
\n\n\n\n

Step three: add the block to the pattern.

\n\n\n\n
HTML
<!-- wp:paragraph {\"metadata\":{\"bindings\":{\"content\":{\"source\":\"pulitzer/copyright-year\"}}}} -->\n			<p><?php esc_html_e(\'© [year]\', \'pulitzer\');?></p>\n<!-- /wp:paragraph -->
\n\n\n\n
\n\"Close\n
\n\n\n\n

Reading Time

\n\n\n\n

Justin Tadlock kindly offered Norén to use his code for calculating reading time.

\n\n\n\n
\n

“I’ve been using his PHP snippets for 15+ years, so why stop now?” — Norén

\n
\n\n\n\n

Functions.php is your first location to find out how this block binding was created. You can also see what the callback function does. Then, look into any of the post patterns to see how it is used there.

\n\n\n\n

Comments count

\n\n\n\n\"Single\n\n\n\n
\n

“I decided to add one for the comments count link on the archive pages as well. It’s crazy that a “X comments” block linking to the comments field hasn’t landed in Core yet. (It’s in Gutenberg). Slippery slope? Maybe, but I’m on a deadline, so that’s for another day.” — Anders Norén

\n
\n\n\n\n
PHP
 * Block bindings callback:\n * Post comments count.\n */\n\nif ( ! function_exists( \'pulitzer_block_binding_callback_post_comments_count\' ) ) :\n	/**\n	 * Block bindings callback\n	 * Post comments count.\n	 *\n	 * @since Pulitzer 1.0\n	 * @return string\n	 */\n	function pulitzer_block_binding_callback_post_comments_count( array $source_args, WP_Block $block_instance, string $attribute_name ) {\n		$post_id = $block_instance->context[\'postId\'] ?? get_the_ID();\n\n		if ( ! comments_open( $post_id ) ) return false;\n\n		$comments_link = \'<a class=\"pulitzer-comment-count-link\" href=\"\' . esc_url( get_comments_link( $post_id ) ) . \'\">\';\n		$comments_link .= \'<span class=\"count\">\' . esc_html( get_comments_number( $post_id ) ) . \'</span>\';\n		$comments_link .= \'</a>\';\n\n		return $comments_link;\n\n	}\nendif;
\n\n\n\n

It’s one of the rare moments you need to look into the theme’s style.css to find the styling for the comment count bubble.

\n\n\n\n
\n

“Rare is the block theme where you don’t end up creating at least one issue in the Gutenberg repo, or think you ought to. Turns out the hasIcon:false setting for the navigation block only works if the navigation doesn’t have any styles set. (61181)” – Anders Norén

\n
\n\n\n\n

Fifth Task: Patterns

\n\n\n\n

In block themes, patterns are simply PHP files in the /patterns/ folder.

\n\n\n\n

You can study the code for the Patterns by following the GitHub links. As mentioned above, Norén uses small php snippets with his text strings, to allow for translations.

\n\n\n\n

Here is an example:

\n\n\n\n
\n
<!-- wp:paragraph {\"fontSize\":\"large\"} -->\n<p class=\"has-large-font-size\"><?php esc_html_e( \'I have a long and storied career in the newspaper and publishing industry behind me. Testimonials are available by request.\', \'pulitzer\' ); ?></p>\n<!-- /wp:paragraph -->
\n
\n\n\n\n

Learn more about preparing a theme to be used with multiple languages in the Theme Handbook > Advanced topics > Internationalization.

\n\n\n\n

The newsletter page pattern

\n\n\n\n

See Demo pageCode on GitHub

\n\n\n\n\"Close\n\n\n\n

The resume page pattern

\n\n\n\n

The resume list is separate. It can be added on its own to an existing page. It can also be modified for a different historical timeline.

\n\n\n\n

See Demo Page | Code view on GitHub | Code Resume List Pattern

\n\n\n\n\n\"Screenshot\n\n\n\n\n

Contact Page Pattern

\n\n\n\n

Patterns are PHP files. You can use loops to output recurring block layouts. This includes layouts like the stack of five columns used to list contact approaches in the Contact page pattern. It makes the patterns easier to maintain.

\n\n\n\n

On GitHub: Contact List Pattern | Contact Page Pattern

\n\n\n\n\n\"Screenshot\n\n\n\n\n

Sixth Task: Style Variations

\n\n\n\n

On to theme style variations! These are included as /styles/[name].json files in block themes. Users can select them at Editor → Styles. Theme style variations can modify just about anything set in theme.json, but Norén was sticking to a single simple Inverted style for 1.0. Later he added two more styles, “Humanist” and “Parchment.”

\n\n\n\n\"Screenshot\n\n\n\n
Inverted.json
{\n	\"settings\": {\n		\"color\": {\n			\"palette\": [\n				{\n					\"color\": \"#111111\",\n					\"name\": \"Base\",\n					\"slug\": \"base\"\n				},\n				{\n					\"color\": \"#161616\",\n					\"name\": \"Base / Two\",\n					\"slug\": \"base-2\"\n				},\n				{\n					\"color\": \"#FFFFFF\",\n					\"name\": \"Contrast\",\n					\"slug\": \"contrast\"\n				},\n				{\n					\"color\": \"#7F7F7F\",\n					\"name\": \"Contrast / Two\",\n					\"slug\": \"contrast-2\"\n				},\n				{\n					\"color\": \"#616161\",\n					\"name\": \"Contrast / Three\",\n					\"slug\": \"contrast-3\"\n				},\n				{\n					\"color\": \"#4A4A4A\",\n					\"name\": \"Contrast / Four\",\n					\"slug\": \"contrast-4\"\n				},\n				{\n					\"color\": \"#222222\",\n					\"name\": \"Contrast / Five\",\n					\"slug\": \"contrast-5\"\n				}\n			]\n		}\n	},\n    \"title\": \"Inverted\",\n	\"$schema\": \"https://schemas.wp.org/trunk/theme.json\",\n    \"version\": 2\n}
\n\n\n\n

Seventh Task: Submit to the Repository

\n\n\n\n
\n

“I’ve done another round of cleanup and polish, received the all-clear from the theme check plugin, added a proper theme description and created an info page about the theme on my site.”

\n\n\n\n

Anders Norén

\n
\n\n\n\n\"Screenshot\n\n\n\n

For more detailed information, you can find in the Theme Handbook page: Submitting Your Theme to WordPress.org.

\n\n\n\n

Pulitzer is available in the WordPress Theme repository

\n\n\n\n\"Final\n\n\n\n
\n\n\n\n

After the X (formerly known as Twitter) Thread was published, Anders Norén wrote a blog post almost exactly a year ago. The post introduced the Pulitzer theme.

\n\n\n\n
\n

“I also want to say thank you to everyone who has reached out to say they appreciate the thread. I wasn’t sure if this would end up at all useful or interesting to anyone, so it means a lot.”

\nAnders Norén
\n\n\n\n

Share what your process looks like in the comments, also share your challenges working with block themes, or what you learn on the way. You can also join us on Discord to discuss with other theme and block developers.

\n\n\n\n
\n\n\n\n

Who is Anders Norén?

\n\n\n
\n\"Avatar:
\n\n\n

Andres Norén is a freelance designer & developer living in the Swedish mountains. You can now follow him on Bluesky, or read his blog.

\n\n\n\n

Eleven years ago, Norén published his first Theme in the WordPress repository, Wilson in 2014. There are now 33 Themes by him available.

\n\n\n\n

He has been an early adopter of block themes with his theme Tove, first released in September 2021. In January of this year, he released his twelfth block theme: Speakermann. You can take a look at all block themes by Norén in the repository.

\n\n\n\n

You can support Anders Norén and his work by sponsoring him on Ko-fiGitHub, or PayPal.

\n\n\n\n

Anders Norén was also a guest on the Gutenberg Time Live Q & A.
He discussed the transition from Classic Themes to block-based Themes together with Carolina Nymark and Ellen Bauer. This took place on October 21, 2021.

\n\n\n\n
\n\n
\n\n\n\n

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 10 May 2025 09:46:32 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:11;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Matt: Code Matters\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=142334\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://ma.tt/2025/05/code-matters/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:265:\"

It looks like the code that the newly announced Figma Sites is producing isn’t the best.

\n\n\n\n
\n\n
\n\n\n\n

There are some cool Figma-to-WordPress workflows; I hope Sites gets more people exploring those options.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 09 May 2025 22:59:18 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:12;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"Gravatar: How to Design an Author Brand Readers Remember\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"http://blog.gravatar.com/?p=3165\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://blog.gravatar.com/2025/05/09/author-branding/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:17379:\"

With more than 500,000 books published each year, many authors struggle to differentiate themselves in a saturated market. Your words might be brilliant, but without a recognizable brand, they can easily get lost among countless other titles on physical and virtual shelves.

\n\n\n\n

A solid author branding strategy needs to go beyond traditional approaches. If you want people to recognize and remember your work, you need a multi-platform presence and to maintain brand consistency. The most successful authors don’t just write great books – they craft authentic identities that resonate with their target audience.

\n\n\n\n

If you’re struggling to get to this point, you’re not alone. For many creatives, the most challenging part of being an author is the need to promote oneself, which makes the whole branding process a bit intimidating. 

\n\n\n\n

To help you in this, we’ll give you a practical roadmap for establishing an authentic author brand, helping you to create visual recognition with advanced strategies that will help your work get noticed. Whether you’re just starting out or looking to refresh your existing presence, these techniques will help you build meaningful connections with readers.

\n\n\n\n

Crafting an unforgettable author brand: Key strategies for standing out

\n\n\n\n

Authors face a unique challenge: Creating a professional presence that attracts readers while remaining authentic to their writing style and voice. This balance between marketability and authenticity forms the foundation of effective author branding.

\n\n\n\n

The first thing you need to understand is that your genre is the main thing that will shape branding decisions. For example, fiction writers often benefit from creative visual branding or custom-built websites that reflect their story themes. A fantasy author might use mystical imagery and an immersive website design, while a thriller writer, like James Rollins, might opt for darker tones and suspenseful elements. 

\n\n\n\n\"1\n\n\n\n

Academic and non-fiction authors (like Richard P. Rumelt in the example below) typically prefer sleeker, more professional branding with verified credentials, professional profiles, and links to the various places people can buy their books.

\n\n\n\n\"2\n\n\n\n

However, for successful author brands, the website design is just the beginning. You need to create an overarching strategy that intersects your unique writing style, genre positioning, and reader relationships. Each element reinforces the others, creating a cohesive identity readers can connect with.

\n\n\n\n

To start developing your author brand, follow these practical steps:

\n\n\n\n
    \n
  1. Extract core themes from your writing – recurring motifs, values, or perspectives – and incorporate them into your brand identity.
  2. \n\n\n\n
  3. Study successful authors in your genre, noting how they position themselves visually and verbally.
  4. \n\n\n\n
  5. Design a sustainable engagement strategy across multiple platforms that fits your writing schedule and energy levels.
  6. \n\n\n\n
  7. Build recognition through consistent profile management across publishing platforms, social media, and professional networks.
  8. \n
\n\n\n\n

\"⚠\"Branding isn’t about creating a false persona, and authenticity resonates more than perfection. Let your unique voice guide your branding decisions, and readers will naturally connect with both you and your work.

\n\n\n\n

Storytelling and voice: Making your brand uniquely yours

\n\n\n\n

The most effective author brands maintain narrative consistency across all touchpoints – books, newsletters, social media posts, and author interviews. However, being consistent doesn’t equal being repetitive; it means ensuring your unique perspective shines through everything you create.

\n\n\n\n

Now, we know this can sound a bit like a chore, especially if you’re not used to being active online. Still, it’s a necessary one and kind of like an extension of your storytelling abilities – an opportunity to weave your experiences and expertise into every interaction with readers. Your personal anecdotes, thought processes, and distinct point of view are assets that make your brand impossible to duplicate.

\n\n\n\n

One of the most common ways for authors to connect with audiences is to share their knowledge through workshops and writing tips, which serve multiple purposes. Not only does teaching help others, but it also positions you as an authority in your genre. A romance novelist hosting dialogue-writing workshops or a mystery author sharing plot-twisting techniques creates value while strengthening their brand identity.

\n\n\n\n

And these brand-building activities need not feel forced. The same creativity that fuels your writing can make branding feel like a natural extension of your work rather than a separate marketing task. When your authentic voice remains consistent, readers recognize it instantly, whether in your books or your latest social media update.

\n\n\n\n

Visual elements that captivate readers

\n\n\n\n

While written content forms the foundation of an author’s work, visual elements create immediate recognition and emotional connection. Your visual identity – from author photos to website design – communicates volumes before readers encounter a single word you’ve written.

\n\n\n\n

Video content has become particularly powerful for author branding. Maintaining a YouTube channel, like authors Christopher Paolini and Xiran Jay Zhao have done, allows readers to connect with your personality beyond the page. 

\n\n\n\n

They’re also great examples of the different approaches authors can take regarding their content. Christopher’s channel is all centered around his books, especially the Eragon universe, with only his latest video being about keyboards (an author’s best friend). 

\n\n\n\n\"3\n\n\n\n

Xiran, on the other hand, actually built her YouTube audience before she even published her book and got popular by analyzing movies and series that contain Chinese elements and characters (Mulan, Avatar: The Last Airbender, and Turning Red, just to mention a few). 

\n\n\n\n\"4\n\n\n\n

All of this is to say that your channel can be about anything that your audience (and you!) find interesting. This could include book discussions, writing process insights, or behind-the-scenes glimpses of research trips.

\n\n\n\n

Beyond YouTube, simple visual consistency across platforms can also dramatically increase recognition. When readers see the same professional headshot, color scheme, and typography across your website, book jackets, and social accounts, they subconsciously register a cohesive brand.

\n\n\n\n

Several tools help maintain this visual consistency without requiring graphic design expertise. Gravatar, for instance, provides profile management that ensures your image appears consistently across hundreds of websites and platforms. This visual continuity builds recognition while simplifying the technical aspects of maintaining your author brand across the internet.

\n\n\n\n

Building a multi-platform author presence

\n\n\n\n

Being on multiple platforms is great. It lets you cast a wider net on potential audiences, and it keeps you in the loop. However, there is one drawback – you don’t actually own any of those profiles. If a platform goes down, so does your profile, and while some of them look eternal, none of them are (remember MySpace?). 

\n\n\n\n

This is why your author website should be the central hub of your online presence – a permanent digital home where readers can find your complete bibliography, background information, upcoming releases, and blog content. Unlike social media platforms that come and go, your website remains under your control, making it an essential foundation for long-term brand building.

\n\n\n\n

For authors using WordPress, the Gravatar author block can automatically sign off blog posts with your profile information, providing consistent branding while boosting your site’s SEO through proper authorship markup. 

\n\n\n\n\"5\n\n\n\n

This simple implementation helps search engines understand who created the content, potentially improving visibility for your work.

\n\n\n\n

Still, you shouldn’t write off other platforms completely, despite their potential brevity. A multi-platform approach allows you to meet readers where they already spend time online, expanding your reach beyond those who actively seek you out.

\n\n\n\n

X (formerly Twitter) has long been a primary platform for authors to share thoughts, engage with readers, and connect with publishing professionals. Now, it is slowly being overtaken by Bluesky, and the idea behind it is the same – share immediate thoughts and updates and connect quickly with your readers. 

\n\n\n\n\"6\n\n\n\n

There are also alternative platforms, which often provide more targeted opportunities to reach specific audiences. Slack and Discord communities dedicated to literature or particular genres are becoming increasingly more popular because they promote safe spaces for meaningful discussion with engaged readers. 

\n\n\n\n

Technical authors, on the other hand, might find GitHub an unexpected but valuable platform for demonstrating expertise and connecting with technically-minded readers. On both platforms, your Gravatar avatar automatically displays, maintaining visual consistency across these diverse spaces.

\n\n\n\n

Whatever you chosen bundle of platforms is, strategic content adaptation will maximizes the impact of your work across platforms. A blog post can transform into a Twitter thread, newsletter excerpts, Instagram quotes, or discussion topics for online communities – each tailored to the platform’s format while preserving your distinctive voice and message.

\n\n\n\n

This cross-platform presence builds more than just visibility. It establishes trust through verification and consistency. When readers encounter your recognizable branding across multiple channels, their confidence in your authenticity grows, especially when platforms like Gravatar provide verification mechanisms that confirm you are who you claim to be.

\n\n\n\n

Streamline your brand management with Gravatar

\n\n\n\n\"7\n\n\n\n

Managing multiple online profiles across various platforms can quickly become overwhelming. Gravatar offers a solution specifically valuable for authors seeking efficient brand management without the administrative headache.

\n\n\n\n

A Gravatar profile serves as a centralized online identity hub where authors can build an authentic digital presence that fosters trust with readers. The platform includes:

\n\n\n\n
    \n
  • Verification badges and the ability to link to your various online profiles, proving you’re the genuine author behind the work. 
  • \n
\n\n\n\n\"8\n\n\n\n
    \n
  • The ability to showcase your portfolio directly within your Gravatar profile, making it easy for potential readers to discover your publications with a single click.
  • \n
\n\n\n\n\"9\n\n\n\n
    \n
  • Customization options that allow you to tailor your profile to match your author brand’s visual style. This includes colors, fonts, and imagery that align with your book covers and website design.
  • \n
\n\n\n\n\"10\n\n\n\n
    \n
  • Automatic profile syncing – this means that when you update your author photo once, the changes propagate everywhere your Gravatar appears, including WordPress, GitHub, Slack, and hundreds of other platforms. 
  • \n\n\n\n
  • The ability to maintain separate profiles for different genres, pen names, or to separate professional and personal identities – all managed from a single account.
  • \n\n\n\n
  • A unique QR code for each profile, allowing you to instantly connect with people in real-life conversations like conventions, university talks, or other events. Just add the code to your phone wallet, and you’re ready to share your profile!
  • \n
\n\n\n\n\"11\n\n\n\n

Launch your enhanced author brand today

\n\n\n\n

Effective author branding doesn’t require massive budgets or complex marketing strategies. It’s about starting small with authentic, consistent efforts that grow over time. Even minor improvements to your online presence can significantly impact how readers perceive and remember your work.

\n\n\n\n

Begin by examining authors you admire. Study how they present themselves online – not to copy their style, but to understand what makes their brand effective. Notice how the most memorable author brands maintain consistency across all platforms while allowing their authentic personality to shine through.

\n\n\n\n

You should also pay attention to their profile management – the authors whose careers continue to flourish typically maintain consistent, professional images across platforms. This is where tools like Gravatar naturally tie into author branding. By centralizing your profile management, Gravatar helps you maintain a consistent and trusted professional author presence across numerous platforms without the typical administrative burden.

\n\n\n\n

Building an authentic author brand takes time, but the first steps are simple. Start today and create a free Gravatar profile to begin establishing your consistent online presence.

\n\n\n\n\"\"\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 09 May 2025 14:38:33 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Ronnie Burt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:13;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"Do The Woo Community: Bits and Pieces of the Channel with BobWP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=96788\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"https://dothewoo.io/bits-and-pieces-of-the-channel-with-bobwp/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:175:\"In this episode, Bob discusses updates for WordCamp Europe, including minor show name changes, a new host announcement, and the relocation of daily posts to his personal blog.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 08 May 2025 13:46:47 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:14;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"Do The Woo Community: Daily Posts Packing Up and Taking a Trip\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96776\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"https://dothewoo.io/blog/daily-posts-packing-up-and-taking-a-trip/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:54:\"Taking a break on these posts for a couple of reasons.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 08 May 2025 08:34:29 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:15;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"Akismet: Version 5.4 of the Akismet WordPress plugin is available now\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://akismet.com/?p=284412\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:37:\"https://akismet.com/blog/akismet-5-4/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:892:\"

Version 5.4 of the Akismet plugin for WordPress is now available. This update contains the following improvements:

\n\n\n
  • We’ve added a “Compatible Plugins” section to the Akismet settings page that shows any other installed and active plugins that are compatible with Akismet, along with links to documentation on how to ensure they’re working together.
  • \n\n
  • The stats pages now use the user’s locale instead of the site’s locale if they’re different.
\n\n\n

To upgrade, visit the Updates page of your WordPress dashboard and follow the instructions. If you need to download the plugin zip file directly, links to all versions are available in the WordPress plugins directory.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 May 2025 16:38:11 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"Christopher Finke\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:16;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"WPTavern: #168 – Hari Shanker on Understanding and Showing WordPress Contributions\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=195550\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:98:\"https://wptavern.com/podcast/168-hari-shanker-on-understanding-and-showing-wordpress-contributions\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:50444:\"Transcript
\n

[00:00:19] Nathan Wrigley: Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.

\n\n\n\n

Jukebox is a podcast which is dedicated to all things WordPress. The people, the events, the plugins, the blocks, the themes, and in this case understanding the nature of WordPress contributions and making sure that contributors understand where they might be needed.

\n\n\n\n

If you’d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to wptavern.com/feed/podcast. And you can copy that URL into host podcast players.

\n\n\n\n

If you have a topic that you’d like us to feature on the podcast, I’m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wptavern.com/contact/jukebox, and use the form there.

\n\n\n\n

So on the podcast today, we have Hari Shanker. Hari has been a member of the WordPress community since 2007, and has contributed in various capacities, including as a full-time contributor for several years, working with Automattic, working with initiatives like Five for the Future, and supporting numerous community events around the world. He currently volunteers his time as a community program manager, helping to grow and support the WordPress ecosystem from his home in India.

\n\n\n\n

If you’re involved in the WordPress project, you likely know how vast and complex the contributor ecosystem can be, but you might not have heard of the WordPress Contribution Health Dashboards. An experimental initiative aimed at making sense of all the communities moving parts by gathering, visualizing, and sharing contribution data.

\n\n\n\n

But why does WordPress need something like this? Well, it could help new and existing contributors figure out where to pitch in, and how their work might guide the project’s future growth. Hari’s here to explain.

\n\n\n\n

We start the podcast by going off on a tangent, discussing the landscape of WordPress in India. India is experiencing a huge upswell in community activity, innovation and youth engagement, and it’s exciting to hear about.

\n\n\n\n

We then dive into the main thrust of the podcast, the Contribution Health Dashboards. How the idea came about. Who helped drive it forwards. Why it’s proving so challenging to build, and the massive value it promises for contributors, team reps, project leadership, and anyone curious about where WordPress needs help.

\n\n\n\n

We look at the practical aspects too. What tools are, and aren’t, available? The difficulty of tracking data across the many platforms WordPress uses, and what kinds of skills, and volunteers are needed to push this work forward.

\n\n\n\n

Hari shares his vision for accessible visual dashboards that can guide contributors of all skill sets, and help make the best of every single contribution hour.

\n\n\n\n

If you’ve ever wondered how to make your WordPress contributions matter even more, or how the project could be better supported by data driven insights, this episode is for you.

\n\n\n\n

If you’re interested in finding out more, you can find all of the links in the show notes by heading to wptavern.com/podcast, where you’ll find all the other episodes as well.

\n\n\n\n

And so without further delay, I bring you Hari Shanker.

\n\n\n\n

I am joined on the podcast by Hari Shanker. Thank you for joining me.

\n\n\n\n

[00:03:53] Hari Shanker: Thank you for inviting me to the podcast and I’m so excited to be here, Nathan.

\n\n\n\n

[00:03:58] Nathan Wrigley: I am really pleased that you’ve joined me. We had aspirations of doing this podcast from Manila, but things conspired against us, and so we are doing this via an online call, let’s say a Zoom call or something like that. So I’m really pleased that we could finally hook up.

\n\n\n\n

The intention is to talk today about something that I suspect many people in the WordPress community will not know a great deal about. So it is called the WordPress Contribution Health Dashboard, or dashboards I should say. And we’ll get into that in a moment. What it is. Why it exists, and how that project is moving along.

\n\n\n\n

But before then, Hari, would you mind just giving us your little bio, your introduction to who you are, where you live, what you do in the WordPress space. As much as you like, really over to you.

\n\n\n\n

[00:04:44] Hari Shanker: Thank you so much, Nathan. So my name Hari Shanker. I live in the south of India, in a city called Kochi. I’ve been with the WordPress community since 2007. I’ve been contributing actively since 2016. I have been contributing full-time. I had been contributing full-time from 2020 to 2024.

\n\n\n\n

At this point, I’m a volunteer contributor. I used to work with Automattic for a while, from 2016 to 2025. At this point I’m not employed, I am a volunteer contributor, very much excited to work on WordPress. And I’ve done a bunch of things with WordPress. WordPress is one of my biggest passions.

\n\n\n\n

My work has mostly been in the community team. I am still a community program manager, which means I approve events, I support events, and my work has mostly been in the contributor experience of WordPress. I led the Five for the Future initiative for quite a long time. And I was also working on the WordPress Contributor Working Group, where we held three editions of the WordPress Contributor Mentorship Program.

\n\n\n\n

As I said, I live in Kochi. I have a wife and I have three cats. I absolutely love it here. They call Kerala Gods own country, and I love the state, I love where I live. And I love the fact that I can work on the best open source software in the world, sitting in my lovely little city, in my lovely little apartment. That’s all about me.

\n\n\n\n

[00:05:58] Nathan Wrigley: That’s so nice. That’s really lovely. Can I just segue a little bit and steer away from the conversation that we’re intending to have? And ask you about WordPress in India?

\n\n\n\n

Now, obviously you may not have your finger on the pulse of everything that’s going on, but I’m curious. Not having been to India during the period I’ve been using WordPress, I have an intuition that it’s a thriving community over there, dare I even say, a growing community.

\n\n\n\n

But that’s just based upon the little bits and pieces that I’ve captured from friends, and articles that I’ve seen. And there seems to be this big upswell in plugin development, and agencies that are really doing great work. So there isn’t really a question there, it’s just more, tell us about how WordPress is going in India.

\n\n\n\n

[00:06:40] Hari Shanker: Absolutely. So you got it right. WordPress, the WordPress economy, the WordPress ecosystem is really thriving. As you said, it’s everywhere. Like, the plugin ecosystem, we have VIP agencies. We have so much innovation happening in WordPress. We have companies like InstaWP. We have agencies like rtCamp, Multidots. There’s so much innovation happening. That’s just the tip of the iceberg.

\n\n\n\n

There is also so much community activities happening. We’ve had so many of these events, so many innovative WordPress events, we’ve had WordCamps.

\n\n\n\n

So I was involved in setting up an event called WordPress Photo Festival, and we’ve had a WP Campus Connect. We’ve had a host of women’s day events that were held on March 8th. Again, that’s the tip of the iceberg. There’s so many activities happening. So be it innovation in plugin development or theme development.

\n\n\n\n

And again, themes are big in India. We have had, Astra theme comes from India. So many of these activities happening. And it’s not just centered in one city, it is really all over the place. So in Kerala where I live in, we have very thriving community. We have folks who’ve come up from the community, and who’ve built things that have made waves all over the world. And again, across different cities, be it Mumbai, Pune, Ahmadabad, Kolkata, Ajmer.

\n\n\n\n

So India is, as you know, is a big country. So we have a host of these local WordPress meetup groups and several thousands of community members. And I do not use the word thousand as a euphemism. It really is, like we actually have thousands of community members who are doing cutting edge work. And I can tell you, it is so inspiring to see. I mean, as an open source fan, like it really gives me the energy to keep going.

\n\n\n\n

So yeah, you are right. WordPress is thriving. And we have WordCamp Asia coming to India, in Mumbai in 2026. I am very excited about that.

\n\n\n\n

I was actually the mentor of WordCamp Asia for a short while, but this point I’ve stepped down. I have applied as an organiser and I hope to be in the organising team as well. So I think it’s the best time for WordPress in India, and we still have heights to conquer. The best is yet to come. Super excited about all that.

\n\n\n\n

[00:08:36] Nathan Wrigley: Yeah, that’s really great because it does seem in different parts of the world, and maybe this will feed into the conversation that we’re about to have, it does feel in other parts of the world. So I’m in the UK, and it does feel that the community side of things has definitely taken a bit of a hit since the pandemic, so 2019 and beyond.

\n\n\n\n

Those meetups that happened in some cases have come back, but in the majority of cases, they still are either dormant or perhaps have been abandoned. And I feel that the same might be true across Europe and North America. I can’t speak to whether that is accurate or not, but that’s the feeling that I get.

\n\n\n\n

It does feel, like I said, the news that I see, the articles that I read in WordPress journalism, it really does feel like India is exactly as you’ve described it. But also it feels like it’s not just confined to WordPress, it’s tech in general. It feels like there’s, well, maybe renaissance is the wrong word, but there’s just a huge pivot in all things tech over to places like India. You know, whether that’s, I don’t know, SaaS apps and so on, but CMSs as well. It does feel like India is definitely on the rise in all manner of tech.

\n\n\n\n

[00:09:41] Hari Shanker: Absolutely. I think there’s a bunch of reasons for it, but in my mind, I think a big reason for that, I wouldn’t call it the biggest reason, is our very young population. India’s population at this point is over 1.4 billion. I’m not aware of the latest number, but I think it’s around 1.5 billion. So off the top of my head, I think at least 50% of it is a young population. They are less than 35 years of age.

\n\n\n\n

All these young folks, they’re coming in with so much energy. There’s an abundance of human capital. And we are in the internet age, and one good thing that happened after COVID-19 is a lot of these folks got connected. And India has really cheap internet. I mean, of all the places that I’ve traveled to, internet in India has been the cheapest that I know. So it’s really easy to get connected.

\n\n\n\n

And a lot of these people who are connected, they’re using it very productively. That is one of the reasons why you’re seeing this spurt of activity. And there’s been a lot of these inspiring stories, which is really inspiring the youth. And WordPress being what it is, is seeing a lot of this innovation coming in.

\n\n\n\n

But I think, again, we’re really at the tip of the iceberg. The best is yet to come, because I see a lot more people coming into the community. And my hope is with WordCamp Asia happening next year, we will see a lot more of these young folks embracing WordPress, not just tech, but embracing WordPress, and doing a bunch of innovations. So I think the goal for the Indian community is to get all these young people to WordPress.

\n\n\n\n

[00:10:53] Nathan Wrigley: It’s interesting that you mentioned the young people. I was just wondering if there was a connection between, for example, education, you know, school and the emergence of jobs. I don’t know what age you leave school in India, but in the UK it would be typically 16 or 18. And at that point you’re perhaps going on to higher education, so university, something like that, or finding a job.

\n\n\n\n

And I think there’s been a real effort in the UK to supply education in tech. But it doesn’t really seem to pivot around open source software. It tends to pivot around, can I use this already existing product? Often a kind of Microsoft version of something, in order to create wealth or a job. But I don’t know if there’s more of a pivot in India to use open source things to teach those kind of things.

\n\n\n\n

So again, there’s no question there. It’s just more of an observation really.

\n\n\n\n

[00:11:41] Hari Shanker: Yeah, so I think your observation is pretty astute. But I think India has a bit of a USP here when it comes to open source. We have had an open source movement since time immemorial. I mean, specifically my state of Kerala, we have a very uniquely liberal government. So they sort of stepped away from proprietary software and embraced open source software as early as in the nineties.

\n\n\n\n

So Richard Stallman, when he used to be active in the community, he used to visit Kerala almost every other year. And we, as a result of that, have a pretty thriving open source community in my state.

\n\n\n\n

All sorts of open source from Linux distributions, to Python and WordPress of course, and Drupal, and we have all these communities very active and thriving.

\n\n\n\n

And a lot of the young people, they get their introduction to tech through these open source communities, which have local chapters. It’s not just related to my state, even though my state has a pretty high population of this, a lot more people doing this. I would say that the open source movement is pretty active all across India. So we have these big open source conferences in some of the big universities. We have these small local chapters where people get active. So at some point or the other young people who are interested in tech, they get some introduction to open source. And a lot of people are enamoured by the philosophy.

\n\n\n\n

Now, coming specifically to the WordPress community, we have recently had some really good events. So these are in a youth camp format. I was involved in one of them. And there was an event called WP Campus Connect that was held in Ajmer, Rajasthan, which is held by Pooja Derashri. So these events, they were experiments really, but they’ve been quite successful, especially I would say the WP Camps Connect event. It’s been fantastic.

\n\n\n\n

Like, it was an event series, and as a result of those events, I don’t know the numbers, but off the top of my head, at least 200 to 300 people, 300 kids, they got introduced to WordPress directly. I’m not just talking about, you know, setting up websites, they got an introduction to the community. And those efforts are really paying off. We are seeing these people coming into the community and being active.

\n\n\n\n

So the gist of what I’m saying is, yes, you are right. We are seeing an open source movement and we, a lot of these young kids, I mean of course a lot of them, as you said, they move to proprietary technology, but they have more of a window into open source as they blossom.

\n\n\n\n

[00:13:40] Nathan Wrigley: The interesting thing I suppose about that is, given the long march of history and having many decades into the future, that groundswell amongst the younger people now is going to paint a really interesting picture in a couple of decades time. So in the 2030s and the 2040s, it’ll be interesting to see how that movement, the young people obviously going into the marketplace, and getting a job in some industry or other, it’d be interesting to see how that all plays out.

\n\n\n\n

Because one of the things that I always notice when I go to WordCamps is that age thing. The demographic of age, it always seems to skew older rather than younger, you know? If you were to say, how many people here are over, I don’t know, let’s say 45 or 50? I think there’d be quite a few hands. And if you would say, who’s under 20? Very few. Certainly in my part of the world. So it will be interesting how that shakes out.

\n\n\n\n

But how positive is that? That’s such a great way to begin this podcast. I don’t know if you want to, if you’ve got anything more you want to leverage into there quickly before we move on, feel free to.

\n\n\n\n

[00:14:40] Hari Shanker: I just want to add a quick comment. That is a huge opportunity, and to be honest with you, even in India, even with the huge population, the WordPress events that we have, we still haven’t seen that influx yet. But the good news is that it’s changing. It definitely has an effect because when I started organising events for the community in 2016, we got a lot of the young kids and I am seeing them.

\n\n\n\n

So it’s been eight years. I’m seeing the same people, they’re making waves. I know three or four specific examples of folks who got into the community as college students and then really went places. So if we are able to, when I say we, I’m referring to the WordPress community, or specifically the Indian WordPress community. If we are able to leverage it well, and if we manage to keep the momentum and grow it, I would say the sky is the limit. So I am super optimistic and extremely excited about where the future lies for WordPress in India.

\n\n\n\n

[00:15:25] Nathan Wrigley: So that was supposed to be like a one minute aside, and there we go. We’ve had a really interesting conversation about what WordPress is doing in your part of the world. Thank you for that. That was really interesting.

\n\n\n\n

Let’s pivot now to the article. And I’m going to, in the show notes, I’m going to link everybody to an article which Hari wrote towards the latter part of last year, so 2024, September. And it was called WordPress Contribution Health Dashboards: An Experiment.

\n\n\n\n

Now, obviously if you are in the WordPress ecosystem and you’ve been here for many years, you will have no doubt figured out how complicated and tangled WordPress is. Not just the community, but the software, the code, the events, the different teams which make up WordPress, the multitude of ways that you could become involved.

\n\n\n\n

And I think it would be fair to say that if you were new to WordPress, that could be pretty overwhelming. It would be fairly easy to sort of step into the community and think, what? Where do I belong? Where do I fit? Where is my experience best used? Where would I find the most, fun or engagement, or meaning in the WordPress space?

\n\n\n\n

And so it feels like these contribution health dashboards might be some version of trying to get an understanding of what WordPress is, where the gaps are, where the holes are being filled, where the holes in the future might emerge and so on. But just unpack it for us. Who’s involved? What is the idea of a contribution health dashboard?

\n\n\n\n

[00:16:54] Hari Shanker: Great question. And thank you for the excellent introduction, Nathan. I think you did a great job of explaining everything.

\n\n\n\n

To summarise, the idea behind the contribution dashboard is to have sort of like a cockpit or bird’s eye view of WordPress contributions. WordPress, as you know, has around 20, 22 contribution teams, and these teams are doing a bunch of different activities. As you said in your introduction, it’s very hard for everybody to follow this.

\n\n\n\n

So the hope of this project is to build a dashboard, or dashboards, which provide anyone, not just contributors, really anyone in the community to get an idea of where things are with WordPress. So it involves updates on the release, latest releases. It involves activities from various teams, like Core, community, training, photos, meta, et cetera.

\n\n\n\n

So to give anybody who is coming from any part, with any experience, to give them an idea about where things are. Because at this point it’s very hard to follow. We have these blogs, we have Slack, we have Trac, we have GitHub. When those contributions to spread out across multiple places, it’s very hard, even for experience folks to follow. So the hope behind this project was to simplify this with the help of data, and specifically data visualisation. So that is the project specifically.

\n\n\n\n

Now, as regards to who is involved, I will need to share some history and I promise I’ll be brief. So this started as a collaborative effort with a bunch of folks, I should say Courtney Robertson’s name. Courtney has been a real force for good for this project. Like, she’s been very active. So Courtney Robertson, Naoko Takano, myself, Isotta Peira, and a bunch of contributors all over the world.

\n\n\n\n

We all came up with this idea. This idea has been floated around for a long, long time. We need dashboards. It could be helpful. But we were not able to make a ton of progress.

\n\n\n\n

So around WordCamp Europe 2023, there was a question asked in the keynote to Matt Mullenweg and he advocated for it. He said it would perhaps be good to have dashboards, which will bring all this information together.

\n\n\n\n

So that was when all these efforts really gathered momentum. So Courtney was one of the first people to be really excited about this, she really led this forward. And since I was working on contribution health, I was part of the Contributor Working Group, I was also very excited about this. So Courtney and I, we joined hands and we kicked off efforts.

\n\n\n\n

So we first looked at having a tool that will help set things up. But that is when we realized that it could get really complicated, and a lot of the existing tools out there, it may not really fit the bill. But we also needed to find out what we need to measure. What should be there in these dashboards? That was a big question that we had.

\n\n\n\n

So we published a couple of blog posts in the Sustainability Team and the Meta Team. We got a bunch of ideas from the community. We did a lot of on the ground research. Progress was very slow, but we eventually found a tool called Bitergia. Bitergia is a paid tool, it costs a lot of money. Automattic were kind enough to sponsor the tool for the time being.

\n\n\n\n

So we got a paid subscription with some of us having access to it. And we looked at the data, we crunched numbers. But the limitation of Bitergia was that it only looked at GitHub, like the WordPress GitHub. So if you look at the dashboard, the data for that needs to come from various sources, right? The Make WordPress Slack, there’s the P2 blogs, there’s Trac. So this tool was only limited to GitHub.

\n\n\n\n

So after a lot of discussion with the community, and we held several project health hangouts all the way, Courtney Robertson, myself,  Naoko Takano, Isotta Peira, , all of us, we decided to do, with support from Josepha Hayden, who was then Executive Director of the project, and Chloe Brigmann, we decided to do an experiment.

\n\n\n\n

We picked three teams, which was the Core Team, Community Team, and the Training Team. And we identified some KPIs, or progress some metrics, which we found out by discussing with the team members. We used the tools that we have, which includes Bitergia and some data that was already available. For instance, for the 6.6 release, we had the spreadsheet which developers always release once a release comes out, like you have the list of contributors. So we crunched numbers, we did some visualisations, and we published the blog post that Nathan, you’ve linked in the show notes.

\n\n\n\n

So that is what we’ve done in short. It’s an experiment. We’ve shared some data that we have on what we’ve collected. We’ve identified some KPIs.

\n\n\n\n

So the challenge that we have is, building a full fledged dashboard is time intensive, resource intensive. The Bitergia dashboard that we have, it’s very limited. It does not give out out the whole information. That post really is a snapshot. And we have data from January through September, 2024.

\n\n\n\n

So the post, the content that we have, those are really snapshots of the project of contributions for the Core Team, Training Team and the Community Team, as well as stats for WordPress 6.6.

\n\n\n\n

We went out, we put it out there, we hope to get feedback. So that’s what we’ve done. We’ve not moved ahead from there. But that’s a whole executive summary of the project and a history of what we’ve done.

\n\n\n\n

We did get a lot of positive feedback from folks who were fascinated to find some of the information, which is not previously available. The good thing that we’ve done is we were also able to set some KPIs. But the work has not progressed since, we are still there. And it’s a resource intensive project, it needs more contributors and more work to be done in order to move forward. But that’s a brief summary of everything that we’ve done.

\n\n\n\n

[00:21:48] Nathan Wrigley: Perfect. We’ll get into that bit in a moment, the resource intensiveness of it. But just an observation from my point of view is that, typically, I think if you were to do this experiment in a corporate environment, the data would go to the board of directors, if you know what I mean. So that they could inspect that and figure out how to, I don’t know, cut out waste, or figure out who needed to be employed, where people needed to be pushed around in the organisation in order to maximise things.

\n\n\n\n

But whole point in a corporate environment would be the data would end up going north. It would end up towards the senior management way of looking at things. But this is not that. This is a democratised way. In effect, it’s kind of the opposite. The data is intended to be open for absolutely everybody, so all people can see all of the things.

\n\n\n\n

And if somebody new were to drop into the project, yes, they might not understand what all of the data means, but at least they might get an understanding of, okay, that team over there looks as if it’s really fallen on hard times. That team over there, they seem to be doing great. Okay, maybe some of my time needs to be given over here. But the point being, the data is not so that senior management can do things if you like. It’s so that everybody would be able to see the same view. I hope that’s what it is anyway.

\n\n\n\n

[00:23:04] Hari Shanker: That is exactly what it is, but we also hope to influence the senior management there as well. And when I say senior management, it’s not just for this project leadership, it’s also the contributors, the folks that keep the lights on. So that would mean Core committers, team representatives, anyone really.

\n\n\n\n

And again, like you said, the beauty of WordPress, it belongs to everybody. So that’s the way it’s supposed to be, right? So we want to make sure that anyone can benefit something from it. So if it’s a new contributor, they can find out which projects need help. They should be able to identify the areas that they can contribute directly to.

\n\n\n\n

For leadership, they should be able to see the leading indicators or like the areas where the project is doing really well. And the lagging indicators, where a project needs help so they can make better decisions. And they should be able to change the project goals alongside, by understanding the data. So essentially it is aimed at everybody, not just the top down folks. And that is the hope that we came to this with.

\n\n\n\n

[00:23:55] Nathan Wrigley: Yeah, perfect. Now, anybody that’s been in the WordPress space or contributed in any way you will have come across all the tools. You know, there are so many. There’s Trac, there’s P2, I suppose, if you’re working in that environment. There’s Slack. There’s probably a bunch of others as well. I’m sure you could list a whole bunch more.

\n\n\n\n

And if you’ve ever wrangled with APIs or, I don’t know, web hooks or whatever it may be, trying to wrangle data, it’s a hard task. And it does require a lot of human intervention at the beginning.

\n\n\n\n

I’m wondering, is the intention of the project to get it to the point where the human intervention can kind of step away? Because the hard work has been done. We’ve now understood how to capture the data. How to regurgitate the data. How to display the data. So that at some point it will be less about figuring out how to make the data meaningful and more about, okay, now everybody look at the data and draw conclusions from the data.

\n\n\n\n

But it sounded from your description as if we’re still in the, how do we even get the data in? How do we recycle the data? How do we pull it in, regurgitate it and display it ?Again, is that about right?

\n\n\n\n

[00:25:03] Hari Shanker: You are 100% right. That’s exactly where we are in at this point. I think I shared some of the background earlier. The challenge is, we are working on data, it’s a lot of work. I know this because I did a lot of the work in creating the pages that we have.

\n\n\n\n

Unfortunately, we do not have a tool that gets all the data from all the sources. Any tool that we have, it will need to be customised extensively, and that needs developer help. We do not have a ton of data engineers in the WordPress community. We do have some folks, but they are not in the position to contribute their volunteer time towards this.

\n\n\n\n

So this needs investment in terms of developer hours, in terms of more tools, in terms of integrations. So in short, this is a huge endeavor. This needs investment from several organisations working in WordPress for this to really succeed, at least to the vision of what we have. That is the realisation that we had.

\n\n\n\n

But yes, the goal, if the project were to succeed, we should ideally need automated tools that automatically show data. Because if you were to publish this data manually, it’s a lot of work. I am not sure is the best returning because like, I worked with volunteers when I was working on the Contributor Mentorship Program, and I respect volunteer time.

\n\n\n\n

They have daily jobs, even sponsored contributors. They have a ton of things to do. Everybody’s overloaded. That time is very precious, and using the time and creating these dashboards, trust me, it’s extremely resource intensive. Like, between Courtney and myself and, Isotta and Naoko, we took a lot of time to prepare the dashboards that were out today. So we did that as an experiment to inspire folks so that we can get things done.

\n\n\n\n

But if you ask me, is it worth it to keep updating it? I’m not sure. Because I’m not sure if it’s worth the number of hours. Maybe we can do it. Maybe if there’s more folks to help out, it can be continued. But my hope would be to create an automated tool. I’m convinced that it is going to benefit folks.

\n\n\n\n

[00:26:49] Nathan Wrigley: Yeah, I mean, I guess that if you do everything manually and you draw the conclusions manually, you’ve got those one set of conclusions. And really what would be ideal is a portal, for want of a better word, where people can go and see and mine the data for themselves, and display it in interesting ways, and can consume it, and then decide how they’re going to display that and drill down in different ways. And obviously that requires automation.

\n\n\n\n

So, okay, we’re recording this kind of the gap between May and April in 2025. If you could, and I should probably say, you know, the listenership to this podcast is fairly wide. If you could ask for people to come and assist with this project, what kind of people at this moment in time are you looking for. You mentioned that you know, there’s not many people who are really interested, maybe in data manipulation and what have you, in the WordPress project. Just give us an idea of who you would wish to speak to you after they’ve listened to this podcast.

\n\n\n\n

[00:27:45] Hari Shanker: Anyone really. I’ll share why. The beauty of WordPress, and I think I’ve explored different open source projects and I think the beauty of WordPress is there’s something for anyone. So a big part of what we need to do is research. And in the sense of, what do people need to measure?

\n\n\n\n

So any feedback that folks can give on what they would like to see in a dashboard, that would be helpful. So if you are a listener to this podcast and you have ideas on what you would like to find out, that feedback itself is a big contribution. That will go a long way. That is a big part of the information that will help us.

\n\n\n\n

On the next level, I would like to have developers who are familiar with Python and data visualisation and things like that. We have explored different ways to do this. I’ve spoken with several Core committers and folks like Jb Audras who, I mean, Jb Audras does a ton of this amazing work. He publishes release information.

\n\n\n\n

So I was inspired by that. And the 6.6 dashboard that I published was very much built on his work. He does a lot of that work. So he’s just published something on WordPress 6.8 in his blog, and he regularly publishes the, a month in Core, year in Core posts in the Make Core blog, which has some of this information.

\n\n\n\n

So folks like that who have time to spare, who are really good with visualisations, that could be really helpful. And what Courtney and I, and Isotta and Naoko, what we had identified, what our group had identified was that we need a tool, we need an external tool. It’s very hard to build something from scratch.

\n\n\n\n

What would really help is to manipulate a tool. And there’s a bunch of open source tools. There’s GrimoireLab, which is, it’s an industry standard tool. It’s an open source software. It powers several open source projects. And there’s a company called Bitergia, which builds on  GrimoireLab, to, provide like a sponsored alternative, which is the one that we are using.

\n\n\n\n

We reached out to them to see if they can build something for us. They quoted a very high price. Currently Automattic is paying €1,000 per month. They quoted upwards of 30 to €40,000 to build this integration. That’s a huge amount of money and I don’t think we have the bandwidth to do it.

\n\n\n\n

So what we need is to bring, again, for folks listening, if you’re a developer, if you’re interested in data visualisation, I’d like to bring you all together to discuss what would be the best way forward.

\n\n\n\n

So first, once we have the KPIs clearly identified, let’s see how we can collect all this data and how we can display it. Maybe we can build something. We are in the era of vibe coding. So I think it’s a lot easier than when we started this project in 2023. It’s not impossible. Perhaps we can build something, build some very simple dashboard, identify some core KPIs. Maybe have two or three dashboards per team, which can be really filtered. Maybe that is possible. Maybe we don’t need a tool.

\n\n\n\n

So we need those developers, and folks with experience in data visualisation. Even like Core developers, like folks who have significant experience tinkering with Meta and Core and all that. So all these folks, if we are able to bring them together, I think we can do that. So I invite all of them to work on this.

\n\n\n\n

[00:30:29] Nathan Wrigley: Yeah. So if any of that is making sense to you, can I just ask you to go to WP Tavern. Search for the episode with Hari, H-A-R-I. That’s probably all you need to know. Search there in the Tavern search and hopefully this episode will pop up. And from there you’ll be able to link in the show notes to the piece that is described where you can find all of the links to the people contributing, but also Hari. Are you open to people contacting you directly and beginning conversations with you one-to-one?

\n\n\n\n

[00:30:57] Hari Shanker: Absolutely, absolutely. So at this time, as I shared on the beginning of the podcast, my time is slightly limited, but I’m more than happy to bring people together. That is my strength. And Courtney Robertson, she’s also very interested in this project. So like, between both of us, I think we can wrangle something and we can keep this moving.

\n\n\n\n

Because I firmly believe that WordPress needs this. And if folks are able to volunteer their time, I’m more than happy to bring people together and to keep this project moving. So please, feel free to ping me directly. I’m Hari Shanker in the Make WordPress Slack. That’s H-A-R-I-S-H-A-N-K-E-R. As you said, Nathan, folks can comment in the Tavern blog post as well. So any way you can find me, I will find you.

\n\n\n\n

[00:31:32] Nathan Wrigley: It feels to me like, you know when you go into a great big store or a shop, and I’m going to use supermarket as an example, where you’ve never been to that one before. You’re looking for a particular item. And you can literally spend so many minutes, hours even just searching around. You know, where’s the aisle? Okay, I found what I think is the right aisle. Now, in the aisle, which shelf am I looking for? And then, where is it?

\n\n\n\n

This feels like that. It feels like signposting to, here’s the thing you want. You’re standing at the door and I’ll just grab you by the hand and I’ll take you to the thing that you need to purchase right away. It feels like these dashboards are going to be something akin to that. Just a way of alerting people to the project as a whole, think the supermarket in this case, and how to just make that journey a little bit easier. Make it obvious to everybody what needs help? What doesn’t need help? What’s working? What isn’t working?

\n\n\n\n

How is it going to be manifested? This will be my last question really. What will this look like? Are we going to be looking at spreadsheets full of numbers? Are we going to be looking at charts? What is the intention? Because when I hear dashboard, I’m kind of immediately drawn to like line graphs and things like that. That’s what I’m imagining I’m going to end up seeing. But what would be the intention? Because some of this data would probably fit in that, but maybe some of it is just not going to be that. It’ll just be paragraphs of text, I don’t know.

\n\n\n\n

[00:32:47] Hari Shanker: I will share my vision for the dashboard, and it might be very different from what we end up building.

\n\n\n\n

I would like to build visualisations in the best possible way. So it involves charts, it involves charts of various kinds, pie charts, line charts. So the best form of information depicted in a very visual way, which gives folks a clear understanding of where the project is headed.

\n\n\n\n

In the current version, we’ve included some text because we wanted to sort of like share our findings. But I think as you shared earlier in this podcast, we want folks to find out the data for themselves. And Bitergia currently allows folks to download the data directly as a spreadsheet or in a CSV format. We’d like to give folks that option too. So if you’re not comfortable seeing, or understanding, the data that is in front of you, you can download it and you should be able to manifest it or manipulate it in the way that you want.

\n\n\n\n

So what I have in mind is a very visual dashboard full of charts. And the goal is to not over complicate things, which is why we are really looking at some certain KPIs for teams and for the project itself. For instance, if you look at the project, market share could be a KPI. It’s not necessarily what I, I’m just using it as an example.

\n\n\n\n

So identifying certain key metrics and building charts of various kinds which manifest this data, and to make it as user friendly, and as accessible, and accessibility in the strictest sense of the world. So that anybody with any size sort of accessibility requirement should be able to view this data and understand it. That is the vision that I personally have, and I think Courtney also has a very similar vision. So yeah, that’s what I have in mind.

\n\n\n\n

[00:34:18] Nathan Wrigley: It feels like in the year 2025, where we are at the moment, it feels as if, and we don’t need to go into the reasons. It does feel like contributor hours are more precious than they’ve ever been. And so that in and of itself is a fantastic reason to have data like this available.

\n\n\n\n

So for example, I don’t know, let’s imagine that I’m an enterprise agency and I want my contributions to really count. Well, I could throw my staff in all different directions and not really know whether they were being deployed in something which was already completely fine, or whether there was an area which really needed a bit of work. It might not be the most glamorous piece of work in the world, but it needs that work to be done.

\n\n\n\n

And because the contributor hours at the moment are, let’s use the word struggling, something like that, then having a window into what is needed, it does feel like this project has more importance now, perhaps even than just a year ago when you were sort of in the weeds of setting the whole thing up.

\n\n\n\n

[00:35:16] Hari Shanker: I cannot agree more, because I’ve tried to collect this data together, to put this together. And I’ve seen the information that it can help companies. So you mentioned organisations or companies who are contributing through Five for the Future. So I was working on Five for the Future for a long time, and I was mentoring quite a few organisations who are stepping into WordPress.

\n\n\n\n

So this data that I picked up, it really helped them. I was able to guide people into the areas that. We had folks who were doing other things, like they were able to contribute strategically, which I have specific cases of organisations who were able to improve their place in the WordPress economy by making strategy contributions.

\n\n\n\n

So this is all very linked. And again, that’s where I’m coming from. I mean, and as you said, contributor hours are very precious. I personally feel that any time or effort set towards building data oriented solution could go a long way. It is a very impactful way of contribution, and if folks are there to help it out, the potentials are limitless. That is where I’m coming from.

\n\n\n\n

[00:36:10] Nathan Wrigley: There are so many dots being connected in this episode. So we talked at the beginning about the fact that, you know, WordPress is a growing and interesting thing for the younger generation in India, but the project obviously needs contributors.

\n\n\n\n

Those contributors need to fit into the holes in the jigsaw, the bits of the jigsaw, where the pieces are missing, if you like.

\n\n\n\n

And so there’s this kind of virtuous cycle going on here where, if something like the dashboard can meaningfully impact where those contributors go, the jigsaw grows. The pieces where there’s blank missing pieces, they get filled in. And so, like I said, there’s this wonderful virtuous cycle nature to this whole thing. And what a fantastic project.

\n\n\n\n

It’s hard to encapsulate in words what you’re trying to do, but I think we did a pretty credible job of doing that. So one more time, Hari is going to be available to whichever way he described. I will put in the show notes the links to the pieces and Hari’s contact details and things like that.

\n\n\n\n

What an interesting project, one that many people I’m sure haven’t heard of. Is there anything that you wanted to say before we sign off?

\n\n\n\n

[00:37:11] Hari Shanker: Well, all I want to say is, if you’re interested in data, please consider looking into this project, or if there’s anything that you can learn from the data that we picked up. I know it’s a little old at this point. As I said, this is a project that anybody can contribute to. So even if you have insights on what data is missing or what data that you would like to see, that feedback really goes a long way.

\n\n\n\n

So feedback is the best gift that you can give in, again, in an open source project like WordPress, especially for an initiative like this. It goes a long way. So it’s a very impactful way of giving back to the project too. And I see contributions as investments, so if you would like to invest in WordPress in your free time, it’s a great way to do it by helping us build these dashboards.

\n\n\n\n

[00:37:51] Nathan Wrigley: Yeah, as you said, it’s like an impactful but kind of curious, interesting, powerful way of helping the community. And perhaps it’s something that you’d not heard of before. So Hari Shanker, thank you so much for explaining all that to me today and joining me on the podcast. I really appreciate it.

\n\n\n\n

[00:38:07] Hari Shanker: Thank you so much, Nathan. It was truly an honor to be here, and I absolutely enjoyed talking to you about my favorite topic.

\n
\n\n\n\n

On the podcast today we have Hari Shanker.

\n\n\n\n

Hari has been a member of the WordPress community since 2007, and has contributed in various capacities, including as a full-time contributor for several years, working with Automattic, working with initiatives like Five for the Future, and supporting numerous community events around the world. He currently volunteers his time as a community program manager, helping to grow and support the WordPress ecosystem from his home in India.

\n\n\n\n

If you’re involved in the WordPress project, you likely know just how vast and complex the contributor ecosystem can be. But you might not have heard of the WordPress Contribution Health Dashboards, an experimental initiative aimed at making sense of all the community’s moving parts, by gathering, visualising, and sharing contribution data.

\n\n\n\n

But why does WordPress need something like this? Well, it could help new and existing contributors figure out where to pitch in, and how their work might guide the project’s future growth? Hari’s here to explain.

\n\n\n\n

We start the podcast by going off on a tangent, discussing the landscape of WordPress in India. India is experiencing a huge upswell in community activity, innovation, and youth engagement, and it’s exciting to hear about it.

\n\n\n\n

We then dive into the main thrust of the podcast, the Contribution Health Dashboards, how the idea came about, who helped drive it forward, why it’s proving so challenging to build, and the massive value it promises for contributors, team reps, project leadership, and anyone curious about where WordPress needs help.

\n\n\n\n

We look at the practical aspects too. What tools are, and aren’t, available. The difficulty of tracking data across the many platforms WordPress uses, and what kinds of skills and volunteers are needed to push this work forward.

\n\n\n\n

Hari shares his vision for accessible, visual dashboards that can guide contributors of all skill sets, and help make the best use of every single contribution hour.

\n\n\n\n

If you’ve ever wondered how to make your WordPress contributions matter even more, or how the project could be better supported by data-driven insights, this episode is for you.

\n\n\n\n

Useful links

\n\n\n\n

Hari on WordPress.org

\n\n\n\n

Five for the Future

\n\n\n\n

 WordPress Contributor Working Group

\n\n\n\n

 WordPress Contributor Mentorship Program

\n\n\n\n

 InstaWP

\n\n\n\n

rtCamp

\n\n\n\n

Multidots

\n\n\n\n

 WordPress Photo Festival

\n\n\n\n

 WP Campus Connect

\n\n\n\n

 Astra theme

\n\n\n\n

 WordCamp Asia in Mumbai, India in 2026

\n\n\n\n

 WordPress Contribution Health Dashboards: An Experiment

\n\n\n\n

 Bitergia

\n\n\n\n

 Make WordPress Slack

\n\n\n\n

P2

\n\n\n\n

WordPress Trac

\n\n\n\n

GitHub

\n\n\n\n

 GrimoireLab

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 May 2025 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:17;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"WordPress.org blog: WordPress Campus Connect Expands\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18726\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://wordpress.org/news/2025/05/wordpress-campus-connect-expands/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6513:\"

WordPress Campus Connect, initially launched in October 2024 as a pilot program, has now been formally established as an official event series due to its resounding success. The inaugural program, spearheaded by myself, Anand Upadhyay, garnered immense enthusiasm from 400 Indian students who were eager to engage in hands-on WordPress training.

\n\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\"\"\n\n\n\n\n

WordPress Campus Connect transcends the conventional workshop model by fostering a holistic learning community. It couples on-campus event learning with a diverse range of post-event activities, including meetups, website challenges, scholarships, and volunteering opportunities, all geared towards nurturing student development. The program’s efficacy has prompted other organizations in India to express interest in replicating its structure.

\n\n\n\n

Looking ahead, multiple local WordPress communities in India aim to reach more students in India through WordPress Campus Connect events. The curriculum will include beginner content, delve into more advanced WordPress concepts, and feature specialized sessions tailored for students with prior WordPress experience. 

\n\n\n\n
\n\"\"\n
\n\n\n\n

The official recognition of WordPress Campus Connect as an event series paves the way for further expansion, giving the series similar support and standing as WordCamps but with a student education-first goal and focus. Future plans include organizing large-scale student events, establishing WordPress clubs on college campuses, and facilitating mentorship connections for students.

\n\n\n\n

To support these ambitious goals, volunteers identified several key next steps:

\n\n\n\n
    \n
  • Volunteer Handbook Development: Creating a comprehensive guidebook to equip volunteers with the necessary resources and information.
  • \n\n\n\n
  • GatherPress Integration: Exploring the feasibility of integrating GatherPress as a tool for student groups.
  • \n\n\n\n
  • Volunteer Recruitment: Actively seeking and onboarding volunteers to support WordPress Campus Connect initiatives through activities such as:\n
      \n
    1. Creating a workflow and guidelines for processing Student Club applications
    2. \n\n\n\n
    3. On-site facilitation or assistance for WordPress Campus Connect events
    4. \n
    \n
  • \n\n\n\n
  • Landing Page Creation: Creating a landing page describing what WordPress Campus Connect is all about
  • \n\n\n\n
  • Student Groups: Drafting a framework for students to create their own groups for hosting WordPress events and activities. 
  • \n
\n\n\n\n

The overwhelming success of WordPress Campus Connect and the enthusiasm it has generated serve as a testament to the transformative power of passion and dedication. As WordPress Campus Connect continues to evolve and expand, it holds the promise of shaping the future of WordPress education and community engagement.

\n\n\n\n

If you’re interested in helping shape the future of education with WordPress, join us in the #campusconnect Make Slack channel today!

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 May 2025 12:40:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Anand Upadhyay\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:18;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:102:\"Do The Woo Community: How the Friends Plugin Turns Your WordPress Site into a Decentralized Social Hub\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96754\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:106:\"https://dothewoo.io/blog/how-the-friends-plugin-turns-your-wordpress-site-into-a-decentralized-social-hub/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:165:\"The Friends plugin for WordPress lets you create your own private social feed, sharing posts with friends while keeping everything decentralized and in your control.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 May 2025 09:01:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:19;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"Do The Woo Community: Migrating CPT’s to Posts\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96735\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"https://dothewoo.io/blog/migrating-cpts-to-posts/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:82:\"Waiting on some work done before I move these daily posts to my new personal blog.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 May 2025 06:52:50 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:20;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:24:\"Matt: Remember Gravatar?\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=142243\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"https://ma.tt/2025/05/remember-gravatar/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1209:\"

Gravatar has always been about giving people control over their identity online. One avatar, one profile, synced across the web, verified connections, with a fully open API.

\n\n\n\n

Gravatar is a true open identity layer for the internet, and now for AI

\n\n\n\n

For developers, we’ve rolled out mobile SDKs and a revamped REST API that lets you fetch avatars and profile data with just an email hash. Whether you’re building a blog, a community, or an AI agent that needs to understand who it’s talking to, Gravatar provides the infrastructure to make identity seamless and user-centric. 

\n\n\n\n

It’s free, open, and built with developers in mind. We believe identity should belong to the individual, not be locked behind proprietary platforms. Gravatar is our contribution to that vision.​

\n\n\n\n

If you haven’t checked it out lately, now’s a great time to explore what Gravatar can do for your app or your online presence. And think about how your apps can drive more Gravatar signups.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 06 May 2025 16:27:46 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:21;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"Gravatar: Build Your AI Identity with Gravatar’s New Tool\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"http://blog.gravatar.com/?p=3202\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"https://blog.gravatar.com/2025/05/06/build-your-ai-identity-with-gravatars-new-tool/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6776:\"

Your Gravatar profile has always been your digital business card for the web.

\n\n\n\n

And now, it’s becoming your identity for AI.

\n\n\n\n

With our AI Profile Builder, you create a simple, portable version of you — your background, interests, preferences, and links — ready for AI tools to use. Build your profile once, and take it everywhere. From chatbots to content generators to recommendation engines, AI agents can finally understand who you are.

\n\n\n\n

For developers, scroll to the end to learn how to use this in your app or website, too!

\n\n\n\n

How it works

\n\n\n\n
\n
  • \"Screenshot
  • \"Screenshot
  • \"Screenshot
  • \"Screenshot
  • \"Screenshot
\n
\n\n\n\n

The AI Profile Builder takes what makes you you and translates it into a format that AI systems easily understand:

\n\n\n\n
    \n
  1. Fill out your Gravatar profile
    The more fields you complete, the smarter your AI experiences get.
  2. \n\n\n\n
  3. Set your preferences
    Choose how you like to communicate — tone, depth, and humor.
  4. \n\n\n\n
  5. Copy your AI-ready profile
    We hand you a tidy little markdown file. Portable and paste-ready.
  6. \n\n\n\n
  7. Paste into any AI tool
    Voilà. Personalized AI without all the constant tweaking.
  8. \n
\n\n\n\n

Build your AI profile now →

\n\n\n\n

Real-life use cases

\n\n\n\n

Here’s a video showing how Gravatar profiles can personalize AI responses when filling out PDFs and scheduling daily briefings.

\n\n\n\n
\n
\n
\n\n\n\n

This isn’t just convenience — it’s giving you control over your AI interactions.

\n\n\n\n

Here are a few more examples:

\n\n\n\n

Hobbies and Interests

\n\n\n\n
    \n
  • Generic response: “Here’s how to get started with photography.”
  • \n\n\n\n
  • Personalized response: “Given your interest in outdoor adventure and wildlife, I’d suggest focusing on landscape and nature photography, and here’s a specific guide tailored to that.”
  • \n
\n\n\n\n

Location-Based Recommendations

\n\n\n\n
    \n
  • Generic response: “Here’s how to prepare for severe weather.”
  • \n\n\n\n
  • Personalized response: “Considering you live in Florida, here’s a personalized checklist to prepare your home specifically for hurricanes.”
  • \n
\n\n\n\n

Communication Preferences

\n\n\n\n
    \n
  • Generic response: “Here’s what happened today in the stock market.”
  • \n\n\n\n
  • Personalized response: “Since you like it short and snappy with a side of sarcasm: the market took a tiny nap today — slightly down overall. Apple and Tesla dropped 1–2%, probably just tripping over their own hype again.”
  • \n
\n\n\n\n

For developers

\n\n\n\n

Want to personalize your product instantly?

\n\n\n\n

Just a few lines of code, and your app can adapt to each user’s communication style, bio, even verified socials.

\n\n\n\n
https://gravatar.com/{EmailHash}.md 
\n\n\n\n

You can grab Gravatar profiles via a simple markdown request, our REST API, or mobile SDKs — and yep, as part of the open web, they’re free to use.

\n\n\n\n

Own your AI identity today

\n\n\n\n

Unlike black-box AI systems that build hidden profiles about you, Gravatar’s approach is transparent and user-controlled.

\n\n\n\n

Ready to personalize your AI experiences?

\n\n\n\n

Head to your Gravatar dashboard and spin up your AI-ready profile.

\n\n\n\n

Devs — we’ve got integration docs and guides waiting for you.

\n\n\n\n

Happy AI-ing!

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 06 May 2025 14:34:01 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Ronnie Burt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:22;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:89:\"Do The Woo Community: All Things WordCamp Lisboa 2025 with Marco Almeida and Hacer Yilmaz\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=96691\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:87:\"https://dothewoo.io/all-things-wordcamp-lisboa-2025-with-marco-almeidaand-hacer-yilmaz/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:235:\"In this episode, BobWP chats with WordCamp Lisboa organizers Hacer and Marco about the upcoming event, highlighting the new Community and Contribution Day, diverse sessions, language inclusivity, and the importance of community spirit.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 06 May 2025 14:05:15 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:23;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"Do The Woo Community: AI Hallucinations\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96668\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/blog/ai-hallucinations/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"Hallucinations, it\'s all a matter of perspective.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 06 May 2025 09:12:40 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:24;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"Gravatar: How to Configure Gravatar Image Size Across Your Site\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"http://blog.gravatar.com/?p=3266\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"https://blog.gravatar.com/2025/05/05/gravatar-image-size/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:12788:\"

So, you’ve decided it’s time to improve the Gravatar images on your site. Maybe they’re too small, stretched oddly, or don’t match your stylish new design.

\n\n\n\n

Whatever the reason, pic size matters. It can shape the feel of your comment threads, how fast pages load, and how polished your entire site looks at first glance.

\n\n\n\n

Small tweak. Big impact.

\n\n\n\n

Luckily, you don’t need to be a developer, designer, or go rage-Googling CSS selectors to pull this off. You just need a smart approach, and that’s exactly what you’ll find here.

\n\n\n\n

In this guide, we’ll show you how to:

\n\n\n\n
    \n
  • Make site-wide Gravatar changes using WordPress’s built-in functions
  • \n\n\n\n
  • Use CSS to finesse specific sections (think: Comments, author bios, anywhere Gravatar images show up)
  • \n\n\n\n
  • Go responsive, so your Gravatar images look fabulous on every screen from the iPhone to large 4k monitors
  • \n
\n\n\n\n

Let’s get started.

\n\n\n\n\"\"\n\n\n\n

Default Gravatar sizes and why you might want to change them

\n\n\n\n

By default, Gravatar hands you an 80×80 pixel image. WordPress then ups that to 96×96, because… reasons. But here’s where it gets messy: Your theme probably has its own ideas. Some use 60px. Others? 80px.

\n\n\n\n

The result? Inconsistency. And that’s the enemy of good design.

\n\n\n\n

Here’s why resizing is worth your time:

\n\n\n\n
    \n
  • Visual hierarchy: Want admin replies to stand out? Bigger avatars can subtly guide the eye.
  • \n\n\n\n
  • Mobile friendliness: On smaller screens, smaller avatars = less chaos.
  • \n\n\n\n
  • Brand consistency: Everything should look intentional, including your floating faces.
  • \n\n\n\n
  • Engagement: Well-sized avatars make people feel seen (literally), boosting community engagement.
  • \n
\n\n\n\n

And let’s not forget performance. Larger images = heavier pages = slower load times. Too small? You risk pixelation when scaled up via CSS. Lose-lose.

\n\n\n\n

Luckily, many modern themes (looking at you, Twenty Twenty-Five) let you adjust avatar sizes right from the design panel – no code required. Just head to the “Comments” section and tweak away.

\n\n\n\n

But what if your theme lacks this functionality? Or if you want finer control?

\n\n\n\n

That’s when custom solutions come into play via WordPress functions, a dash of CSS, or the occasional PHP snippet. Don’t worry, we’ll walk you through it.

\n\n\n\n

Let’s get into the how.

\n\n\n\n

Method 1: Changing Gravatar size using WordPress functions

\n\n\n\n

If you want full control over how big (or small) your Gravatars show up – without relying on your theme’s whims – WordPress has your back.

\n\n\n\n

Under the hood, WordPress talks to Gravatar’s servers using a handy little parameter: s= or size=. That’s how it tells Gravatar exactly what size image to serve up, rather than grabbing one and awkwardly stretching or shrinking it in the browser.

\n\n\n\n

If you want to make a site-wide change, add this simple snippet to your child theme’s functions.php file:

\n\n\n\n
function custom_avatar_size( $avatar_defaults ) {\n\nreturn 120; // Change to your desired size in pixels\n\n}\n\nadd_filter( \'avatar_defaults\', \'custom_avatar_size\' );
\n\n\n\n

Voilà, just like that, every Gravatar across your site obeys your chosen size like a well-trained pixel soldier.

\n\n\n\n

Want to go a step further? You can tell WordPress to serve up different sizes depending on where the avatar appears. Here’s how:

\n\n\n\n
function context_based_avatar_size( $args ) {\nif ( is_single() ) {\n$args[\'size\'] = 150; // Larger on single posts\n} elseif ( is_archive() ) {\n$args[\'size\'] = 80; // Smaller on archive pages\n}\nreturn $args;\n}\nadd_filter( \'pre_get_avatar_data\', \'context_based_avatar_size\' );
\n\n\n\n

Why this approach rocks:

\n\n\n\n
    \n
  • One change = site-wide consistency
  • \n\n\n\n
  • WordPress handles all the caching and optimization behind the scenes
  • \n\n\n\n
  • You can tailor avatar sizes by context (posts, archives, comments, you name it)
  • \n\n\n\n
  • It taps directly into Gravatar’s API, so you’re getting the cleanest possible image at the right size
  • \n
\n\n\n\n

Bonus round: Smart Gravatar sizing in the comments section

\n\n\n\n

Want to get really clever? Try creating a visual hierarchy in your comments section. For example: Larger avatars for parent comments, slightly smaller ones for replies. It helps users follow the conversational flow without even thinking about it.

\n\n\n\n

Here’s a quick function that adjusts avatar size based on comment depth:

\n\n\n\n
function comment_depth_avatar_size( $args, $id_or_email ) {\n\n$comment = get_comment( $id_or_email );\n\nif ( $comment ) {\n\n$depth = 1; // Default depth\n\nif ( isset( $comment->comment_parent ) && $comment->comment_parent > 0 ) {\n\n$depth = 2; // Reply\n\n}\n\n// Set size based on comment depth\n\n$args[\'size\'] = 140 - (($depth - 1) * 20); // Parent: 140px, Reply: 120px\n\n}\n\nreturn $args;\n\n}\n\nadd_filter( \'pre_get_avatar_data\', \'comment_depth_avatar_size\', 10, 2 );
\n\n\n\n

Suddenly, your comments section feels less like a block of text and more like a layered conversation.

\n\n\n\n

Pro Tip: Nudge users to create their own Gravatar

\n\n\n\n

Lots of users will unintentionally default to the “Mystery Man” look if they haven’t gotten around to customizing their Gravatar profile. Want to fix that? Add a friendly prompt under your comment form:

\n\n\n\n
function gravatar_comment_form_note( $defaults ) {\n\n$defaults[\'comment_notes_after\'] .= \'\n\nNeed a profile picture? Create a free Gravatar.\n\n\';\n\nreturn $defaults;\n\n}\n\nadd_filter( \'comment_form_defaults\', \'gravatar_comment_form_note\' );
\n\n\n\n

Now you’re not just upgrading your design, you’re also helping your community show up in style.

\n\n\n\n

And if you’re feeling adventurous, there’s room to dream even bigger. Think: Larger avatars for top commenters, custom styles for admins or team members, maybe even a “featured contributor” badge with its own Gravatar flair. Totally doable.

\n\n\n\n

Just one golden rule: Always add your code to a child theme. Editing the parent theme directly is a one-way ticket to heartbreak when updates roll through. Protect your tweaks, keep them safe, and your beautifully resized avatars will live to see another theme update.

\n\n\n\n

Method 2: Styling Gravatar images with CSS (aka the quick-and-clean route)

\n\n\n\n

So maybe PHP isn’t your thing. Or maybe you just want a faster win – less code, more impact. Enter CSS: The styling powerhouse that lets you tweak how Gravatars look without changing how they’re fetched from the server.

\n\n\n\n

Now, fair warning: This won’t change the file size of the image being downloaded (Gravatar’s still sending the default size), but it will control how those avatars show up on screen. Think of it like wardrobe tailoring for profile pics – same body, better fit.

\n\n\n\n

Here’s how to get started:

\n\n\n\n
    \n
  1. Head to your WordPress dashboard
  2. \n\n\n\n
  3. Go to Appearance > Customize
  4. \n\n\n\n
  5. Click on “Additional CSS”
  6. \n\n\n\n
  7. Drop in your magic below
  8. \n
\n\n\n\n

Want to resize comment Gravatars? Easy:

\n\n\n\n

.comment-avatar img { width: 60px; height: 60px; }

\n\n\n\n

Want to ditch the boxy default look and go full circle-chic? Say no more:

\n\n\n\n

.avatar { border-radius: 50%; border: 2px solid #ddd; }

\n\n\n\n

Designing for mobile, too (as you should be)? Add some media query magic:

\n\n\n\n

@media (max-width: 768px) { .avatar { width: 40px; height: 40px; } }

\n\n\n\n

And just like that, your Gravatar images adapt to screen sizes like design-savvy little shapeshifters.

\n\n\n\n

Ready to get extra? Let’s talk hover effects

\n\n\n\n

Once you’ve nailed the sizing basics, there’s a whole world of style upgrades waiting. You could create a hover effect that reveals a mini bio – or even a clickable “Gravatar card” with links, job titles, or a cheeky quote from their profile.

\n\n\n\n

With the right mix of CSS and PHP, you can turn every Gravatar image into a micro-interaction that deepens community engagement without sending users off-site.

\n\n\n\n

Imagine: Someone hovers over a commenter’s face, and a sleek little popup shows their Gravatar bio, links, or even their other recent comments. Trust, familiarity, and engagement, all from a 60×60 pixel image.

\n\n\n\n

Bottom line: CSS is your best friend when you want fast, flexible avatar control – no server changes, no code anxiety. Just pure visual finesse.

\n\n\n\n

Go beyond size: Turn Gravatars into engagement powerhouses

\n\n\n\n

So, you’ve nailed the sizing. Your avatars are looking slick, snappy, and totally on-brand. But, plot twist: Gravatar isn’t just a pixel-perfect profile pic tool – it’s a full-blown identity engine. And you’re only scratching the surface.

\n\n\n\n

Gravatar profiles come loaded with gold: Bios, websites, social links, even job titles. All that data lives on Gravatar.com, just waiting to be pulled into your site.

\n\n\n\n

What can you do with it? Oh, just a few small things like…

\n\n\n\n
    \n
  • Auto-populate author bios with real backgrounds, no manual copy-pasting required
  • \n\n\n\n
  • Create hover cards that spill the tea (professionally, of course) when you hover over a commenter’s face
  • \n\n\n\n
  • Build a community directory that looks like LinkedIn, but without the corporate cringe
  • \n\n\n\n
  • Add verification badges to reward users with full, legitimate profiles
  • \n
\n\n\n\n

The result? A more cohesive, more connected site experience, with less work for your users and more trust baked in.

\n\n\n\n

Gravatar’s “update once, sync everywhere” model means no more tedious form-filling. Users update their info once, and it syncs across every site they interact with, including yours.

\n\n\n\n

And if you’re running a site where you want users to change their avatar without leaving, Gravatar Quick Editor adds a sleek popup editor right on your site. Very user-friendly.

\n\n\n\n

Unlock the power of Gravatar

\n\n\n\n

Now you’ve got resizing down, it’s time to have some fun. Use the code examples from this guide as your launchpad. Build confidence with each tweak. Try new things. Break stuff (safely). Learn. Repeat.

\n\n\n\n

And when you’re ready to go full power-user? Gravatar’s developer docs are your secret weapon. They’re packed with everything from API tricks to integration ideas that’ll help you turn avatars into fully-fledged community features – everything you need to explore the full power of Gravatar and supercharge your site

\n\n\n\n

Gravatar isn’t just an image. It’s identity, personality, and participation, all rolled into one little square (or circle, thanks to your shiny new CSS).

\n\n\n\n

Let’s turn those pixels into something powerful.

\n\n\n\n\"\"\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 05 May 2025 16:01:21 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Ronnie Burt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:25;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:60:\"Gravatar: 5 Ways Top Consultants Build Their Personal Brands\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"http://blog.gravatar.com/?p=3160\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://blog.gravatar.com/2025/05/05/personal-branding-for-consultants/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:18635:\"

Consultants today face an intense competitive squeeze. On one side, established consulting giants with massive resources and brand recognition. On the other, a flood of independent specialists is expected as the consulting industry expands rapidly, now approaching $1 trillion in value with over 838,000 management consultants in the US alone.

\n\n\n\n

Yet, amid this competition, certain consultants consistently attract premium clients and command fees significantly above the industry average of $212,000 per consultant. Their secret? Strategic personal branding that showcases specialized expertise rather than mere availability.

\n\n\n\n

These successful consultants understand that clients aren’t simply looking for someone who can help – they’re searching for the definitive authority who can solve their specific problems.

\n\n\n\n

In this article, we’ll show proven methods that top consultants use to build authority and attract enterprise clients, helping you establish verified professional credibility across platforms.

\n\n\n\n

5 ways top consultants command premium fees through personal branding

\n\n\n\n

Successful consultants understand that it’s not enough to just offer services; true success lies in creating a strategic personal brand that fosters trust and commands premium fees. In a consulting marketplace approaching $1 trillion in value, the difference between average and exceptional often comes down to brand positioning.

\n\n\n\n

The most effective consultant brands aren’t created by accident. They’re built through deliberate strategies working in concert:

\n\n\n\n
    \n
  1. Creating a verified consulting presence across multiple platforms.
  2. \n\n\n\n
  3. Strategically collecting and showcasing client testimonials.
  4. \n\n\n\n
  5. Developing authority-building professional partnerships.
  6. \n\n\n\n
  7. Using content marketing to demonstrate specialized expertise.
  8. \n\n\n\n
  9. Measuring and optimizing branding efforts based on revenue impact.
  10. \n
\n\n\n\n

Each of these approaches contributes to a cohesive brand that positions you as the go-to authority in your field. Let’s explore how successful consultants implement these strategies to attract high-value clients and command rates well above the industry average.

\n\n\n\n

1. Build authority with a verified consulting presence

\n\n\n\n

Top consultants leverage a multi-channel strategy to establish credibility and demonstrate expertise. This approach extends their reach while creating multiple touchpoints for potential clients to discover and validate their authority.

\n\n\n\n

The most effective consultant brands maintain a consistent presence across various platforms:

\n\n\n\n
    \n
  • Professional website: Your digital home base showcasing your services, expertise, and client results
  • \n\n\n\n
  • LinkedIn: Publishing thought leadership articles that demonstrate specialized knowledge
  • \n\n\n\n
  • Industry publications: Contributing expert insights to respected publications
  • \n\n\n\n
  • Speaking engagements: Presenting at conferences to build visibility and credibility
  • \n
\n\n\n\n

What sets exceptional consultants apart is their ability to maintain a consistent voice and messaging across all channels. When potential clients encounter your content on LinkedIn, then visit your website, they should experience the same professional tone and expertise.

\n\n\n\n

Another great tactic is to expand their influence through alternative content formats on the various platforms: 

\n\n\n\n
Content type BenefitsExample Platform
WebinarsDemonstrates expertise in real-time while capturing qualified leads“Three Proven Financial Models for SaaS Startups” – live workshop with Q&AZoom, WebinarPress (for WordPress sites), GoToWebinar
Video contentShowcases problem-solving skills visually; reaches an audience that prefers watching to reading“How to Implement Zero-Trust Architecture” – step-by-step tutorial repurposed from conference talkYouTube, LinkedIn Video, Vimeo
White papers Positions you as a thought leader; provides depth that articles can’t match“Navigating Supply Chain Disruptions: A Framework for Manufacturing Resilience” – research reportYour personal website, SlideShare, ResearchGate
Newsletters Creates regular touchpoints with prospects; builds an owned audience asset“Weekly M&A Insights” – curated analysis of industry deals with your expert commentaryWordPress.com, Substack, Mailchimp, Beehiiv
Comments and opinions Demonstrates real-time relevance and thought leadership without requiring extensive content creationExpert analysis on breaking industry news or trending topicsLinkedIn, Medium, Industry forums
Community platforms Creates high-value relationships with potential clients; positions you as the center of a knowledge networkExclusive mastermind groups or premium Q&A access to your expertiseDiscord, Circle, Slack, Mighty Networks
Technical platforms Essential for technical consultants to demonstrate practical implementation skillsCode repositories with documentation and examples solving specific problemsGitHub, Stack Overflow, CodePen
Subscription contentCreates recurring revenue while pre-qualifying serious prospectsMonthly industry analysis or toolkit access for paying subscribersPatreon, Podia, Gumroad
\n\n\n\n

2. Create a professional Gravatar profile

\n\n\n\n\"Gravatar\n\n\n\n

As already mentioned, a consistent online presence is one of the main components for consulting success, but it doesn’t come without its difficulties. For once, managing your professional image across dozens of platforms can be time-consuming. Thankfully, this is where Gravatar becomes invaluable for consultants looking to maintain brand consistency.

\n\n\n\n

Gravatar (Globally Recognized Avatar) functions as a centralized profile management system that follows you across the internet. Instead of creating separate profiles for each website you visit, Gravatar allows you to establish one professional identity that appears automatically on supported platforms.

\n\n\n\n

For consultants, Gravatar offers several key advantages:

\n\n\n\n
    \n
  • Centralized bio management: Create a compelling consultant profile highlighting your specialties, expertise, and professional background – update it once, and changes reflect everywhere
  • \n\n\n\n
  • Verified professional connections: Link to your verified social profiles, portfolio, and professional certifications in one accessible location
  • \n\n\n\n
  • Consistent visual identity: Your professional headshot automatically appears when you comment on blogs, contribute to forums, or interact on platforms like GitHub and Stack Overflow
  • \n\n\n\n
  • Time efficiency: No more maintaining separate profiles across dozens of websites – establish your brand once and focus on client work
  • \n
\n\n\n\n

Gravatar is integrated with major platforms, including WordPress, Slack, and GitHub. When potential clients encounter you across these platforms, they’ll see a consistent, professional image that reinforces your expertise.

\n\n\n\n

Setting up your Gravatar takes just minutes but establishes your consulting presence across thousands of websites instantly. Visit Gravatar.com today to claim your professional digital identity.

\n\n\n\n\"\"\n\n\n\n

3. Showcase client success and testimonials

\n\n\n\n

Social proof is perhaps your most powerful consulting asset. Research shows that 72% of potential clients place significantly more trust in a service after reading positive testimonials – making client success stories essential for consultants looking to command premium rates.

\n\n\n\n

The most effective social proof for consultants takes two forms:

\n\n\n\n
    \n
  • Case studies: Detailed narratives that showcase the problem-solving process and measurable results.
  • \n\n\n\n
  • Client testimonials: Direct endorsements that build credibility and trust.
  • \n
\n\n\n\n

Unlike generic “they were great to work with” testimonials, effective consulting social proof must demonstrate concrete business impact and ROI. Quantify your value with specific metrics: revenue increases, cost reductions, efficiency gains, or other tangible outcomes.

\n\n\n\n

These success stories can appear as LinkedIn posts for wider visibility or as dedicated pages on your website for in-depth exploration. For consultants with broad specialties, consider creating industry-specific testimonial portfolios that target different client segments, allowing you to speak directly to distinct audience needs.

\n\n\n\n

\"💡\"Develop a systematic approach to collecting case study material during projects. Document key challenges, strategies, and outcomes as they happen rather than scrambling to reconstruct them later.

\n\n\n\n

Remember that confidentiality is paramount in consulting relationships. Always obtain express written permission before using any client information in marketing materials – even anonymous case studies require careful review to prevent identification of sensitive details.

\n\n\n\n

4. Strengthen your authority through strategic partnerships

\n\n\n\n

Strategic partnerships offer consultants a powerful way to multiply their authority and extend their reach. By forming alliances with complementary experts, you can create value propositions that neither partner could deliver alone.

\n\n\n\n

For example, a management consultant specializing in digital transformation might partner with a data privacy expert to offer comprehensive tech modernization services. This partnership creates multiple advantages:

\n\n\n\n
    \n
  • Enhanced expertise: Combined knowledge fills gaps that clients might otherwise need to source separately
  • \n\n\n\n
  • Premium positioning: The unique combination justifies higher fees than either consultant could command individually
  • \n\n\n\n
  • Authority-building opportunities: Co-created research, whitepapers, and industry analyses demonstrate thought leadership while sharing production costs
  • \n\n\n\n
  • Expanded audience: Each partner gains access to the other’s client network and followers
  • \n
\n\n\n\n

These partnerships work best when each consultant maintains their distinct brand identity while clearly communicating the collaborative relationship. Use your Gravatar profile to maintain a consistent professional presence across platforms, cross-linking to verified profiles of your strategic partners and collaborative work.

\n\n\n\n

The most successful consulting partnerships start with clear agreements about lead sharing, revenue distribution, and service delivery responsibilities. Begin with small collaborative projects to test compatibility before committing to major initiatives or formal business structures.

\n\n\n\n

5. Measure and optimize your consulting brand’s ROI

\n\n\n\n

Building a personal brand without measuring its impact is like navigating without a compass – you might be moving, but you won’t know if you’re heading in the right direction. Savvy consultants treat their personal branding as an investment that should generate measurable returns.

\n\n\n\n

The most immediate indicator of effective personal branding is typically an increased rate of inquiries. When your brand resonates with your target audience, you’ll notice more potential clients reaching out through both word-of-mouth referrals and inbound marketing channels. However, this surface-level metric only tells part of the story.

\n\n\n\n

To truly understand your branding ROI, track these critical metrics:

\n\n\n\n
    \n
  • Client acquisition cost (CAC): Calculate how much you spend on marketing, networking, and content creation to acquire each new client. As your brand strengthens, this cost should decrease.
  • \n\n\n\n
  • Lifetime client value (LCV): Measure the total revenue generated from an average client relationship, including repeat engagements and referrals. Strong personal branding attracts clients who stay longer and spend more.
  • \n\n\n\n
  • Project value trends: Monitor how the average value of new projects changes over time. Rising project values indicate that your brand is attracting higher-quality opportunities.
  • \n\n\n\n
  • Time-to-close: Track how quickly leads convert into paying clients. A strong personal brand builds trust faster, shortening the sales cycle significantly.
  • \n
\n\n\n\n

Set up systematic tracking through your website analytics, CRM system, and contact forms. Create a simple dashboard that connects these metrics to specific branding initiatives, allowing you to identify which elements of your brand strategy deliver the strongest ROI.

\n\n\n\n

Review these metrics quarterly, looking for patterns that emerge alongside your branding activities. Did that series of LinkedIn articles correlate with higher-value inquiries? Did your speaking engagement at an industry conference shorten your sales cycle?

\n\n\n\n

Use these insights to refine your approach – double down on high-performing channels and pivot away from efforts that aren’t delivering results. The most successful consultants continuously adjust their branding strategy based on data, not assumptions, creating a virtuous cycle of improvement that steadily enhances their market position and fee structure.

\n\n\n\n

Start winning better clients: Develop your brand action Plan

\n\n\n\n

The difference between struggling consultants and those commanding premium fees isn’t luck – it’s strategic personal branding. Now it’s time to transform these insights into a focused action plan that elevates your consulting practice.

\n\n\n\n

Start by implementing each of the five pillars we’ve covered:

\n\n\n\n
    \n
  1. Build your verified presence across multiple platforms where your ideal clients spend time
  2. \n\n\n\n
  3. Create a professional Gravatar profile that follows you across the internet with consistent branding
  4. \n\n\n\n
  5. Document client successes with measurable results and compelling testimonials
  6. \n\n\n\n
  7. Form strategic partnerships with complementary experts to expand your reach and capabilities
  8. \n\n\n\n
  9. Measure your brand’s ROI using clear metrics that track business impact
  10. \n
\n\n\n\n

The consulting landscape rewards those who demonstrate authority through high-value content distributed across carefully selected channels. Your insights should solve real problems, showcase your expertise, and position you as the obvious choice for complex challenges.

\n\n\n\n

Begin today by creating your free profile at Gravatar.com!

\n\n\n\n\"\"\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 05 May 2025 15:57:45 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Ronnie Burt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:26;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:102:\"Do The Woo Community: Unlocking Creative Content Management in WordPress with Derek Hanson & BobWP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=94962\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:95:\"https://dothewoo.io/unlocking-creative-content-management-in-wordpress-with-derek-hanson-bobwp/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:203:\"In this episode of Content Sparks, Derek Hanson discusses WordPress content management with BobWP, highlighting its flexibility and creativity for blogs, presentations, and multimodal content strategies.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 05 May 2025 09:56:58 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:27;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"Do The Woo Community: BobWP, Bob Will Pivot\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96611\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"https://dothewoo.io/blog/bobwp-bob-will-pivot/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"I have pivoted a lot over the years. Impactful and subtle. This one is somewhere in-between.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 05 May 2025 07:57:12 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:28;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:51:\"Do The Woo Community: Leading Up to the Finish Line\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96551\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"https://dothewoo.io/blog/leading-up-to-the-finish-line/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:87:\"Cheering on your friends and colleagues for finishing. But things happen along the way.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 04 May 2025 10:35:17 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:29;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:112:\"Gutenberg Times: Four Block Plugins, three events, two live streams, one course and more — Weekend Edition 328\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=40148\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:116:\"https://gutenbergtimes.com/four-block-plugins-three-events-two-live-streams-one-course-and-more-weekend-edition-328/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:19886:\"

Howdy,

\n\n\n\n

Now is the time to skill up your block editor and theme knowledge and craft. The more quiet release cycle of WordPress gives everyone some breathing room. You can explore more opportunities, like attending the Page Builder Summit. You could invest in a course. You could join in free webinars. You could listen to successful experts in the field to learn how they approach their business.

\n\n\n\n

What are your questions about core blocks, block themes etc.? You can ask via email, in the comments or join our new Discord space.

\n\n\n\n

Below, again a great mixture of plugins, live streams, upcoming events and tutorials. I hope you also have a great weekend!

\n\n\n\n

Yours, \"💕\"
Birgit

\n\n\n\n\n\n\n\n

Developing Gutenberg and WordPress

\n\n\n\n

On April 30, WordPress 6.8.1 Maintenance Release came out. Aaron Jorbin wrote in the release post that this minor release includes fixes for 15 bugs. These fixes span throughout Core and the Block Editor. They tackle issues affecting multiple areas of WordPress including the block editor, multi-site, and REST API. The top three fixes are:

\n\n\n\n
    \n
  • A fix addresses the regression Meta boxes area showing unwanted resize handle. It also addresses the issue that breaks auto-scroll. This was discovered right after the release of 6.8.
  • \n\n\n\n
  • The Edit Site link is restored to its earlier link behavior. It links to the respective template displayed on the front end. (#63358).
  • \n\n\n\n
  • The REST API’s handling of sticky posts has also been fixed. (#63307, #63339
  • \n
\n\n\n\n

For a full list of bug fixes, please refer to the release candidate announcement.

\n\n\n\n
\n

\"🎙\" The latest episode Gutenberg Changelog 117 – WooCommerce Starter Theme and Blocks, WordCamp Europe, and Gutenberg 20.7 and 20.8 I sat down with Ellen Bauer, WooCommerce product lead and discussed what she is working on, WordCamp Europe, Create Block Theme, WP-CLI, Gutenberg 20.7 and Gutenberg 20.8 releases.

\n\n\n\n\"Ellen\n
\n\n\n\n

Plugins, Themes, and Tools for #nocode site builders and owners

\n\n\n\n

In his post, Building a Custom Image Gallery with the Image Gallery Block, Kyle Van Deusen provides guidance. He explains how to create a custom image gallery in WordPress. He uses the “Image Gallery Block” plugin by WP Developer. This plugin offers more features than the default WordPress Gallery block.

\n\n\n\n

Van Deusen covers installing the plugin, adding a gallery, and selecting images. The plugin provides flexible styling like grid or masonry layouts, caption options, image sizing, responsive settings, and a lightbox. Extra adjustments include borders, rounded corners, and caption colors. The post emphasizes the plugin’s user-friendliness and concludes with a preview of its interactive features.

\n\n\n\n
\n\n\n\n

Wes Theron has some awesome tips to Speed Up Your Workflow in WordPress. He’s sharing his favorite hidden gems of the Block Editor. You’ll get to know the Command Palette, different editing modes, List view, scheduling posts, and so much more. It’s a super quick video, and you’ll pick it all up in under six minutes. You probably already know most of it. You’re a long-time subscriber. You got the scoop when these features first dropped in the Block Editor. But still, this video shows you how those features have evolved and how they all work together for creating content.

\n\n\n
\n
\n\n
\n
\n\n\n
\n\n\n\n

In the latest episode of Greyd Conversations #6 – Building upon WordPress, Mike McAlister, co-founder of Ollie, joined Jessica Lyschik. They discussed the advantages of their shared approach to developing products using WordPress’s Block & Site Editor. They also looked into the future direction of WordPress. They discussed features that product companies like Greyd and Ollie hope to see in the core.

\n\n\n
\n
\n\n
\n
\n\n\n
\n\n\n\n

Al Amin Ahamed‘s new plugin, Author Profile Blocks, in now available in the WordPress Plugin Repository. With this plugin you can show user profiles in different styles using Gutenberg blocks. You can use it to highlight team members. It can also highlight contributors, authors, or any WordPress users you want to feature on your site.

\n\n\n\n

“Unlike other plugins, Author Profile Blocks leverages your existing WordPress users rather than creating a separate custom post type. This means you can showcase all your site contributors without duplicating content.” Ahamed wrote in his description.

\n\n\n\n
\n\n\n\n

Selim Rana and his team at BdThemes released the Advanced Heading for the Gutenberg Block Editor plugin. It provides various options to style headings like text highlighting, gradient, image masking, drop shadows, and background effects.

\n\n\n\n
\n\n\n\n

Bhargav (Bunty) Bhandari released a new plugin again: Thread Block with which you can publish Twitter-like Thread posts. It can also be used to do some live blogging of an event or a breaking news story. “Perfect for storytelling, debates, or breaking down ideas step by step” Bhandari wrote.

\n\n\n\n\"\"\n\n\n\n

Upcoming events

\n\n\n\n

On May 8, 2025, at 12:00 UTC, Anne-Mieke Bovelett will hold a free webinar for site builders and agencies. Discover how much power the WordPress Block Editor and Site Editor give you! She will walk you through what the WordPress Block Editor and Site Editor can do today. No custom code, no third-party builder, no bloated plugin stack. Just native WordPress, used to its full potential.

Bovelett will cover:

\n\n\n\n
    \n
  • What the Block Editor and Site Editor actually are
  • \n\n\n\n
  • How to build layouts and templates without code
  • \n\n\n\n
  • How reusable patterns can simplify your workflow
  • \n\n\n\n
  • Building post grids (query loops) and juggling dynamic data
  • \n
\n\n\n\n

Free registration is now open.

\n\n\n\n
\n\n\n\n

The Page Builder summit 2025 will take place from 12th to 16th of May 2025. Hosts Anchen le Roux and Nathan Wrigley published the schedule. It is packed with fabulous speakers. The topics are perfect for site builders to enhance their business acumen. They will also expand their technical knowledge.

\n\n\n\n

Here is my watch list:

\n\n\n\n
    \n
  • Alicia St. Rose: Loop, There It Is! The Magic of the Query Loop Block
  • \n\n\n\n
  • Tony Cosentino: Supercharge Your WordPress Workflow: 10 AI Tools to Build Better Websites Faster
  • \n\n\n\n
  • PK Son: Supercharge Your Builds with ACF Flexible/Repeater Fields
  • \n\n\n\n
  • Luke Carbis: The Hidden Costs of Page Builders: Avoiding Technical Debt in No-Code Projects
  • \n\n\n\n
  • Tammie Lister: Design Once, Build Everywhere: The Lego Principle for Page Builders
  • \n\n\n\n
  • Benjamin Intal: Reimagine UX in the Block Editor with WP Interactions
  • \n
\n\n\n\n

The event is totally free, and the recordings will stay free for 48 hours after the last day. I will be traveling during the week. I am glad to pay for an extension of that watch time. $47 is quite affordable to get unlimited access to the recordings.

\n\n\n\n\"\"\n\n\n\n
\n\n\n\n

WordSesh returns May 13–15, 2025. It is a virtual conference for WordPress professionals. Its host, Brian Richards, is a seasoned virtual conference producer and WordPress educator. His speaker and session curation is top-notch. Sign up to get updates on the next event.

\n\n\n\n

Theme Development for Full Site Editing and Blocks

\n\n\n\n

In his latest live stream, Ryan Welcher shared his process in real time. He refined features and experimented with block-based design. He also answered viewers’ questions as we went along. The recording is now online on YouTube: WordPress Block Theming: Chat, Connect, and Chill!

\n\n\n
\n
\n\n
\n
\n\n\n
\n\n\n\n

 “Keeping up with Gutenberg – Index 2025” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test, and Meta team from Jan. 2024 on. Updated by yours truly. The previous years are also available: 2020 | 2021 | 2022 | 2023 | 2024

\n\n\n\n

Building Blocks and Tools for the Block editor

\n\n\n\n

I answered a listener question from the Gutenberg changelog. I published a short post on How to overwrite or remove core block styles. In a short video, you learn how to overwrite the styles through the Editor > Styles section. Another way is via the theme’s theme.json file. If you want to remove core block styles entirely, you’ll find a code snippet to put into your functions.php or plugin files.

\n\n\n\n
\n\n\n\n

Milica Aleksandric announces a new WordPress Development Course for the Modern Era on WPShout. The course, Modern WordPress Fast Track, is a “10-week program.” It is designed to take you from beginner to pro with the latest WordPress tech. Think block themes, Full Site Editing, AI tools, and modern workflows. It’s taught by Kaspars Dambis, a WordPress core contributor with tons of real-world experience. The course community on Discord connects you to other students. It starts on June 1, 2025. Until then, you can take advantage of the 40% discount for early birds.

\n\n\n\n
\n\n\n\n

In his latest recording of his twitch stream, AI Code Reviews | Jon learns to code, Jonathan Bossenger explored two AI code review tools. These tools hook right into your Git pull request workflow. He compared them to see how they work.

\n\n\n
\n
\n\n
\n
\n\n\n

Need a plugin .zip from Gutenberg’s master branch?
Gutenberg Times provides daily build for testing and review.

\n\n\n\n

Now also available via WordPress Playground. There is no need for a test site locally or on a server. Have you been using it? Email me with your experience

\n\n\n\n

\"GitHub

\n\n\n\n

Questions? Suggestions? Ideas?
Don’t hesitate to send them via email or
send me a message on WordPress Slack or Twitter @bph.

\n\n\n\n
\n\n\n\n

For questions to be answered on the Gutenberg Changelog,
send them to changelog@gutenbergtimes.com

\n\n\n\n
\n\n\n\n

Featured Image: Photo by chuttersnap on Unsplash

\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n

We hate spam, too, and won’t give your email address to anyone
except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 03 May 2025 12:20:02 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:30;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:38:\"Do The Woo Community: Enshittification\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96518\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"https://dothewoo.io/blog/enshittification/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:44:\"The progressive decline of digital platforms\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 03 May 2025 10:57:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:31;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"Matt: Berkshire Hathaway Meeting\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=141784\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://ma.tt/2025/05/berkshire/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2885:\"

I’ve checked off a bucket list item: I’m attending a Berkshire Hathaway shareholder meeting. It’s really an event! Thousands flock to Omaha, Nebraska, for the legendary Q&A sessions with Warren Buffett and shareholder deals. They’ve made it quite the circus, with every Berkshire Hathaway company having a booth of some sort, and typically selling their goods at a discount or with exclusive items you can only buy there, like Warren Buffett and Charlie Munger Squishmallows (which of course I got, to complement my bronze busts).

\n\n\n\n

It’s strange to have a Dairy Queen booth selling $1 ice cream (cash only!) next to NetJets, but those juxtapositions are part of the Berkshire vibe—it’s very high/low, like Costco (a big Berkshire holding). There’s also an element of WordCamps or a Salesforce Trailblazer event in that you can tell there’s a “type” of person that’s easy to spot who’s a Berkshire enthusiast. A lot of Berkshire brands are also WordPress users: Duracell, GEICO, Acme Brick, Berxi, MiTek. I think there is a lot of mimetic overlap between the values of open source and the values of building a Berkshire company.

\n\n\n\n

As with any big gathering, the side events are also great, and I was honored to have a fireside chat with a friend and Buffett protégé, Tracy Britt Cool. To an audience of about 60+ CEOs in the Kanbrick community, we talked about Automattic’s history and some of the latest happenings in tech; AI was definitely on people’s minds in the Q&A. They had questions for me, but I also feel like I have a ton to learn from this group that has built founder or family-owned businesses with an average of 80-100M of revenue, the kind of thing that is the engine of the American economy.

\n\n\n\n

It makes me pine for the day when we can have more shareholders in Automattic; I think it would be an amazing cohort of folks that believe in open source and the open web, invested together and learning from each other, and I could imagine an event very much like these shareholder meetings. It’s so much more powerful when you build a business where your customers are also a community.

\n\n\n\n

Update: I knew this would be a special one because it was Warren’s 60th, but he really went above and beyond by announcing his intention for Greg Abel to take over as CEO at the end of the year. The standing ovation was a special moment, 60 years of 19.9% compounding returns! I think the future of Berkshire is very bright because he’s shared so much of his worldview that there are others that have made it their own.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 02 May 2025 21:56:07 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:32;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:61:\"Gutenberg Times: How to overwrite or remove core block styles\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=40172\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:72:\"https://gutenbergtimes.com/how-to-overwrite-or-remove-core-block-styles/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8248:\"

The technical documented term for block styles is Block Style Variations and are the smallest unit of Styles. They are on the block level. The others are Global Style Variations coming with a block theme, and Sections Style variations, that are for patterns and container blocks.

\n\n\n\n

WordPress includes a few block-level styles. You might have an urge to change them. Adjust them to your theme or branding designs. This post shows you three ways on how to alter those styles.

\n\n\n\n

Use Editor > Styles > Blocks

\n\n\n\n

WordPress offers more than one style for certain blocks. For example, the Buttons block has two styles: Fill and Outline

\n\n\n\n

Content creators and site builders can change the block’s style on a per-block basis. They can also change it on a per-site basis via the Styles area in the site editor.

\n\n\n\n \n
\n \n \n \n \n\n\n

Overwrite core block styles via theme.json

\n\n\n\n

As a developer, you can overwrite the Outline button styles via theme.json file.

\n\n\n\n

The example code below shows the modification of the core/button variation with a: 

\n\n\n\n
    \n
  • 0px border radius.
  • \n\n\n\n
  • 3px wide blue border.
  • \n
\n\n\n\n

These styles will replace the default rounded, black, 2px borders.

\n\n\n\n
{\n	\"$schema\": \"https://schemas.wp.org/trunk/theme.json\",\n	\"version\": 2,\n	\"styles\": {\n		\"blocks\": {\n			\"core/button\": {\n				\"variations\": {\n					\"outline\": {\n						\"border\": {\n							\"color\": \"blue\",\n							\"radius\": \"0\",\n							\"style\": \"solid\",\n							\"width\": \"3px\"\n						},\n					}\n				}\n			}\n		}\n	}\n}
\n\n\n\n

\"🖼\"

\n\n\n\n

For other core/block styles, you can overwrite their styles in the styles.blocks.core/[block] section of your theme.json file—simply replace [block] above with the actual block name. You can find a detailed walk-through of this process, including a list of available core block styles, on the WordPress.org Developer Blog: Customizing core block style variations via theme.json.

\n\n\n\n

Removing unwanted core block styles

\n\n\n\n

There are two functions you’ll need to address: 

\n\n\n\n\n\n\n\n

Block styles can only be unregistered in the same coding language used to register them. Core blocks are all registered via JavaScript. The example code removes the extra block style for the image block called rounded.

\n\n\n\n
wp.domReady( function() {\n\n   wp.blocks.unregisterBlockStyle( \'core/image\', [ \'rounded\' ] );\n\n} );
\n\n\n\n

If you are keen to learn more about how to create block styles, I just published a deep dive into that topic.

\n\n\n\n

Mastering Custom Block Styles in WordPress: 6 Methods for Theme and Plugin Developers

\n\n\n\n\"\"\n\n\n\n

Resources to learn more

\n\n\n\n

For more ways to change the block editor, read 15 ways to curate the WordPress editing experience.

\n\n\n\n

For more articles on the various styles, there are great articles on the WordPress Developer blog:

\n\n\n\n\n\n\n\n

What are other questions you might have about changing core blocks via the Global Styles? Leave a comment or join us on Discord

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 02 May 2025 14:04:40 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:33;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"Do The Woo Community: Friday Shares, May 2, 2025 v17\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96493\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:54:\"https://dothewoo.io/blog/friday-shares-may-2-2025-v17/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"Friday shares from us continues to grow.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 02 May 2025 12:58:07 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:34;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"Do The Woo Community: Life’s Jerks and Flows: Lessons from Ma Joad\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96467\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://dothewoo.io/blog/lifes-jerks-and-flows-lessons-from-ma-joad/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:141:\"Life\'s either a series of jerks, or a flow like a stream, according to Ma Joad. We all ride those currents—career changes are no different.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 02 May 2025 08:40:05 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:35;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:107:\"Do The Woo Community: Beyond Code: How the WordPress Photo Directory is Building a More Inclusive Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96469\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:110:\"https://dothewoo.io/blog/beyond-code-how-the-wordpress-photo-directory-is-building-a-more-inclusive-community/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:228:\"The WordPress Photo Directory offers an inclusive way to contribute, showcasing diverse cultures through photography. Anyone can participate, enhancing community creativity while gaining valuable skills and a sense of belonging.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 01 May 2025 13:35:32 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:36;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"Do The Woo Community: Tech, You Gotta Love It. (Sometimes)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=96455\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"https://dothewoo.io/blog/tech-you-gotta-love-it-sometimes/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:140:\"Tech woes march on: hardware fails, Slack gets ditched, and buried settings lurk like ninjas. Fingers crossed for a happy tech day tomorrow!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 01 May 2025 09:42:42 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:37;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"WordPress.org blog: WordPress 6.8.1 Maintenance Release\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18721\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2025/04/wordpress-6-8-1-maintenance-release/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6925:\"

WordPress 6.8.1 is now available!

\n\n\n\n

This minor release includes fixes for 15 bugs throughout Core and the Block Editor addressing issues affecting multiple areas of WordPress including the block editor, multisite, and REST API. For a full list of bug fixes, please refer to the release candidate announcement.

\n\n\n\n

WordPress 6.8.1 is a short-cycle maintenance release. More maintenance releases will be made available throughout 2025.

\n\n\n\n

If you have sites that support automatic background updates, the update process will begin automatically.

\n\n\n\n

You can download WordPress 6.8.1 from WordPress.org, or visit your WordPress Dashboard, click “Updates”, and then click “Update Now”. For more information on this release, please visit the HelpHub site.

\n\n\n\n

Thank you to these WordPress contributors

\n\n\n\n

This release was led by Aaron Jorbin.

\n\n\n\n

WordPress 6.8.1 would not have been possible without the contributions of the following people. Their asynchronous coordination to deliver maintenance fixes into a stable release is a testament to the power and capability of the WordPress community.

\n\n\n\n

Aaron Jorbin, Adam Silverstein, Aki Hamano, Ankit Panchal, bernhard-reiter, Carolina Nymark, Code Amp, Daniel Richards, David Baumwald, David Levine, Dilip Bheda, Dion Hulse, dsawyers, eduwass, Erick Hitter, Estela Rueda, Fabian Kägy, George Mamadashvili, Greg Ziółkowski, H. Kabir, hideishi, Himanshu Pathak, jarekmorawski, Jb Audras, Jeffrey Paul, Jeffro, Jeremy Felt, Joe Dolson, Joe McGill, Joen A., John James Jacoby, Jonathan Desrosiers, Jonny Harris, Joshua Goode, Karthikeya Bethu, Kingsley Felix, Konstantin Obenland, Lena Morita, LilGames, megane9988, Michelle Schulp Hunt, Mitchell Austin, Mukesh Panchal, nickwilmot, Nikunj Hatkar, Pascal Birchler, Paul Biron, Peter Wilson, Pratik Londhe, Presskopp, Sainath Poojary, Scott Kingsley Clark, Scott Reilly, Sergey Biryukov, SirLouen, Sören Wünsch, Sourav Pahwa, Stephen Bernhardt, takuword, Tushar Patel, Weston Ruter, Yogesh Bhutkar

\n\n\n\n

How to contribute

\n\n\n\n

To get involved in WordPress core development, head over to Trac, pick a ticket, and join the conversation in the #core and #6-8-release-leads channels. Need help? Check out the Core Contributor Handbook.

\n\n\n\n

Props to @estelaris and @joedolson for proofreading.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 30 Apr 2025 17:17:09 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Aaron Jorbin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:38;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:87:\"WPTavern: #167 – Bud Kraus on Podcasting and Finding Inspiration in WordPress Stories\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=195280\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:101:\"https://wptavern.com/podcast/167-bud-kraus-on-podcasting-and-finding-inspiration-in-wordpress-stories\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:46549:\"Transcript
\n

[00:00:19] Nathan Wrigley: Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.

\n\n\n\n

Jukebox is a podcast which is dedicated to all things WordPress. The people, the events, the plugins, the blocks, the themes, and in this case, podcasting and finding inspiration in WordPress stories.

\n\n\n\n

If you’d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice. Or by going to wptavern.com/feed/podcast, and you can copy that URL into most podcast players.

\n\n\n\n

If you have a topic that you’d like us to feature on the podcast, I’m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wptavern.com/contact/jukebox, and use the form there.

\n\n\n\n

So on the podcast today we have Bud Kraus.

\n\n\n\n

Bud’s name might ring a bell in the WordPress community, not only for his teaching and writing, but also as the host of the Seriously, BUD? Podcast.

\n\n\n\n

Bud’s WordPress journey started back in 2009 when a client told him he had to learn WordPress, and ever since he’s been immersed in all aspects of it. From building sites to teaching, to creating content for major WordPress businesses. These days, Bud calls himself a WordPress content creative, focusing mainly on producing articles, videos, and of course, his own podcast.

\n\n\n\n

In this episode, we turn the microphone around on Bud to talk about his transition from site building to content creation. He shares how the Seriously BUD? podcast came out of a desire to have real, unscripted conversations with people from around the WordPress community. Chats that go beyond plugins and code and dig into the stories, quirks and lives of the people behind the tech.

\n\n\n\n

We talk about the format of the show, Bud’s technique for bringing out interesting stories, and the importance of really listening to guests. Bud explains his approach to podcast technology, why he thinks the tech stack doesn’t have to be intimidating or expensive, and he also offers insights into the editing process that makes his interviews come alive.

\n\n\n\n

Towards the end, Bud shares his thoughts on the future of podcasting. Why it’s still such an appealing medium, and what it takes to keep a show fresh and enjoyable for the long haul.

\n\n\n\n

If you’re curious about podcasting, interested in the art of conversation, or are thinking about starting your own show, this episode is for you.

\n\n\n\n

If you’re interested in finding out more, you can find all of the links in the show notes by heading to wptavern.com/podcast. Where you’ll find all the other episodes as well.

\n\n\n\n

And so without further delay, I bring you Bud Kraus.

\n\n\n\n

I am joined on the podcast by Bud Kraus. Hello.

\n\n\n\n

[00:03:12] Bud Kraus: Hi, Nathan. How are you?

\n\n\n\n

[00:03:13] Nathan Wrigley: Yeah, very good. Nice to chat with you. The tables are turned because not that many weeks ago I appeared on your podcast, which is going to be the focus of this podcast today. So it’s kind of inception, WordPress Podcast inception.

\n\n\n\n

[00:03:27] Bud Kraus: You know, podcasting is getting very incestuous. I mean, everybody’s on everybody’s show. It’s more convoluted than the Hapsburg Empire. I mean, it really is.

\n\n\n\n

[00:03:36] Nathan Wrigley: That’s a description. I like it. Before we begin and start to explore your podcast, why you did it and so on, let’s just get into who you are. So a couple of minutes, really, your potted bio. Tell us anything that you like. This is obviously a WordPress podcast, so centering it around your WordPress journey would probably be ideal. So, couple of minutes, over to you.

\n\n\n\n

[00:03:54] Bud Kraus: Alright. Well, I have a little elevator speech on this, or a little longer than an elevator. But in 2009 I had a friend client who sat me down at the Oyster Bar in New York City and said, you know, you really need to learn WordPress. And I said, no, I’m a Rage Against the Machine kind of guy.

\n\n\n\n

And then he got very serious and then I started to learn. And once I learned that you could make a child theme and what that was all about, you know, I was hooked. And then I started teaching WordPress at FIT in New York City and everywhere. I was just teaching like crazy. And I was making websites, and eventually I got to hate making websites because I just wanted to do it my way, not the client’s way. That’s not really a good attitude.

\n\n\n\n

And eventually in the last couple of years, I’ve really gotten into creating WordPress content for WordPress businesses. So I call myself a WordPress content creative. That also includes, of course, podcasting and my show Seriously, BUD? So that’s it.

\n\n\n\n

[00:04:44] Nathan Wrigley: So are you still working with WordPress in any way, shape, or form for other people, or is it primarily just for yourself now?

\n\n\n\n

[00:04:51] Bud Kraus: I try not to, unless you beg me. Now, occasionally, no, I do have a couple of sites that I do updates for. I could get rid of that business. It’s not really much, but I just like doing it and I like the people and so, you know, I do it. But I have my own two sites, joyofwp.com and seriouslybud.com. And I am the client, so I get to decide everything and that’s what I like about it.

\n\n\n\n

So yes, I don’t want to stop doing WordPress, okay, the site stuff, because it will diminish my ability to write and create WordPress content, but I don’t want to get paid to do it for clients.

\n\n\n\n

[00:05:27] Nathan Wrigley: And was the intuition to move into content, was that purposeful? In other words, did you sit yourself down and say, do you know what? I’m fed up of doing the client thing, I want to stay in the WordPress space, so what can I do? Well, content seems like a good thing. Or was it more an evolution where you just wrote a few pieces and discovered that you enjoyed that?

\n\n\n\n

[00:05:44] Bud Kraus: Well, I am not that smart. The first way to do it, like to think logically I should be doing this, I don’t go that way. So, Vikas Singhal from in InstaWP got me really on this track a couple years ago when we first met online. And he said, why don’t you create a video for me on security? I said, okay. And I did.

\n\n\n\n

And then I started doing some other things, and then Marcus Burnette said, why don’t you write articles for GoDaddy? And I started doing that. And I said, you know, I have written articles before, but I never got paid for it. And I thought like, you actually can get paid to create WordPress content. No way.

\n\n\n\n

So that turned into, now I write for Hostinger on a regular basis. I write for Kinsta on a regular basis. And I could write for, name it, okay. But that’s not, the problem is I can only, you know, one person and I’m not interested in cloning myself and making myself into a content agency. And so this is it.

\n\n\n\n

And the podcast, well, we’ll get into that. But I wish I were smart enough to plan. Life is what happens to you while you’re busy making other plans. That’s just the way it is.

\n\n\n\n

[00:06:48] Nathan Wrigley: Yeah, I think the same is true for me. I was building client websites and straight into, I mean, all I do basically is create podcasts. I’ve never written much. I don’t really have the capacity to overcome the blank page at the beginning. But I stumbled into podcasting and it slowly became what I did.

\n\n\n\n

And there was never an intention there. It surprised me that the WordPress ecosystem is actually big enough that that kind of thing is possible. Now, if everybody in the WordPress space decided to make a podcast, both you and I would be sunk.

\n\n\n\n

[00:07:22] Bud Kraus: Wait a minute. Pardon for the interruption, but doesn’t everybody in the WordPress space have a podcast. Where are you going with this?

\n\n\n\n

[00:07:29] Nathan Wrigley: Yeah, it does definitely sometimes feel that way. But if everybody did it, then we’d all be sunk. But the fact of the matter is, there are literally millions of people out there using WordPress. And so there’s a niche within a niche. You know, you can find, I don’t know, maybe you do a security podcast in the WordPress space or a community podcast or what have you.

\n\n\n\n

You’ve settled on, Seriously, BUD? Tell us what that is then, and how you’ve settled on that format? And what is the format?

\n\n\n\n

[00:07:55] Bud Kraus: Well, the idea came in an instant. This was after years of saying to Bob Dunn, you know, I will never make a podcast. What are you doing podcasts for? This is the most ridiculous thing. Why does anybody ever make a podcast? So I was not looking to do this.

\n\n\n\n

But I was in an Uber leaving WordCamp US 2023 in Washington. I’m telling you, like a lightning bolt, this thing hit my head and it went like this. You know, I wish I could spend more time with Nathan Wrigley. I just got to wave at him and like say hi, and that was about it. But boy, I’d certainly like to know about his childhood, his life, whatever, I’d like to spend more time, and have a conversation about his life.

\n\n\n\n

And in that instant, the show was born. Now, it wasn’t called Seriously, BUD? Right away it was called In Conversation With, but that’s such a boring subject title. But I knew right from the get go that this is what I wanted to do. And I also said, I don’t care if I ever get sponsors. Now I do. I don’t care if I ever get listeners. Now I do. But I just wanted to do it for myself because, you know, it was like, what do they say, scratch an itch or whatever it is. Itch a scratch or scratch an itch.

\n\n\n\n

So that was it. And about four or five months later, I did my first episode with Marcus. And it’s been every Friday at eight o’clock in the morning, in Eastern Standard time, a new episode comes out and I’ve, I don’t miss. The really cool thing is that the stories are phenomenal. I mean, there is a certain, similarities between people, there definitely is and I can write a book now about the WordPress community.

\n\n\n\n

And I’m also, you know, the purpose of the show too is not just to satisfy me, but to give people an opportunity to tell their stories. And not surprisingly, people like to talk about themselves. You know, so my job is sort of, let them do that, get out of the way, hopefully get them to say something that they don’t really want to say. It’s just been really, it’s taken over my life.

\n\n\n\n

[00:09:47] Nathan Wrigley: Have you always been, how to describe it, a raconteur? Have you always been the kind of character that can fill a silence? Or is this something that you’ve had to develop and get out of your comfort zone a little bit?

\n\n\n\n

[00:09:59] Bud Kraus: No. I’ve always been pretty good at talking to people. And I really started to realise that, or sort of got into that, I took this train trip around the United States in 2018. I was gone for 19 days, went all the way around the country, and I basically would interview people. Now, you know, I didn’t record much, but I would just go around and say, when you’re on a train for that long a period of time, you get to talk to people.

\n\n\n\n

And I started realising, my God, everybody I’m talking to has the most unbelievable story. It wasn’t like right from there, I went from that to WordPress, to my podcast. But I, you know, in a very gradual process, I started to realise that I like doing this. And the other thing is I love radio and the spoken word, and I think you do too. Most people who are in podcasting are sort of like frustrated radio personalities or whatever. I don’t feel that’s what I am, but I’ve always listened to talk radio ever since I was a little kid so, yeah, it all fits together.

\n\n\n\n

[00:10:56] Nathan Wrigley: I feel there is a certain skill if you are going to do interviews as you do, and it, I guess it’s more of a conversation what you have. I think most of content that I create is more of an interview where the person comes and I ask a series of questions, which hopefully elicit responses.

\n\n\n\n

But I think there is a certain character trait about that. You know, the ability to ask questions and then sit back and listen. And that is one of the things that I discovered at the beginning was the most important skill is not necessarily the question, it’s the listening. Which sounds a bit the wrong way round. But if you’re not listening to each reply as it comes out the guest’s mouth, then the follow-up question is basically, you’re just following a proforma.

\n\n\n\n

Okay, I’m going to ask this question, and then whatever comes out of their mouth when they finish saying that, I’ll go to this question. And that, for me, has never really worked. It’s been more a case of, okay, be quiet Nathan, listen to the reply, and then hopefully the conversation will flow, because a question that you didn’t anticipate will come out of your mouth. And so I wondered if that was a part that you’ve discovered as well as I did, that listening is equally important.

\n\n\n\n

[00:12:03] Bud Kraus: It’s probably more important now. You know, it reminds me, in fourth grade, I had a music teacher that said, it’s not the note you’re playing, it’s the next note. And that’s very much like what you’re talking about, which is you’re listening and you’re figuring out, and it’s hard. It’s not that simple, because you’re listening to what they’re saying, but you’re also thinking, what’s going to be my follow up question? What’s the natural flow of the conversation?

\n\n\n\n

You know, and if you’re really good at it, you’re not really thinking that way. It just flows natural, you know? So if they say something, I think the first thing you need is curiosity. Where did that come from? Or, why did you do that? Or, how come you didn’t do this? And in fact, we’re releasing a book, an ebook now called Questions I Wish I Had Asked. And I have five people who have answered each one, their own question that I should have asked them, or I forgot.

\n\n\n\n

So when it comes to this kind of stuff, you can build like a little empire with eBooks and blogs and this, you know, it’s just amazing what can grow out of a podcast.

\n\n\n\n

[00:12:55] Nathan Wrigley: I make sure that all of the guests have access to some sort of shared show notes, so that if I have a series of questions, at least they can be prepared. But also my weapon of choice is what you can now see, but the people listening to this can’t. It’s basically a pen and a piece of paper. When something during the course of our conversation occurs to me, I know that my job is to not interrupt you with that moment’s thought, but I just scribble it down and then when you’ve finished, see if that’s where the journey takes me. But it might be that something else comes along. So yeah, it’s kind of interesting.

\n\n\n\n

I think we’re both very lucky though, in that we are in the technology space, and WordPress in particular is this perfect medium for getting a podcast out into the real world. Because I feel that for a lot of people, that’s another hurdle that they’ve got to go through. Okay, I want to make a podcast. How do I do that? Where do I put it? How do I get a website, and all of that? And so, what do you feel about that? Do you feel that you’re in a, you know, a lucky position that you knew WordPress when you started out this whole thing?

\n\n\n\n

[00:13:55] Bud Kraus: Yeah, but I didn’t really launch with a website. I launched just by learning the software, Descript and SquadCast and the Riverside and this and that, you know? Because I didn’t know any of this. And, you know, some people were giving me, why don’t you check this, check that? And eventually I came up with my podcast stack. How do you like that?

\n\n\n\n

But then after I had a couple episodes out, I thought like, you know, I should have a website. And then that came along. And of course that’s easy because, you know, we both know WordPress, so that part’s done.

\n\n\n\n

Yeah, you’re right. I mean, we’re lucky also that we’re in a community who is technologically savvy and will listen to podcasts. And so that’s another thing that’s also fortunate that there are many corporate sponsors of WordPress podcasts. Although I don’t consider myself a WordPress podcast, but you know, I guess I am.

\n\n\n\n

[00:14:43] Nathan Wrigley: Yeah, I guess the people that you’re interviewing are definitely bound to that subject, but you are very often not dealing with WordPress too much during the conversations, which is I think kind of nice. And we’ll get onto that in a minute.

\n\n\n\n

But, do you mind if I obsess about the tech stack there? Because it may be that there’s people listening to this who have listened to this podcast and it just comes out of their phone or it comes out of their speakers, and they’ve never really thought too much about the bits and pieces that go on in the background. So let’s just share our similarities and differences there. What would you say is the tech stack that you’ve got? What are the three or four things which are essential that you’ve learned?

\n\n\n\n

[00:15:16] Bud Kraus: Well, I start with SquadCast for the recording. And I’m not an expert on this because I’m still new at this and I don’t, you know, I haven’t used, I’ve experimented a little bit with Riverside, and I know there’s a whole bunch of other ones and free ones and this one, but SquadCast, you pay a little bit of money, so what. And I think it’s really good. You can do audio, you can do video, you can do all kinds of stuff. And then I use Descript to do the editing.

\n\n\n\n

And you know, everybody has a different workflow. I will use the timeline, I will use the text-based editing. I’ll do it my way, you’ll do it your way. It’s always kind of interesting to learn how people use these tools in different ways. And then after the show is edited, and personally I find the editing to be the best part of the show, which is really, you know, you think talking to the people. Well, that’s fun but, you know, Nathan, going back to what you were talking about, about listening, I don’t really hear the show until I start editing.

\n\n\n\n

That’s the first time I really hear it, because I’m not concentrating on the questions. I’m now focused on what the guest had to say. And then it’s a very creative process. Do you want to shorten the gaps between pauses? Do you want to take out all the ums, sos, you knows, all that stuff? You know, all those words that, the filler words, or do you want to let it fly? Do the Rob Cairn’s approach, no editing. There’s different ways of doing this.

\n\n\n\n

I am more of a particular on the editing. I like to really clean things up and cut things out, especially if it’s me talking. I did this episode with Jeff Chandler where we went on and on and on about sports. That all got ripped out because like, come on, we’re both from Cleveland, Ohio. So you know, we start talking about Cleveland sports, get rid of this, no one’s going to listen. So I try to think of like the audience too.

\n\n\n\n

But anyway, the editing is the most fun. A little tedious, but I think the most interesting part. And when it’s all done, then I run the file through, what did he take? It was a, I forgot what it’s called. Anyway, I run it through like a cleaner and then I published it to Buzzsprout, which seems to be doing a very good job publishing and putting it on all these platforms.

\n\n\n\n

Because you don’t want, you need to have a podcast distribution service. You can’t go to all these different services and do it yourself. So it’s kind of, you know, it was sort of, because I had an understanding of technology and how things worked. The learning curve wasn’t too bad. It was pretty easy actually, when you think about it.

\n\n\n\n

[00:17:37] Nathan Wrigley: I think when I started, I think I started in 2016 or something, it was definitely, it wasn’t difficult at that point. Many of the hurdles have been overcome, but it’s certainly easier now. When I did it, I began with Skype, which has just died actually, or at least Microsoft have said they’re going to kill it off.

\n\n\n\n

I bought an app which would go on the Mac, and then that would record. But there was no clever sort of software like you described. We’re using now SquadCast, which is basically, you open it in the browser, send a link to somebody, and so long as they’ve got access to the internet and a microphone, we are good to go.

\n\n\n\n

And it’ll record everything in separate isolated tracks. And then, as you said, both of us will throw it into Descript, which is a piece of software, it’s actually available in the browser, but you can also download it as app. And you can do all sorts. It’s amazing what it can do actually. It will bind the transcript that it creates to the timeline. And so you can delete portions of text by highlighting as if you’re in a Google Doc or something like that, so delete sentences and what have you. And it’s really sublime. So it’s much, much more straightforward.

\n\n\n\n

But I’m, a bit like you, I’ve really enjoyed the editing experience because you can fiddle with it, can’t you? And you can decide which bits stay on the edit room floor and which bits go in, and sometimes you go off on different tangents. But the other side of it, that’s the software side. What are you using to actually record the audio? So microphones and computers and any of that.

\n\n\n\n

[00:18:59] Bud Kraus: Okay, well, thank you Omnisend, my first sponsor. I have to get that in there, because they bought me, they said, we don’t want you using that crummy microphone anymore. Go out and buy yourself a nice microphone. Which is, it’s the same thing that you’re using. What is it?

\n\n\n\n

[00:19:11] Nathan Wrigley: It’s a Shure MV7.

\n\n\n\n

[00:19:13] Bud Kraus: Yes. And I really like it a lot. I have it on my desktop. I have a desktop stand for it. I have a hard time doing a boom microphone. So it’s a desktop, and it’s nice. But you know, you don’t need, I think a lot of people know, you don’t need a lot of heavy investment to do a podcast. It’s almost, talk about a barrier to entry being nothing or next to nothing. Podcasting certainly is that.

\n\n\n\n

[00:19:35] Nathan Wrigley: Yeah, you really, really need very little. You and I have got this modestly priced mic. It’s not the top tier and it certainly isn’t the bottom tier. But when I began, for probably four or five years, I had a really cheap mic. And it’s about where you position it and how far away you are from it and refining all of that and, you know, not breathing too heavily over it and different bits and pieces.

\n\n\n\n

But the barrier to entry really is, if you’ve got a phone, you’ve got everything that you need, because it’s got its own microphone built in, it’ll do a credible job. The audio software will kind of clean it up nicely. And the website, the WordPressy bit is icing on the cake. If you really wanted to keep it cheap and cheerful, Google’s YouTube will suffice. Really, you could just upload it to YouTube and they now offer podcast as an option. It doesn’t have to be a video. Well, it needs to be a video, but it doesn’t have to actually be a picture of you and your guest or anything like that.

\n\n\n\n

[00:20:28] Bud Kraus: I upload, I mean I know I’m interrupting you, but I have a question. So, where do you think the future of all this podcasting is going? I mean, what’s podcasting going to be like in a couple of years, according to you?

\n\n\n\n

[00:20:38] Nathan Wrigley: I will give you the answer to that in about.

\n\n\n\n

[00:20:40] Bud Kraus: I’m sorry for interrupting.

\n\n\n\n

[00:20:41] Nathan Wrigley: No, no it’s fine. I will give you the answer to that in a few weeks time. I’m going to, one of the biggest podcast shows in the world is held in London every May. I’m going to be going to that. 10,000 attendees. You know, I’m in this little WordPress bubble of podcasting, but it’s an absolutely gigantic industry. It’s occupying one of the biggest convention spaces in the UK in London, in Islington, if you’re a person that knows London. I will give you more of an answer then because it’ll be interesting to see what the trends are.

\n\n\n\n

However, we did have a bit of a bump in credibility in podcasting for a while, and then I think it plateaued a little bit or perhaps went down. But more recently, I think it’s been going up again.

\n\n\n\n

The reason I think it remains popular is the same reason that talk radio hasn’t gone away, is because you can really get into the subject matter. If you’re really into WordPress, then there’s a bunch of WordPress things, or if you’re into, I don’t know, skiing, there’ll be skiing podcast and what have you. And the crucial bit for me is that you can do other things at the same time.

\n\n\n\n

[00:21:43] Bud Kraus: Well, that’s where I was going to go too, which is talk about a mobile media. You could take it wherever you go. You don’t have to sit at a computer or anything, it’s in your headphones.

\n\n\n\n

[00:21:52] Nathan Wrigley: If you’re stuck in your own house, you know, just doing chores, it can be done at the same time. And even things like mowing the lawn, which is typically quite loud and probably would’ve gotten in the way, the noise canceling headphones that you can have nowadays. And for me, basically, when I’m not doing something which requires my eyes to be on something, if I’m alone and I’ve got nothing else to do, you can more or less guarantee that I will have a podcast plugged into my headphones.

\n\n\n\n

[00:22:19] Bud Kraus: Well, you know, this is the perfect medium for the legally blind. I ought to know, I’m speaking from experience here, but it is, it’s all ears.

\n\n\n\n

[00:22:27] Nathan Wrigley: So, I don’t know. I don’t really have an intuition about where it’s going to go, but I don’t see any signs of it as a medium going away. Because I think we all love to listen, well, not all of us, but many of us really enjoy listening to other people and their stories, and their trials and their tribulations and their expertise and whatever it may be. I think it’s going to stick around

\n\n\n\n

[00:22:50] Bud Kraus: Now, you’re so lucky because you have those golden pipes, I have nothing. I have this old man’s voice. God, I would do anything like if AI could clean me up and make me sound like you, I know it could. That gives me an idea.

\n\n\n\n

[00:23:02] Nathan Wrigley: You’re very kind. I’m not sure you’ve captured entirely what my.

\n\n\n\n

[00:23:06] Bud Kraus: Oh no, I remember, whoa, hold on a second. I first saw you and heard your voice when you were doing the agency summit and you’re doing all those intros. I don’t know how long ago was that?

\n\n\n\n

[00:23:15] Nathan Wrigley: Oh, probably about, I don’t know, 7 years or something like that, yeah.

\n\n\n\n

[00:23:18] Bud Kraus: Yeah. And I was listening. I go, oh, I’d like to. Who’s this guy with a voice?

\n\n\n\n

[00:23:22] Nathan Wrigley: You know we talked about editing bits out.

\n\n\n\n

[00:23:25] Bud Kraus: That’s going to be edited out. Don’t you dare. You better not or you’ll be hearing from me.

\n\n\n\n

[00:23:30] Nathan Wrigley: We’ll see. We’ll see if it makes it. Okay, let’s, dig into your podcast. We’ve talked a lot about how we go about making podcasts. What is the plan? What do you do during that podcast? Yeah, just tell us what you do on typical episode and what are you trying to achieve there.

\n\n\n\n

[00:23:44] Bud Kraus: Okay. Well, I’m trying to get an unexpected conversation. I always say it’s an unexpected conversation of so and so in the WordPress community. What I do is a guest first has to come to my site and fill out a form, which everybody says is ridiculously long. And I mean, you know, I ask about like almost, every question I could think of. What’s your blood type? Things like that.

\n\n\n\n

And then I, before the show starts, I really don’t do any prep, very little. But before the show starts, I’ll look at what you submitted, I’ll look for a question, my first question, whatever it is. And it’s not going to be like, where were you born? Okay. It’s going to be like how come you like to smoke or something, you know? What’s that? It’ll be something like that.

\n\n\n\n

Off we go. The show does not follow a linear progression, because that’s, I look at it like if I’m talking to you like at a bar or something like that. I’m not going to start from the beginning of your life and go to the end. I’m going to go back and forth and whatever. It’s just going to be, it’s sort of like a show about nothing, you know?

\n\n\n\n

[00:24:35] Nathan Wrigley: It’s like the Seinfeld of podcasts.

\n\n\n\n

[00:24:38] Bud Kraus: Right, and it works. Seinfeld worked. So I figured maybe this will work. So it goes back and forth and I try not to talk too much about WordPress. Usually I’ll say something like, okay, let’s talk about WordPress. You know, what do you do? And then if I feel like the guest is talking about anything, I’ll just jump in and go, okay, that’s enough of that, and we’ll go on to something else. When you’re in real life, at least for me, I’m rude enough to say to somebody, okay, enough, let’s go on.

\n\n\n\n

[00:25:01] Nathan Wrigley: So the intention then is to sort of figure out the personality behind the thing. So let’s say, for example, it’s somebody that we’ve all heard of in the WordPress space, they’ve got a thing, we’re all familiar with the thing that they’ve got. Okay, we know that about them. That’s a given. So your idea is to drill in and figure out, okay, just tell us something quirky and interesting about you, your life, and let’s talk about that.

\n\n\n\n

[00:25:23] Bud Kraus: Yeah, I mean, I try to ask like crazy questions to elicit some unusual, crazy response. And sometimes it happens, you know? Sometimes it does and sometimes it does. A couple of things. one I find the older you are, the more interesting you are to me, because you’ve lived a life. I don’t have anything against 25 year olds. I’ve had them on the show, but they don’t have the breadth of time that I’m looking for. That’s one thing.

\n\n\n\n

And the other thing is some of the people I know very well, and some of the people I don’t know at all. I think Brian Gardner, I didn’t know Brian, and I had a great time talking, you know? or Andrew Palmer, wow, those were so much fun. So it isn’t necessarily. In fact, to me, those are the best episodes when I don’t know the person, because I just, I’m more inquisitive.

\n\n\n\n

[00:26:07] Nathan Wrigley: How do you handle, or maybe you’ve not had one yet, how do you handle the guest who is not quite as talkative as you’d hoped for?

\n\n\n\n

[00:26:16] Bud Kraus: Boy, that’s a good question. I’ve had a few of those. I just do the best I can. You know, I mean, everybody’s a little different. You know, the other thing too is I do interviews with people that English is not their first language, and you’ve got to keep that in mind. You’ve got to give them the space to go slow, let them talk, and then do a lot of editing.

\n\n\n\n

Because what they tend to do is have what I call warmup words, where they’ll say the, the, the, the, and I don’t want four the’s, one is enough, So I’ll cut out the three the’s. That’s very typical of somebody where English is not the native language, because they’re thinking of how to say something. And I don’t necessarily think that makes for a good listening experience. So out it goes, and then they sound really good. You know, and I can think of a whole lot of people that, you know, I’d made them sound a whole lot better.

\n\n\n\n

Now, I want to tell you another little quirky thing about the show. I always think like, well, when I do Nathan Wrigley, which I’ve done, right? wow, everybody’s going to be listening to that episode, you know? Because he’s so well known. Now this is not necessarily you Nathan, but it doesn’t work that way. It does not work that way. At the end of the day, I’ve realised I don’t know how many people listen to an episode, there’s so many factors. But one of them is not how well known they are. That is not a factor. Contrary to Bob Dunn, who when I first started this, he said, well, if they know the person, if people are really well known, then everybody will listen to that episode. Not true.

\n\n\n\n

[00:27:41] Nathan Wrigley: Well, I guess maybe there’s that whole thing, who would listen to a podcast with me on it, because they can always listen to podcast with me on it, because that’s what I do. So yeah, that makes sense. And also, if you’ve heard from them, whoever the guest may be in a thousand different places, then yeah, I can understand that.

\n\n\n\n

[00:27:57] Bud Kraus: It turned out to be sort of like the lesser known people, if you will. They get more plays. It’s just that people are just more curious. You know, they maybe they’ve heard of that person and they’re a little more curious.

\n\n\n\n

Or, here’s the other thing that really increases. If so and so, let’s say it’s somebody in India or Australia or whatever, you know If they wanted to share this with their family and their friends, I see a lot of that kind of stuff going on. You get a lot of plays. So I look at, my podcast as not a WordPress podcast per se, and that’s why I think it has legs and, potential beyond the WordPress world.

\n\n\n\n

[00:28:28] Nathan Wrigley: Yeah, that was another question I was going to ask. Because you’re not really bound by anything other than, here’s a human being who can speak, and they’ve got a story to tell in some way, or at least we’ll try and pull a story out of them. I was going to ask if you were going to expand it beyond WordPress and just see where it leads you.

\n\n\n\n

[00:28:43] Bud Kraus: I have no interest, but I have people coming, friends and stuff, will you interview me and stuff? No, I’m not interested. I don’t have time for that kind of stuff, There’s enough fascinating people in the WordPress world, and it’s definitely a way for people to get to know other people in the WordPress, see that’s, you know, it’s a platform. So that they can get to know you, me, whoever it is, beyond the typical, what’s your WordPress journey stuff, or what do you do with WordPress? It’s the story. It’s the person. It’s the biography.

\n\n\n\n

[00:29:09] Nathan Wrigley: Have you ever had episodes that you were not able to get something that you’d hoped out of it? So in other words, you pressed record and then by the time you’d finished the episode, you thought, oh gosh, that didn’t work out as anticipated, or that just went off the rails, or there was nothing of interest there. Let’s can that one and either retry it or just bin it.

\n\n\n\n

[00:29:30] Bud Kraus: Well, I’ve had two, one episode that the interviewee said, I don’t want you to air this, so, okay, I didn’t. And then another one said, there was a whole thing about something that this person said, I had it cut out because this person did not want me to air it. So I did. But for the most part, no. Now some of them I get off and I go, wow, that was really great. I do have that, like, whoa, what a story. And then sometimes it’s just okay, it didn’t go anywhere, or I thought it’d be better or whatever. So, I don’t know. I don’t know everybody that I interview and, the more I do this, the fewer people I really know, which is good.

\n\n\n\n

[00:30:07] Nathan Wrigley: I set the expectations, like I said, with shared show notes, but also prior to hitting record, I mean, I know you so we didn’t do so much of that, but I always make time to, maybe even like half an hour or something just to chat before we hit record. So I’ll make sure that we just talk. And very, very often, very often I will do a call with somebody who wants to be on the podcast but doesn’t know if they can do a podcast. And we’ll just have a chat. And at the end of that chat, I’ll say, that’s what it’s like. Do you want to record it another day? And I’ve yet to find somebody that’s turned me down on that basis.

\n\n\n\n

[00:30:45] Bud Kraus: You know, that’s an excellent point. because I’ve had a few people where English is not their language and they’ll say, well, I’ve never done a podcast. Now Anna Hurko, I was the first person, right the CEO of Crocoblock. My podcast was her first, her episode went through the roof. Absolutely went through the roof. And now you can’t get her off podcasts Like I see, she’s everywhere now, which is great. I love it. And you know, English is not her first. She speaks 85 languages, so it was great. Anna was fun. It’s an adventure. I guess it’s fun. I mean, God, Nathan, I have fun at everything I do, whether I’m writing, or spot podcasting or, you know, talking to you even.

\n\n\n\n

[00:31:23] Nathan Wrigley: Even, yeah.

\n\n\n\n

[00:31:24] Bud Kraus: One last thing I was about before the show, I try to keep that very short. Because I don’t want to not record something that’s really good. And I’ve noticed that a lot of really good stuff was being said before and after the recording. So I don’t want for that to happen. I want it to be recorded.

\n\n\n\n

[00:31:40] Nathan Wrigley: Yeah, it’s interesting because I have the opposite intuition. I have the intuition that if I get to know them, and put them at their ease, that rapport that is built up over 20 minutes or half an hour, will then lead to a better experience because we’ll both feel a little bit more relaxed and comfortable.

\n\n\n\n

[00:31:54] Bud Kraus: Well, for what you do and how you do it, that makes a lot of sense. For me, it doesn’t because I’m going to leave stuff out. Now, here’s the problem though, and you probably realize this too. If you don’t know somebody, you don’t have a pre-established speaking pattern, and you tend to step on their words and they tend to step on yours. But like you and I, we pretty much have talked to each other, you know, for a while and different times. And so we now know, this is when I stop and this is when he stopped. You know, that kind of thing. It’s really hard when you’re first talking to somebody on a podcast and you don’t know them, boy, you’re going to be stepping on each other like crazy, in many cases.

\n\n\n\n

[00:32:29] Nathan Wrigley: Yeah, that’s kind of curious. So here’s an interesting thought then. You said that you’re enjoying it, which is lovely. I still very much enjoy doing podcasting. I have to pinch myself. What about the scenario where you have made podcasting the center, the fulcrum of what you do, and how you earn your money, and the sponsorships and all of those kinds of things. And then what if you don’t enjoy it anymore? Would it be a bit like the clients, would you be willing at that point to drop podcasting? Or do you feel like this is you for life now, this is what you’re doing?

\n\n\n\n

[00:32:58] Bud Kraus: This is it now. I have to say, there are some days, if you ask my wife, that I get, oh, it’s not growing. It’s like flattened out. It’s like, she goes, because I realise well, what else are you going to do? There’s nothing else for you to do. This is like the perfect thing for legally blind people. What else are you going to do?

\n\n\n\n

[00:33:14] Nathan Wrigley: You’re going to keep going.

\n\n\n\n

[00:33:15] Bud Kraus: Well, as long as, I mean, I’m not a kid. I’m sort of, you know, on the senior side of life. But there’s no reason to stop as long as I can keep doing it, you know? And I just got started doing it, so who knows.

\n\n\n\n

[00:33:26] Nathan Wrigley: The barrier to entry is low. The enjoyment is high. So it sounds like the perfect way to spend the next few years certainly.

\n\n\n\n

I’ve discovered that about 35 to 40 minutes is about the sweet spot for a podcast episode, because it seems be the attention span that most people have got.

\n\n\n\n

So that is a neat little segue for me to say we’re at minute 37 and a half, which is more or less exactly in the middle of that sweet spot. So I’m going to ask you just to sort of sign off. Tell us where we can find you. Where is the website, as in the URL? I know we’ve said the name of the podcast many, many times, but where can we find you? And where do we find you on socials and things like that?

\n\n\n\n

[00:34:03] Bud Kraus: Oh God. Alright I have a website called seriouslybud.com It’s kind of easy to remember if you can remember the name. One little quick thing, I know we’re running out of time. It doesn’t have the word WordPress or WP in it, which is different than a lot of podcasts. So it could be done for anything. And it wasn’t a name that I came up with. It was my graphic designer came up with it.

\n\n\n\n

Anyway, seriouslybud.com Now, the good thing about that is you can get all the episodes from the past. It’s very easy to access all those episodes. And eventually I’m going to be launching a blog which will discuss the show, the people in the show, the behind the scenes, all that kinda stuff. So I’m working on that. And as far as social, just, Bud Kraus, or seriously bud? That’s Kraus, No, E. Only one S. How’s that?

\n\n\n\n

[00:34:45] Nathan Wrigley: Perfect. I will make sure that those links and any others that we mentioned during the course of this recording go into the show notes. Head to wptavern.com/podcast, search for the episode with Bud Kraus. And, Bud, it just remains for me to say thank you very much for chatting to me today.

\n\n\n\n

[00:35:00] Bud Kraus: It’s always a pleasure to talk to. Well, let’s just say this. The pleasure was all yours, okay.

\n\n\n\n

[00:35:05] Nathan Wrigley: You’re too modest.

\n\n\n\n

[00:35:07] Bud Kraus: Alright, take care.

\n
\n\n\n\n

On the podcast today we have Bud Kraus.

\n\n\n\n

Bud’s name might ring a bell in the WordPress community, not only for his teaching and writing, but also as the host of the “Seriously, BUD?” podcast. Bud’s WordPress journey started back in 2009 when a client told him he had to learn WordPress, and ever since he’s been immersed in all aspects of it: from building sites, to teaching, to creating content for major WordPress businesses. These days, Bud calls himself a WordPress content creative, focusing mainly on producing articles, videos, and of course, his own podcast.

\n\n\n\n

In this episode, we turn the microphone around on Bud to talk about his transition from site building to content creation. He shares how the “Seriously, BUD?” podcast came out of a desire to have real, unscripted conversations with people from around the WordPress community. Chats that go beyond plugins and code, and dig into the stories, quirks, and lives of the people behind the tech.

\n\n\n\n

We talk about the format of the show, Bud’s techniques for bringing out interesting stories, and the importance of really listening to guests. Bud explains his approach to podcast technology, why he thinks the tech stack doesn’t have to be intimidating or expensive, and he also offers insights into the editing process that makes his interviews come alive.

\n\n\n\n

Towards the end, Bud shares his thoughts on the future of podcasting, why it’s still such an appealing medium, and what it takes to keep a show fresh and enjoyable for the long haul.

\n\n\n\n

If you’re curious about podcasting, interested in the art of conversation, or are thinking of starting your own show, this episode is for you.

\n\n\n\n

Useful links

\n\n\n\n

Seriously, BUD? podcast

\n\n\n\n

Joy of WP

\n\n\n\n

Questions I Wish I Had Asked – Bud’s eBook

\n\n\n\n

Descript

\n\n\n\n

SquadCast

\n\n\n\n

Riverside

\n\n\n\n

Buzzsprout

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 30 Apr 2025 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:39;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:65:\"Do The Woo Community: Should You Add to the Plethora of Podcasts?\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=95206\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://dothewoo.io/blog/should-you-add-to-the-plethora-of-podcasts/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:181:\"Content\'s everywhere, and you\'re thinking about starting a podcast. It\'s all about you, your co-host, and your guests, bringing unique vibes and insights. Just make it work for you.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 30 Apr 2025 10:56:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:40;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:41:\"Do The Woo Community: Trusting Technology\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=95416\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:45:\"https://dothewoo.io/blog/trusting-technology/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:120:\"This lead me to thinking about generations then and now, those who embrace technology, but there are some gaps in trust.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 30 Apr 2025 07:53:34 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:41;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:86:\"Do The Woo Community: Embracing the Fediverse: Moving Beyond Traditional Cross Posting\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=94609\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:89:\"https://dothewoo.io/blog/embracing-the-fediverse-moving-beyond-traditional-cross-posting/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:118:\"Understanding the need to rethink traditional social media practices like cross posting in this decentralized network.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 29 Apr 2025 12:54:20 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:42;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"WordCamp Central: EmpowerWP Bhopal 2025: A Journey of Inclusion and Impact!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"https://central.wordcamp.org/?p=9933937\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:98:\"https://central.wordcamp.org/news/2025/04/empowerwp-bhopal-2025-a-journey-of-inclusion-and-impact/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:15493:\"

Some moments in life leave an indelible mark on our hearts, and for me, EmpowerWP Bhopal 2025 was one of them. As the lead organizer, I envisioned an event that would bring a positive change to the lives of people around us, in society, and not just in the community. And what an incredible experience it has been!

\n\n\n\n\"\"\n\n\n\n

A Vision Turned Reality

\n\n\n\n

As part of the global WordPress initiative, WP Bhopal organised EmpowerWP on March 9th to commemorate International Women’s Day 2025. What began as an ambitious goal turned into a milestone moment, proving the power of representation, inclusion, and collective support.

I was introduced to the idea of #WomenInWordPress at WordCamp Bhopal 2023. But the purpose became clear only when the low ratio of women attendees in the monthly meetups became a constant. This event was important for several reasons, one of the major reasons globally was to bring in as many women in the radar as possible, to get them involved and change the already deteriorating state of women participation in the community & STEM in general.

\n\n\n\n

Challenging Norms and Expanding Inclusion

\n\n\n\n

For the first time in our chapter’s decade-long journey, we hosted a meetup with a female-majority audience. Going with the idea that empowerment doesn’t happen in isolation, we made this a woman-majority event. The point is that if we want women to upskill themselves, help & empower their own kind, it is also for men to support in whatever capacity they can and make space. It is also about them showing and reflecting that they are there, and therefore, the event attendees were divided into two categories: women and allies. It’s about uplifting society and making it empowered in the truest sense. To give the credit and appreciation wherever due. And we’re so thankful we stuck with that.

\n\n\n\n\"\"\n\n\n\n

Secondly, these events are largely limited to targeting students & professionals. But when we envisioned EmpowerWP Bhopal, we knew it had to be inclusive—not just for the conventional attendees but also for the very women who have shaped our lives. We wanted to utilize this opportunity to actually make a difference, not just for women already involved in WordPress or Tech but for those somewhat left behind from the active workforce due to family responsibilities, societal pressure, or other reasons. Our goal was to (re)introduce them to digital opportunities, help them upskill, and connect them to a supportive network.

\n\n\n\n

So we decided to target homemakers with untapped potential, women on career breaks looking to upskill, small business owners who had yet to digitalise, apart from students & professionals. The idea was to bring the digital revolution home.

\n\n\n\n

Execution: Bridging the Gap

\n\n\n\n

Targeting this group required a different approach. Many of these women needed reassurance and encouragement. We had to instill in them the idea that it’s not difficult; it’s just different. Our team curated learning videos and motivational messages from tech professionals (special thanks to Michelle & Krupa) as part of a dedicated social media campaign. We reached out via WhatsApp and Facebook, where these women were more active.

\n\n\n\n

Even then, we were uncertain if we could achieve our ambitious goals. But the response exceeded our expectations—106 registrations and 70+ attendees on event day. The diversity in the room was incredible: students, entrepreneurs, journalists, homemakers, designers, freelancers, and social activists. Our youngest attendee? A 5th-grade schoolgirl! That’s when we knew a difference had been made.

\n\n\n\n

EmpowerWP in Action

\n\n\n\n

The event was designed as a full day of learning, inspiration, and contribution. We started with a fun ice-breaking activity where all the attendees were asked to define ’empowerment’, and it was nice to gather all perspectives before we began.

\n\n\n\n\"\"\n\n\n\n

We had four technical sessions covering marketing, AI, WordPress, and design, by Nikita Varma, Purva Kushwah, Poonam Namdev, & Saloni Rathore, respectively.

\n\n\n\n

This was followed by a Contributor Hour, where attendees were guided to make contributions to Make WordPress—mostly as first-time contributors to the Photos and Translation teams. As sources tell us, more than 15 first-time contributions were made that day.

\n\n\n\n
\n\n\n\n

We also hosted a panel discussion titled Learners to Leaders, featuring Parul Shrivastava, CEO of a tech-marketing company, Arshi Khan, a startup founder leveraging social media for her business, and Manisha Lakhwani, a freelancer. They shared personal experiences, career journeys, and practical guidance on the howabouts.

\n\n\n\n

Before ending, we did a community talk, because, at the end of the day, awareness is what matters— What they can do for the community & what the community can do for them. The attendees were informed about the current schemes available and how they can benefit from them by becoming an active member of the WP Community.

\n\n\n\n

Additionally, every attendee’s ID card contained a link to a curated resources page, ensuring, at whatever stage of their journey they are at, they could continue learning even after the event.

\n\n\n\n

To ensure accessibility, the event was conducted primarily in Hindi, our local language, along with English.

\n\n\n\n

Challenges and Triumphs

\n\n\n\n

Gathering speakers was no easy task. As one of our panelists, Parul, rightly said, “We need to be comfortable in our own skin. We need to believe that what we do is worth sharing.” Thanks to the WP Bhopal community’s encouragement & outreach, we were able to host an all-women speaker lineup!

\n\n\n\n

It was inspiring to witness women from diverse domains, backgrounds, and experiences come together under one roof with a shared intent—to support, uplift, and empower each other.

\n\n\n\n

Know more about our speakers here.

\n\n\n\n

The event ended on a perfect note—with a networking dinner at Raasta Cafe, as India played the Finals for Champions Trophy 2025. India won, and so did we (in our little way)!

\n\n\n\n

Gratitude and Acknowledgments

\n\n\n\n

None of this would have been possible without the incredible people who believed in us. To our speakers, sponsors, and attendees—thank you for making this event meaningful. Every role mattered, and this success belongs to each one of you.

\n\n\n\n

A huge shoutout to our sponsors—Jetpack, A2 Hosting, WooCommerce, Bluehost, Hostinger, Kinsta, SEOPress, and CreedAlly— for standing with us and making this dream a reality. Bluehost & Jetpack’s swags were a hit among attendees and organizers alike!

\n\n\n\n

Know more about our sponsors

\n\n\n\n
\n\n\n\n

This note would be incomplete without acknowledging my incredible team. Pooja, my indispensable support for all the right reasons; Amit, an all-rounder & primarily the one behind our website; AntraAnukritiand Shashank from our social media team; Ishita and Mansi, from our content team; Aditya, who guided us from behind the scenes as our local mentor & Anshika who supported us on the final day of the event.

\n\n\n\n

Having led numerous teams and been part of even more, I know how rare it is to find a team that not only shares your vision but also takes ownership of it. Each one of them was diligent in their roles, but what stood out was how seamlessly they managed everything on the event day, without needing my intervention. This may seem simple, but it’s anything but. People often stick to what they are asked to do, rarely taking initiative on their own. Yet, this team did just that, going above and beyond in ways I hadn’t even anticipated. I’m incredibly grateful to have worked alongside such an amazing bunch of people.

\n\n\n\n

Know more about our team

\n\n\n\n

A special thanks to Pooja Derashri for taking the lead on a global level, Juan for preliminary checks, and Yogesh, our mentor.

\n\n\n\n

To the global community, especially the #WomenInWordPress—you inspire us. You embody the spirit of lifting each other up and making this space better, one step at a time.

\n\n\n\n

Special thanks to our local sister community GDG Cloud Bhopal and a heartfelt token of appreciation to community members Atharva Kulkarni, Kripesh Adwani, and Deepansh Gupta, for extending their support wherever we required a hand. With the support of the WP Bhopal community, we were able to create a space where diversity thrived and new voices found confidence.

\n\n\n\n
\n\n\n\n

To every woman out there contemplating her first step, this is your sign. Tech is for your empowerment, and you don’t need a degree to be a part of it. The digital revolution is yours to embrace. Women’s Day isn’t just about celebrating ourselves, it’s about empowering each other in small yet meaningful ways. 

\n\n\n\n

Hopefully, we will witness a different picture at our next meetup.

\n\n\n\n

For now, just grateful!

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 29 Apr 2025 10:06:01 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Astha Jain\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:43;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"Do The Woo Community: The Blackout. Off the Grid.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=95357\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:51:\"https://dothewoo.io/blog/the-blackout-off-the-grid/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"A blackout in Portugal.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 29 Apr 2025 08:40:08 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:44;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:95:\"WordCamp Central: Uganda’s Website Projects Competition Returns in 2025 — Bigger and Bolder\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"https://central.wordcamp.org/?p=10406420\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:113:\"https://central.wordcamp.org/news/2025/04/ugandas-website-projects-competition-returns-in-2025-bigger-and-bolder/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8146:\"\"\"\n\n\n\n

KAMPALA — After a groundbreaking debut in 2024 that earned a proud mention at the prestigious State of the Word address, the Uganda Website Projects Competition is set to return for its second edition on Friday, 20th June 2025, at the National ICT Innovation Hub, UICT Nakawa, Kampala.

\n\n\n\n

Organized under the stirring theme, “Problem Solving with WordPress,” the 2025 competition promises to double its impact—expanding from last year’s 10 student projects to an ambitious 20 innovative website showcases.

\n\n\n\n
\n

“In Uganda, the National ICT Innovation Hub hosted a competition where students from elementary to university level built and pitched WordPress projects…. showing how the platform can solve community needs and equip young people with valuable skills, confidence and experience.,”  – Mary Hubbard, Executive Director – WordPress.org, noted during her State of the Word Speech on Dec 16, 2024.

\n
\n\n\n\n
\n\n
Highlights of the Uganda Website Projects Competition during the State of the Word 2024. [Video starting from 41:43 minute mark]\n\n\n\n

\n\n\n\n

What’s New in 2025?

\n\n\n\n

Building on last year’s success, organizers are introducing a third competition category aimed at nurturing even younger digital talent.

\n\n\n\n
    \n
  • Junior Category: Primary school students
  • \n\n\n\n
  • Rising Stars: Secondary school students
  • \n\n\n\n
  • Explorers: Post-secondary students from vocational schools, technical institutes, universities, and colleges
  • \n
\n\n\n\n

By widening the competition’s reach to include a dedicated category for primary schools, the organizers aim to plant seeds of digital literacy and problem-solving even earlier in students’ academic journeys.

\n\n\n\n\"\"Pupils from New Jerusalem Mixed Junior School pitching their project, News Shelf, during the Uganda Website Projects Competition 2024\n\n\n\n

Moreover, the number of project submissions is set to double. Up to 20 teams will be selected to present their WordPress-powered innovations before a panel of expert adjudicators, competing for in-kind and cash prizes.

\n\n\n\n
\n\n
Watch: 9-minute recap of the Uganda Website Projects Competition 2024\n\n\n\n

A Full Day of Learning, Networking, and Celebration

\n\n\n\n

The event is designed not just as a competition but as a holistic learning and networking opportunity. The tentative schedule includes:

\n\n\n\n
    \n
  • Hands-on Beginners Workshops
  • \n\n\n\n
  • Expert Panel Discussions and Q&A sessions
  • \n\n\n\n
  • Project Pitch Presentations across all three categories
  • \n\n\n\n
  • An Awards Ceremony celebrating innovation and ingenuity
  • \n
\n\n\n\n\"\"Hands-on Beginners Workshop in Computer Lab at the National ICT Innovation Hub last year.\n\n\n\n
Tentative Event Schedule
TimeComputer LabAuditorium
08:00-09:30amHands-On Beginners WorkshopDevice Setup and Projection Testing
09:30-10:00amTea Break
10:00-10:30amIntroductions and Keynote Speech
10:30-11:30am Pitch Presentations: Junior category
11:30-12:30pm Pitch Presentations: Rising Stars category
12:30-1:30pm Pitch Presentations: Explorers category
1:30 – 2:30pm Lunch, and Networking
2:30 – 3:30pm Panel Discussion and Q&A session
3:30 – 4:30pm Adjudicator Feedback, Award Ceremony and Closure
\n\n\n\n

Attendees will enjoy a highly subsidized experience, with ticket options as low as $5 (UGX 20,000) — thanks to the generosity of sponsors — and VIP / micro-sponsor tickets available for $26 (UGX 100,000).

\n\n\n\n

Students who submit projects and are selected to present will attend free of charge.

\n\n\n\n\"\"Mr. Abraham Waita from Automattic handing over gift bags to exhibitors during the Uganda Website Projects Competition 2024\n\n\n\n

Call for Participation and Sponsorship

\n\n\n\n

Institutions are encouraged to register their ICT Club students and teachers before the project submission deadline on June 6th, 2025 via the official event website.

\n\n\n\n

Organizers are also calling on the WordPress community and corporate partners to support the event through sponsorships. Sponsorship packages range from Platinum ($2500), Gold ($1300), Silver ($800), and Bronze ($260), to Community Sponsorship ($130) — each offering various visibility opportunities for businesses looking to support and invest in Africa’s growing digital talent.

\n\n\n\n

For ticket registration, visit events.wordpress.org/uganda/2025/competition/tickets.
For sponsorship opportunities or further inquiries, email ugandacompetition@events.wordpress.org or call +256 708 685 472.

\n\n\n\n
\n\n\n\n

Join us in shaping Africa’s digital future — one brilliant idea at a time!
#WebsiteCompetitionUG #WordPress #EdTechInnovation #ProblemSolvingWithWordPress

\n\n\n\n

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 28 Apr 2025 18:02:42 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Mukalele Rogers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:45;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"Do The Woo Community: Building a Community Around Your Podcast and Site\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=95202\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"https://dothewoo.io/blog/building-a-community-around-your-podcast-and-site/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:220:\"BobWP and Birgit Pauli-Haack discuss community building for podcasts, emphasizing platform ownership, authentic storytelling, adaptability, engagement, handling challenges gracefully, and celebrating milestones together.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 28 Apr 2025 10:54:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:46;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"Do The Woo Community: My Head is Spinning with the Next Big “Ship It”\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=95318\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://dothewoo.io/blog/my-head-is-spinning-with-the-next-big-ship-it/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"Morning thoughts buried in something that I cannot share.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 28 Apr 2025 09:06:09 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:47;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:50:\"Do The Woo Community: What Is My Favorite Website?\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=95226\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://dothewoo.io/blog/what-is-my-favorite-website/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:179:\"On a lazy Sunday, I pondered my \"favorite website,\" leading to a rabbit hole of indecision, endless projects, and a strong realization: favorites are just too complicated to pick.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 27 Apr 2025 07:55:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:48;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"Do The Woo Community: Life Without a Computer?\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:43:\"https://dothewoo.io/?post_type=blog&p=95175\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"https://dothewoo.io/blog/life-without-a-computer/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:120:\"Bob reflects on his life before computers, sharing experiences with radio and contemplating a future without technology.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 26 Apr 2025 09:12:49 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:49;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:126:\"Gutenberg Times: WordPress 6.8.1, Tabs and CSS Slider Blocks, Sticky Header, ThemeSwitcherPro and more — Weekend Edition 327\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=40064\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:130:\"https://gutenbergtimes.com/wordpress-6-8-1-tabs-and-css-slider-blocks-sticky-header-themeswitcherpro-and-more-weekend-edition-327/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:20360:\"

Hi there,

\n\n\n\n

With WordPress 6.8 out the door, I start getting deeper into Block themes. What are you working on in the upcoming two months?

\n\n\n\n

Below you find quite a few videos and podcast episodes for your Weekend entertainment. It’s hopefully a great mix, and you find something you are interested in.

\n\n\n\n\n\n

Have a fantastic weekend!

\n\n\n\n

Yours, \"💕\"
Birgit

\n\n\n\n\n\n\n\n

Developing Gutenberg and WordPress

\n\n\n\n

The schedule for WordPress 6.8.1 is out. RC1 is to be ready for testing on April 28, 2025, and the final release two days later on April 30th, 2025. Here are the main issues that will be resolved with this release:

\n\n\n\n\n\n\n\n
\n\n\n\n

In his post Defining Minor Releases for WordPress 6.8.x, Aaron Jorbin, WordPress core committer, outlines recommendations for handling minor releases in WordPress 6.8.x, given the move to a yearly major release schedule. He argues that minor releases should be more risk-averse than majors, especially since everyone gets minor updates automatically and WordPress does not maintain multiple older versions.

\n\n\n\n

Key Points:

\n\n\n\n
    \n
  • No new files in minor releases: Adding new files can break auto-updates for some users and is considered too risky.
  • \n\n\n\n
  • Risk aversion: Keep changes minimal and package sizes small to reduce update failures.
  • \n\n\n\n
  • New features are allowed if they are well-tested and not too large, but major changes (like big redesigns) should be avoided.
  • \n\n\n\n
  • Refactors: Either avoid coding standard refactors or only backport them selectively alongside other necessary changes to avoid unnecessary package bloat.
  • \n\n\n\n
  • Default themes: Focus on improving existing default themes (e.g., adding new patterns) rather than introducing new ones in minor releases.
  • \n
\n\n\n\n

Overall, the emphasis is on stability, minimal risk, and maintaining reliable automatic updates for security and maintenance.

\n\n\n\n
\n

\"🎙\" The latest episode Gutenberg Changelog 117 – WooCommerce Starter Theme and Blocks, WordCamp Europe, and Gutenberg 20.7 and 20.8 I sat down with Ellen Bauer, WooCommerce product lead and discussed what she is working on, WordCamp Europe, Create Block Theme, WP-CLI, Gutenberg 20.7 and Gutenberg 20.8 releases.

\n\n\n\n\"Ellen\n
\n\n\n\n

In this episode of The WordPress Way, Exciting Highlights of WordPress 6.8 Release and Community Impact, I’m thrilled to be joined by my
fellow core contributors, Joe McGill and Abha Thakor, as we celebrate
the arrival of WordPress 6.8. As part of this special release show, we
dive into the latest and greatest features that make this version truly
stand out. From a polished user experience to updates that will benefit
content creators, developers, and extenders alike, I’m excited to share
my thoughts on what’s new and exciting in this latest release.

\n\n\n
\n
\n
\n
\n
\n\n\n

Plugins, Themes, and Tools for #nocode site builders and owners

\n\n\n\n

Wes Theron posted a video explaining How to enhance Navigation with a Sticky Header. In this 4-minute video, he walks you through how to create a sticky header and an optional sticky banner using the WordPress Site Editor with a block theme.

\n\n\n
\n
\n\n
\n
\n\n\n
\n\n\n\n


The Easy Tabs Block plugin arrived from Bangladesh in the WordPress plugin repository. You can use it to build responsive tabbed content in WordPress. “Designed for both beginners and developers, it integrates seamlessly with the Gutenberg editor while keeping your site fast and clutter-free.” says the description.

\n\n\n\n
\n\n\n\n

The Multidots team has recently released a plugin designed to enable site owners and administrators to thoroughly analyze the usage of blocks. This plugin, titled MD Governance, empowers WordPress administrators to adjust the access and settings of Gutenberg blocks according to various user roles. This functionality is particularly beneficial for teams, agencies, or site managers seeking to maintain comprehensive control over the editing process within the block editor.

\n\n\n\n
\n\n\n\n

Jamie Marsland wanted to know: Is the WordPress AI Website Builder Any Good? My Daughter Lily Checks It Out!. You gotta see it! She whipped up the first version of her production company’s website in just 7 1/2 minutes, mostly using what the AI suggested. If you’re curious to give it a shot too, check out the AI builder link again. Just a heads-up, though—you’re not really the target audience; this builder’s really meant for folks who aren’t too familiar with WordPress.

\n\n\n
\n
\n\n
\n
\n\n\n

Currently, there are 1,229 Block Themes in the WordPress Theme Repository. Here are the latest six:

\n\n\n\n
\n\n\n\n\n\"realtimethemes\n
\n\n\n\n\"Screenshot\n\n\n\n

Theme Development for Full Site Editing and Blocks

\n\n\n\n

Pascal Birchler explored on how to build a CSS Carousel Block for WordPress
TL;DR: “it allows for pure CSS-based carousels — no JavaScript required!” Birchler explains that this project aimed to simplify the process of building carousels on the web by introducing a reusable and modular component. The block allows developers to easily create responsive and interactive
carousels with minimal code.

\n\n\n\n

By using a declarative syntax, users can simply define the content and layout they want to display, eliminating the need for complex JavaScript logic. This approach enables faster development and easier maintenance of carousel components across various websites. The code is available on GitHub: /swissspidy/css-carousel-block.

\n\n\n\n
\n\n\n\n

As mentioned by JC Palmes on our 116th Gutenberg Changelog episode, the team at WebDevStudios was working a process and a plugin that allows agencies to iteratively convert client’s old WordPress Classic website into a powerful WordPress Block Editor website over time, stretching out your time and budget investment. Within a short amount of time, clients can start producing Block-based content, while your old Classic setup powers the rest of your website. Over time, the old Classic theme would be retired in favor of the Block-based theme.

\n\n\n\n

The plugin, ThemeSwitcherPro, has just been released and introduced on the new website for this product. Considering the amount of time it will save you and the fantastic additional service you can offer to our clients, $299 a year is well worth it. They offer a 20% discount for the first 100 customers, and a 30-day money-back guarantee. Brad Williams, co-founder of WebDevStudios, also recorded a demo video for you.

\n\n\n\n

 “Keeping up with Gutenberg – Index 2025” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test, and Meta team from Jan. 2024 on. Updated by yours truly. The previous years are also available: 2020 | 2021 | 2022 | 2023 | 2024

\n\n\n\n

Building Blocks and Tools for the Block editor

\n\n\n\n

In his video Custom Domains and HTTPS Support in WordPress Studio, Nick Diego teaches you how to set up a custom domain and enable HTTPS (SSL) support in WordPress Studio for a more realistic, secure development experience.

\n\n\n
\n
\n\n
\n
\n\n\n
\n\n\n\n

In episode 166, Nathan Wrigley discussed with Ryan Welcher on What’s New for Developers. They talked about some of the biggest recent updates to WordPress Core, including the Block Bindings API, Plugin Template Registration API, Preview Options API, and the new Data Views. Welcher breaks down what these new tools are, why they matter, and how they’re making WordPress block development both more powerful and more accessible. “If you’re interested in what’s new in WordPress development, want to understand where the project is heading, or are curious about the real impact of recent changes and features, this episode is for you.” wrote Wrigley.

\n\n\n
\n
\n
\n
\n
\n\n\n
\n\n\n\n

In his livestream, More theme updates for the Block Developer Cookbook site, Ryan Welcher focused on completing the user profile system he has been building over the last few sessions. He dove into some important design changes, tested key functionalities, and troubleshoot live on stream. 

\n\n\n
\n
\n\n
\n
\n\n\n
\n\n\n\n

JuanMa Garrido explored on how to Unit Tests for WordPress blocks. He wrote some unit tests for the copyright block from the “Tutorial: Build your first block”

\n\n\n
\n
\n\n
\n
\n\n\n
\n\n\n\n

Need a plugin .zip from Gutenberg’s master branch?
Gutenberg Times provides daily build for testing and review.

\n\n\n\n

Now also available via WordPress Playground. There is no need for a test site locally or on a server. Have you been using it? Email me with your experience

\n\n\n\n

\"GitHub

\n\n\n\n

Questions? Suggestions? Ideas?
Don’t hesitate to send them via email or
send me a message on WordPress Slack or Twitter @bph.

\n\n\n\n
\n\n\n\n

For questions to be answered on the Gutenberg Changelog,
send them to changelog@gutenbergtimes.com

\n\n\n\n
\n\n\n\n

Featured Image:

\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n

We hate spam, too, and won’t give your email address to anyone
except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 25 Apr 2025 23:45:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:48:\"WpOrg\\Requests\\Utility\\CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:9:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Fri, 16 May 2025 08:38:57 GMT\";s:12:\"content-type\";s:8:\"text/xml\";s:13:\"last-modified\";s:29:\"Fri, 16 May 2025 08:30:28 GMT\";s:4:\"vary\";s:15:\"Accept-Encoding\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:16:\"content-encoding\";s:2:\"br\";s:7:\"alt-svc\";s:19:\"h3=\":443\"; ma=86400\";s:4:\"x-nc\";s:9:\"HIT ord 2\";}}s:5:\"build\";i:1747322142;s:21:\"cache_expiration_time\";i:1747427937;s:23:\"__cache_expiration_time\";i:1747427937;}','off'),(346,'_transient_timeout_dash_v2_88ae138922fe95674369b1cb3d215a2b','1747427937','off'),(347,'_transient_dash_v2_88ae138922fe95674369b1cb3d215a2b','','off'),(348,'_site_transient_timeout_available_translations','1747395574','off'),(349,'_site_transient_available_translations','a:131:{s:2:\"af\";a:8:{s:8:\"language\";s:2:\"af\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-05-13 15:59:22\";s:12:\"english_name\";s:9:\"Afrikaans\";s:11:\"native_name\";s:9:\"Afrikaans\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/5.8-beta/af.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"af\";i:2;s:3:\"afr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Gaan voort\";}}s:2:\"am\";a:8:{s:8:\"language\";s:2:\"am\";s:7:\"version\";s:5:\"6.0.9\";s:7:\"updated\";s:19:\"2022-09-29 20:43:49\";s:12:\"english_name\";s:7:\"Amharic\";s:11:\"native_name\";s:12:\"አማርኛ\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.0.9/am.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"am\";i:2;s:3:\"amh\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"ቀጥል\";}}s:3:\"arg\";a:8:{s:8:\"language\";s:3:\"arg\";s:7:\"version\";s:8:\"6.2-beta\";s:7:\"updated\";s:19:\"2022-09-22 16:46:56\";s:12:\"english_name\";s:9:\"Aragonese\";s:11:\"native_name\";s:9:\"Aragonés\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/6.2-beta/arg.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"an\";i:2;s:3:\"arg\";i:3;s:3:\"arg\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continar\";}}s:2:\"ar\";a:8:{s:8:\"language\";s:2:\"ar\";s:7:\"version\";s:5:\"6.4.5\";s:7:\"updated\";s:19:\"2024-02-13 12:49:38\";s:12:\"english_name\";s:6:\"Arabic\";s:11:\"native_name\";s:14:\"العربية\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.4.5/ar.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ar\";i:2;s:3:\"ara\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"متابعة\";}}s:3:\"ary\";a:8:{s:8:\"language\";s:3:\"ary\";s:7:\"version\";s:6:\"4.8.25\";s:7:\"updated\";s:19:\"2017-01-26 15:42:35\";s:12:\"english_name\";s:15:\"Moroccan Arabic\";s:11:\"native_name\";s:31:\"العربية المغربية\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.8.25/ary.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ar\";i:3;s:3:\"ary\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"المتابعة\";}}s:2:\"as\";a:8:{s:8:\"language\";s:2:\"as\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2024-11-01 09:05:28\";s:12:\"english_name\";s:8:\"Assamese\";s:11:\"native_name\";s:21:\"অসমীয়া\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/as.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"as\";i:2;s:3:\"asm\";i:3;s:3:\"asm\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:3:\"azb\";a:8:{s:8:\"language\";s:3:\"azb\";s:7:\"version\";s:5:\"6.4.5\";s:7:\"updated\";s:19:\"2024-01-19 08:58:31\";s:12:\"english_name\";s:17:\"South Azerbaijani\";s:11:\"native_name\";s:29:\"گؤنئی آذربایجان\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.4.5/azb.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"az\";i:3;s:3:\"azb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"az\";a:8:{s:8:\"language\";s:2:\"az\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-11-06 00:09:27\";s:12:\"english_name\";s:11:\"Azerbaijani\";s:11:\"native_name\";s:16:\"Azərbaycan dili\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/az.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"az\";i:2;s:3:\"aze\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Davam\";}}s:3:\"bel\";a:8:{s:8:\"language\";s:3:\"bel\";s:7:\"version\";s:6:\"4.9.26\";s:7:\"updated\";s:19:\"2024-12-26 00:37:42\";s:12:\"english_name\";s:10:\"Belarusian\";s:11:\"native_name\";s:29:\"Беларуская мова\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.9.26/bel.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"be\";i:2;s:3:\"bel\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Працягнуць\";}}s:5:\"bg_BG\";a:8:{s:8:\"language\";s:5:\"bg_BG\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-07 10:58:34\";s:12:\"english_name\";s:9:\"Bulgarian\";s:11:\"native_name\";s:18:\"Български\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/bg_BG.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bg\";i:2;s:3:\"bul\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Напред\";}}s:5:\"bn_BD\";a:8:{s:8:\"language\";s:5:\"bn_BD\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-02-20 08:42:35\";s:12:\"english_name\";s:20:\"Bengali (Bangladesh)\";s:11:\"native_name\";s:15:\"বাংলা\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/bn_BD.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"bn\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:28:\"চালিয়ে যান\";}}s:2:\"bo\";a:8:{s:8:\"language\";s:2:\"bo\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2020-10-30 03:24:38\";s:12:\"english_name\";s:7:\"Tibetan\";s:11:\"native_name\";s:21:\"བོད་ཡིག\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/5.8-beta/bo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bo\";i:2;s:3:\"tib\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:33:\"མུ་མཐུད་དུ།\";}}s:5:\"bs_BA\";a:8:{s:8:\"language\";s:5:\"bs_BA\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2023-02-22 20:45:53\";s:12:\"english_name\";s:7:\"Bosnian\";s:11:\"native_name\";s:8:\"Bosanski\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.6/bs_BA.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bs\";i:2;s:3:\"bos\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Nastavi\";}}s:2:\"ca\";a:8:{s:8:\"language\";s:2:\"ca\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-11 06:53:20\";s:12:\"english_name\";s:7:\"Catalan\";s:11:\"native_name\";s:7:\"Català\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/ca.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ca\";i:2;s:3:\"cat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continua\";}}s:3:\"ceb\";a:8:{s:8:\"language\";s:3:\"ceb\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-03-02 17:25:51\";s:12:\"english_name\";s:7:\"Cebuano\";s:11:\"native_name\";s:7:\"Cebuano\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/ceb.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"ceb\";i:3;s:3:\"ceb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Padayun\";}}s:5:\"cs_CZ\";a:8:{s:8:\"language\";s:5:\"cs_CZ\";s:7:\"version\";s:5:\"6.7.2\";s:7:\"updated\";s:19:\"2025-05-15 15:31:31\";s:12:\"english_name\";s:5:\"Czech\";s:11:\"native_name\";s:9:\"Čeština\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.7.2/cs_CZ.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"cs\";i:2;s:3:\"ces\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:11:\"Pokračovat\";}}s:2:\"cy\";a:8:{s:8:\"language\";s:2:\"cy\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-29 09:58:15\";s:12:\"english_name\";s:5:\"Welsh\";s:11:\"native_name\";s:7:\"Cymraeg\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/cy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"cy\";i:2;s:3:\"cym\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Parhau\";}}s:5:\"da_DK\";a:8:{s:8:\"language\";s:5:\"da_DK\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-26 01:22:31\";s:12:\"english_name\";s:6:\"Danish\";s:11:\"native_name\";s:5:\"Dansk\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/da_DK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"da\";i:2;s:3:\"dan\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Fortsæt\";}}s:5:\"de_CH\";a:8:{s:8:\"language\";s:5:\"de_CH\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-24 21:44:57\";s:12:\"english_name\";s:20:\"German (Switzerland)\";s:11:\"native_name\";s:17:\"Deutsch (Schweiz)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/de_CH.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:5:\"de_AT\";a:8:{s:8:\"language\";s:5:\"de_AT\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-13 15:13:30\";s:12:\"english_name\";s:16:\"German (Austria)\";s:11:\"native_name\";s:21:\"Deutsch (Österreich)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/de_AT.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:5:\"de_DE\";a:8:{s:8:\"language\";s:5:\"de_DE\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-14 08:27:19\";s:12:\"english_name\";s:6:\"German\";s:11:\"native_name\";s:7:\"Deutsch\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/de_DE.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:12:\"de_DE_formal\";a:8:{s:8:\"language\";s:12:\"de_DE_formal\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-14 08:28:38\";s:12:\"english_name\";s:15:\"German (Formal)\";s:11:\"native_name\";s:13:\"Deutsch (Sie)\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/translation/core/6.8.1/de_DE_formal.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:14:\"de_CH_informal\";a:8:{s:8:\"language\";s:14:\"de_CH_informal\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-24 21:46:51\";s:12:\"english_name\";s:30:\"German (Switzerland, Informal)\";s:11:\"native_name\";s:21:\"Deutsch (Schweiz, Du)\";s:7:\"package\";s:73:\"https://downloads.wordpress.org/translation/core/6.8.1/de_CH_informal.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:3:\"dsb\";a:8:{s:8:\"language\";s:3:\"dsb\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2022-07-16 12:13:09\";s:12:\"english_name\";s:13:\"Lower Sorbian\";s:11:\"native_name\";s:16:\"Dolnoserbšćina\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.2.6/dsb.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"dsb\";i:3;s:3:\"dsb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Dalej\";}}s:3:\"dzo\";a:8:{s:8:\"language\";s:3:\"dzo\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-06-29 08:59:03\";s:12:\"english_name\";s:8:\"Dzongkha\";s:11:\"native_name\";s:18:\"རྫོང་ཁ\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/dzo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"dz\";i:2;s:3:\"dzo\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"el\";a:8:{s:8:\"language\";s:2:\"el\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-09 06:59:42\";s:12:\"english_name\";s:5:\"Greek\";s:11:\"native_name\";s:16:\"Ελληνικά\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/el.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"el\";i:2;s:3:\"ell\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"Συνέχεια\";}}s:5:\"en_ZA\";a:8:{s:8:\"language\";s:5:\"en_ZA\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2024-11-08 19:43:34\";s:12:\"english_name\";s:22:\"English (South Africa)\";s:11:\"native_name\";s:22:\"English (South Africa)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/en_ZA.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_GB\";a:8:{s:8:\"language\";s:5:\"en_GB\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-06 12:48:35\";s:12:\"english_name\";s:12:\"English (UK)\";s:11:\"native_name\";s:12:\"English (UK)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/en_GB.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_AU\";a:8:{s:8:\"language\";s:5:\"en_AU\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-14 11:49:06\";s:12:\"english_name\";s:19:\"English (Australia)\";s:11:\"native_name\";s:19:\"English (Australia)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/en_AU.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_NZ\";a:8:{s:8:\"language\";s:5:\"en_NZ\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-15 03:51:37\";s:12:\"english_name\";s:21:\"English (New Zealand)\";s:11:\"native_name\";s:21:\"English (New Zealand)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/en_NZ.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_CA\";a:8:{s:8:\"language\";s:5:\"en_CA\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-03-25 15:37:15\";s:12:\"english_name\";s:16:\"English (Canada)\";s:11:\"native_name\";s:16:\"English (Canada)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/en_CA.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"eo\";a:8:{s:8:\"language\";s:2:\"eo\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-24 08:06:50\";s:12:\"english_name\";s:9:\"Esperanto\";s:11:\"native_name\";s:9:\"Esperanto\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/eo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"eo\";i:2;s:3:\"epo\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Daŭrigi\";}}s:5:\"es_CR\";a:8:{s:8:\"language\";s:5:\"es_CR\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2024-12-09 22:28:42\";s:12:\"english_name\";s:20:\"Spanish (Costa Rica)\";s:11:\"native_name\";s:22:\"Español de Costa Rica\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/es_CR.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_PE\";a:8:{s:8:\"language\";s:5:\"es_PE\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2024-10-16 21:04:12\";s:12:\"english_name\";s:14:\"Spanish (Peru)\";s:11:\"native_name\";s:17:\"Español de Perú\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/es_PE.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_CL\";a:8:{s:8:\"language\";s:5:\"es_CL\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-06 18:22:17\";s:12:\"english_name\";s:15:\"Spanish (Chile)\";s:11:\"native_name\";s:17:\"Español de Chile\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/es_CL.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_VE\";a:8:{s:8:\"language\";s:5:\"es_VE\";s:7:\"version\";s:5:\"6.4.5\";s:7:\"updated\";s:19:\"2023-10-16 16:00:04\";s:12:\"english_name\";s:19:\"Spanish (Venezuela)\";s:11:\"native_name\";s:21:\"Español de Venezuela\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.4.5/es_VE.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_EC\";a:8:{s:8:\"language\";s:5:\"es_EC\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2023-04-21 13:32:10\";s:12:\"english_name\";s:17:\"Spanish (Ecuador)\";s:11:\"native_name\";s:19:\"Español de Ecuador\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.6/es_EC.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_DO\";a:8:{s:8:\"language\";s:5:\"es_DO\";s:7:\"version\";s:6:\"5.8.10\";s:7:\"updated\";s:19:\"2021-10-08 14:32:50\";s:12:\"english_name\";s:28:\"Spanish (Dominican Republic)\";s:11:\"native_name\";s:33:\"Español de República Dominicana\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.8.10/es_DO.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_UY\";a:8:{s:8:\"language\";s:5:\"es_UY\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-03-31 18:33:26\";s:12:\"english_name\";s:17:\"Spanish (Uruguay)\";s:11:\"native_name\";s:19:\"Español de Uruguay\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/translation/core/5.8-beta/es_UY.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_PR\";a:8:{s:8:\"language\";s:5:\"es_PR\";s:7:\"version\";s:6:\"5.4.16\";s:7:\"updated\";s:19:\"2020-04-29 15:36:59\";s:12:\"english_name\";s:21:\"Spanish (Puerto Rico)\";s:11:\"native_name\";s:23:\"Español de Puerto Rico\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.4.16/es_PR.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_GT\";a:8:{s:8:\"language\";s:5:\"es_GT\";s:7:\"version\";s:6:\"5.2.21\";s:7:\"updated\";s:19:\"2019-03-02 06:35:01\";s:12:\"english_name\";s:19:\"Spanish (Guatemala)\";s:11:\"native_name\";s:21:\"Español de Guatemala\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.2.21/es_GT.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_MX\";a:8:{s:8:\"language\";s:5:\"es_MX\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-25 19:15:22\";s:12:\"english_name\";s:16:\"Spanish (Mexico)\";s:11:\"native_name\";s:19:\"Español de México\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/es_MX.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_AR\";a:8:{s:8:\"language\";s:5:\"es_AR\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-24 23:50:28\";s:12:\"english_name\";s:19:\"Spanish (Argentina)\";s:11:\"native_name\";s:21:\"Español de Argentina\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/es_AR.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_CO\";a:8:{s:8:\"language\";s:5:\"es_CO\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-29 19:32:31\";s:12:\"english_name\";s:18:\"Spanish (Colombia)\";s:11:\"native_name\";s:20:\"Español de Colombia\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/es_CO.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_ES\";a:8:{s:8:\"language\";s:5:\"es_ES\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-30 16:22:26\";s:12:\"english_name\";s:15:\"Spanish (Spain)\";s:11:\"native_name\";s:8:\"Español\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/es_ES.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:2:\"et\";a:8:{s:8:\"language\";s:2:\"et\";s:7:\"version\";s:5:\"6.5.5\";s:7:\"updated\";s:19:\"2024-06-06 09:50:37\";s:12:\"english_name\";s:8:\"Estonian\";s:11:\"native_name\";s:5:\"Eesti\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.5.5/et.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"et\";i:2;s:3:\"est\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Jätka\";}}s:2:\"eu\";a:8:{s:8:\"language\";s:2:\"eu\";s:7:\"version\";s:5:\"6.7.2\";s:7:\"updated\";s:19:\"2025-02-26 16:06:47\";s:12:\"english_name\";s:6:\"Basque\";s:11:\"native_name\";s:7:\"Euskara\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.7.2/eu.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"eu\";i:2;s:3:\"eus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Jarraitu\";}}s:5:\"fa_AF\";a:8:{s:8:\"language\";s:5:\"fa_AF\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-02-14 17:29:08\";s:12:\"english_name\";s:21:\"Persian (Afghanistan)\";s:11:\"native_name\";s:31:\"(فارسی (افغانستان\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/fa_AF.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fa\";i:2;s:3:\"fas\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"ادامه\";}}s:5:\"fa_IR\";a:8:{s:8:\"language\";s:5:\"fa_IR\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-15 07:29:26\";s:12:\"english_name\";s:7:\"Persian\";s:11:\"native_name\";s:10:\"فارسی\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/fa_IR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fa\";i:2;s:3:\"fas\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"ادامه\";}}s:2:\"fi\";a:8:{s:8:\"language\";s:2:\"fi\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-12 09:41:09\";s:12:\"english_name\";s:7:\"Finnish\";s:11:\"native_name\";s:5:\"Suomi\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/fi.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fi\";i:2;s:3:\"fin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Jatka\";}}s:5:\"fr_CA\";a:8:{s:8:\"language\";s:5:\"fr_CA\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-29 15:18:18\";s:12:\"english_name\";s:15:\"French (Canada)\";s:11:\"native_name\";s:19:\"Français du Canada\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/fr_CA.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fr\";i:2;s:3:\"fra\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:5:\"fr_FR\";a:8:{s:8:\"language\";s:5:\"fr_FR\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-06 13:34:01\";s:12:\"english_name\";s:15:\"French (France)\";s:11:\"native_name\";s:9:\"Français\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/fr_FR.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"fr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:5:\"fr_BE\";a:8:{s:8:\"language\";s:5:\"fr_BE\";s:7:\"version\";s:5:\"6.5.5\";s:7:\"updated\";s:19:\"2024-02-01 23:56:53\";s:12:\"english_name\";s:16:\"French (Belgium)\";s:11:\"native_name\";s:21:\"Français de Belgique\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.5.5/fr_BE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fr\";i:2;s:3:\"fra\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:3:\"fur\";a:8:{s:8:\"language\";s:3:\"fur\";s:7:\"version\";s:6:\"4.8.25\";s:7:\"updated\";s:19:\"2023-04-30 13:56:46\";s:12:\"english_name\";s:8:\"Friulian\";s:11:\"native_name\";s:8:\"Friulian\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.8.25/fur.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"fur\";i:3;s:3:\"fur\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"fy\";a:8:{s:8:\"language\";s:2:\"fy\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2022-12-25 12:53:23\";s:12:\"english_name\";s:7:\"Frisian\";s:11:\"native_name\";s:5:\"Frysk\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.2.6/fy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fy\";i:2;s:3:\"fry\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Trochgean\";}}s:2:\"gd\";a:8:{s:8:\"language\";s:2:\"gd\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-08-23 17:41:37\";s:12:\"english_name\";s:15:\"Scottish Gaelic\";s:11:\"native_name\";s:9:\"Gàidhlig\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/gd.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"gd\";i:2;s:3:\"gla\";i:3;s:3:\"gla\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"Lean air adhart\";}}s:5:\"gl_ES\";a:8:{s:8:\"language\";s:5:\"gl_ES\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-30 04:41:14\";s:12:\"english_name\";s:8:\"Galician\";s:11:\"native_name\";s:6:\"Galego\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/gl_ES.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"gl\";i:2;s:3:\"glg\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:2:\"gu\";a:8:{s:8:\"language\";s:2:\"gu\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-26 05:46:56\";s:12:\"english_name\";s:8:\"Gujarati\";s:11:\"native_name\";s:21:\"ગુજરાતી\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/gu.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"gu\";i:2;s:3:\"guj\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"ચાલુ રાખો\";}}s:3:\"haz\";a:8:{s:8:\"language\";s:3:\"haz\";s:7:\"version\";s:6:\"4.4.33\";s:7:\"updated\";s:19:\"2015-12-05 00:59:09\";s:12:\"english_name\";s:8:\"Hazaragi\";s:11:\"native_name\";s:15:\"هزاره گی\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.4.33/haz.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"haz\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"ادامه\";}}s:5:\"he_IL\";a:8:{s:8:\"language\";s:5:\"he_IL\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2024-05-04 18:39:24\";s:12:\"english_name\";s:6:\"Hebrew\";s:11:\"native_name\";s:16:\"עִבְרִית\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.6/he_IL.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"he\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"המשך\";}}s:5:\"hi_IN\";a:8:{s:8:\"language\";s:5:\"hi_IN\";s:7:\"version\";s:5:\"6.4.5\";s:7:\"updated\";s:19:\"2025-02-06 05:17:11\";s:12:\"english_name\";s:5:\"Hindi\";s:11:\"native_name\";s:18:\"हिन्दी\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.4.5/hi_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hi\";i:2;s:3:\"hin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"जारी रखें\";}}s:2:\"hr\";a:8:{s:8:\"language\";s:2:\"hr\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-01 00:45:13\";s:12:\"english_name\";s:8:\"Croatian\";s:11:\"native_name\";s:8:\"Hrvatski\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/hr.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hr\";i:2;s:3:\"hrv\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Nastavi\";}}s:3:\"hsb\";a:8:{s:8:\"language\";s:3:\"hsb\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2023-02-22 17:37:32\";s:12:\"english_name\";s:13:\"Upper Sorbian\";s:11:\"native_name\";s:17:\"Hornjoserbšćina\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.2.6/hsb.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"hsb\";i:3;s:3:\"hsb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:4:\"Dale\";}}s:5:\"hu_HU\";a:8:{s:8:\"language\";s:5:\"hu_HU\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-07 19:33:01\";s:12:\"english_name\";s:9:\"Hungarian\";s:11:\"native_name\";s:6:\"Magyar\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/hu_HU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hu\";i:2;s:3:\"hun\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Folytatás\";}}s:2:\"hy\";a:8:{s:8:\"language\";s:2:\"hy\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-12-03 16:21:10\";s:12:\"english_name\";s:8:\"Armenian\";s:11:\"native_name\";s:14:\"Հայերեն\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/hy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hy\";i:2;s:3:\"hye\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Շարունակել\";}}s:5:\"id_ID\";a:8:{s:8:\"language\";s:5:\"id_ID\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-16 00:22:55\";s:12:\"english_name\";s:10:\"Indonesian\";s:11:\"native_name\";s:16:\"Bahasa Indonesia\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/id_ID.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"id\";i:2;s:3:\"ind\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Lanjutkan\";}}s:5:\"is_IS\";a:8:{s:8:\"language\";s:5:\"is_IS\";s:7:\"version\";s:6:\"4.9.26\";s:7:\"updated\";s:19:\"2018-12-11 10:40:02\";s:12:\"english_name\";s:9:\"Icelandic\";s:11:\"native_name\";s:9:\"Íslenska\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.9.26/is_IS.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"is\";i:2;s:3:\"isl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Áfram\";}}s:5:\"it_IT\";a:8:{s:8:\"language\";s:5:\"it_IT\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-30 18:01:46\";s:12:\"english_name\";s:7:\"Italian\";s:11:\"native_name\";s:8:\"Italiano\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/it_IT.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"it\";i:2;s:3:\"ita\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continua\";}}s:2:\"ja\";a:8:{s:8:\"language\";s:2:\"ja\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-07 12:33:24\";s:12:\"english_name\";s:8:\"Japanese\";s:11:\"native_name\";s:9:\"日本語\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/ja.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"ja\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"次へ\";}}s:5:\"jv_ID\";a:8:{s:8:\"language\";s:5:\"jv_ID\";s:7:\"version\";s:6:\"4.9.26\";s:7:\"updated\";s:19:\"2019-02-16 23:58:56\";s:12:\"english_name\";s:8:\"Javanese\";s:11:\"native_name\";s:9:\"Basa Jawa\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.9.26/jv_ID.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"jv\";i:2;s:3:\"jav\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Nerusaké\";}}s:5:\"ka_GE\";a:8:{s:8:\"language\";s:5:\"ka_GE\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-14 08:02:58\";s:12:\"english_name\";s:8:\"Georgian\";s:11:\"native_name\";s:21:\"ქართული\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/ka_GE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ka\";i:2;s:3:\"kat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"გაგრძელება\";}}s:3:\"kab\";a:8:{s:8:\"language\";s:3:\"kab\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2023-07-05 11:40:39\";s:12:\"english_name\";s:6:\"Kabyle\";s:11:\"native_name\";s:9:\"Taqbaylit\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.2.6/kab.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"kab\";i:3;s:3:\"kab\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Kemmel\";}}s:2:\"kk\";a:8:{s:8:\"language\";s:2:\"kk\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2024-07-18 02:49:24\";s:12:\"english_name\";s:6:\"Kazakh\";s:11:\"native_name\";s:19:\"Қазақ тілі\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/kk.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"kk\";i:2;s:3:\"kaz\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Жалғастыру\";}}s:2:\"km\";a:8:{s:8:\"language\";s:2:\"km\";s:7:\"version\";s:6:\"5.2.21\";s:7:\"updated\";s:19:\"2019-06-10 16:18:28\";s:12:\"english_name\";s:5:\"Khmer\";s:11:\"native_name\";s:27:\"ភាសាខ្មែរ\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/5.2.21/km.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"km\";i:2;s:3:\"khm\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"បន្ត\";}}s:2:\"kn\";a:8:{s:8:\"language\";s:2:\"kn\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-01 18:55:24\";s:12:\"english_name\";s:7:\"Kannada\";s:11:\"native_name\";s:15:\"ಕನ್ನಡ\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/kn.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"kn\";i:2;s:3:\"kan\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"ಮುಂದುವರಿಸು\";}}s:5:\"ko_KR\";a:8:{s:8:\"language\";s:5:\"ko_KR\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-28 12:54:20\";s:12:\"english_name\";s:6:\"Korean\";s:11:\"native_name\";s:9:\"한국어\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/ko_KR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ko\";i:2;s:3:\"kor\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"계속\";}}s:3:\"ckb\";a:8:{s:8:\"language\";s:3:\"ckb\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-04 22:29:00\";s:12:\"english_name\";s:16:\"Kurdish (Sorani)\";s:11:\"native_name\";s:13:\"كوردی‎\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.8.1/ckb.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ku\";i:3;s:3:\"ckb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"به‌رده‌وام به‌\";}}s:3:\"kir\";a:8:{s:8:\"language\";s:3:\"kir\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-10 04:36:27\";s:12:\"english_name\";s:6:\"Kyrgyz\";s:11:\"native_name\";s:16:\"Кыргызча\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.8.1/kir.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"ky\";i:2;s:3:\"kir\";i:3;s:3:\"kir\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:14:\"Улантуу\";}}s:2:\"lo\";a:8:{s:8:\"language\";s:2:\"lo\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-11-12 09:59:23\";s:12:\"english_name\";s:3:\"Lao\";s:11:\"native_name\";s:21:\"ພາສາລາວ\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/lo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lo\";i:2;s:3:\"lao\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:18:\"ຕໍ່​ໄປ\";}}s:5:\"lt_LT\";a:8:{s:8:\"language\";s:5:\"lt_LT\";s:7:\"version\";s:5:\"6.5.5\";s:7:\"updated\";s:19:\"2024-06-13 13:11:03\";s:12:\"english_name\";s:10:\"Lithuanian\";s:11:\"native_name\";s:15:\"Lietuvių kalba\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.5.5/lt_LT.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lt\";i:2;s:3:\"lit\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Tęsti\";}}s:2:\"lv\";a:8:{s:8:\"language\";s:2:\"lv\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-15 10:27:12\";s:12:\"english_name\";s:7:\"Latvian\";s:11:\"native_name\";s:16:\"Latviešu valoda\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/lv.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lv\";i:2;s:3:\"lav\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Turpināt\";}}s:5:\"mk_MK\";a:8:{s:8:\"language\";s:5:\"mk_MK\";s:7:\"version\";s:5:\"6.0.9\";s:7:\"updated\";s:19:\"2022-10-01 09:23:52\";s:12:\"english_name\";s:10:\"Macedonian\";s:11:\"native_name\";s:31:\"Македонски јазик\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.0.9/mk_MK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mk\";i:2;s:3:\"mkd\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"Продолжи\";}}s:5:\"ml_IN\";a:8:{s:8:\"language\";s:5:\"ml_IN\";s:7:\"version\";s:5:\"6.7.2\";s:7:\"updated\";s:19:\"2025-03-20 16:41:38\";s:12:\"english_name\";s:9:\"Malayalam\";s:11:\"native_name\";s:18:\"മലയാളം\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.7.2/ml_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ml\";i:2;s:3:\"mal\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:18:\"തുടരുക\";}}s:2:\"mn\";a:8:{s:8:\"language\";s:2:\"mn\";s:7:\"version\";s:5:\"6.5.5\";s:7:\"updated\";s:19:\"2024-06-20 17:22:06\";s:12:\"english_name\";s:9:\"Mongolian\";s:11:\"native_name\";s:12:\"Монгол\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.5.5/mn.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mn\";i:2;s:3:\"mon\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"mr\";a:8:{s:8:\"language\";s:2:\"mr\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-29 06:00:20\";s:12:\"english_name\";s:7:\"Marathi\";s:11:\"native_name\";s:15:\"मराठी\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/mr.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mr\";i:2;s:3:\"mar\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"सुरु ठेवा\";}}s:5:\"ms_MY\";a:8:{s:8:\"language\";s:5:\"ms_MY\";s:7:\"version\";s:6:\"5.5.15\";s:7:\"updated\";s:19:\"2022-03-11 13:52:22\";s:12:\"english_name\";s:5:\"Malay\";s:11:\"native_name\";s:13:\"Bahasa Melayu\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.5.15/ms_MY.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ms\";i:2;s:3:\"msa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Teruskan\";}}s:5:\"my_MM\";a:8:{s:8:\"language\";s:5:\"my_MM\";s:7:\"version\";s:6:\"4.2.38\";s:7:\"updated\";s:19:\"2017-12-26 11:57:10\";s:12:\"english_name\";s:17:\"Myanmar (Burmese)\";s:11:\"native_name\";s:15:\"ဗမာစာ\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.2.38/my_MM.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"my\";i:2;s:3:\"mya\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:54:\"ဆက်လက်လုပ်ဆောင်ပါ။\";}}s:5:\"nb_NO\";a:8:{s:8:\"language\";s:5:\"nb_NO\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-26 11:36:51\";s:12:\"english_name\";s:19:\"Norwegian (Bokmål)\";s:11:\"native_name\";s:13:\"Norsk bokmål\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/nb_NO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nb\";i:2;s:3:\"nob\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Fortsett\";}}s:5:\"ne_NP\";a:8:{s:8:\"language\";s:5:\"ne_NP\";s:7:\"version\";s:5:\"6.6.2\";s:7:\"updated\";s:19:\"2024-08-30 11:32:23\";s:12:\"english_name\";s:6:\"Nepali\";s:11:\"native_name\";s:18:\"नेपाली\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.6.2/ne_NP.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ne\";i:2;s:3:\"nep\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:43:\"जारी राख्नुहोस्\";}}s:5:\"nl_BE\";a:8:{s:8:\"language\";s:5:\"nl_BE\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-28 07:17:17\";s:12:\"english_name\";s:15:\"Dutch (Belgium)\";s:11:\"native_name\";s:20:\"Nederlands (België)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/nl_BE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:5:\"nl_NL\";a:8:{s:8:\"language\";s:5:\"nl_NL\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-13 18:37:02\";s:12:\"english_name\";s:5:\"Dutch\";s:11:\"native_name\";s:10:\"Nederlands\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/nl_NL.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:12:\"nl_NL_formal\";a:8:{s:8:\"language\";s:12:\"nl_NL_formal\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-27 20:02:13\";s:12:\"english_name\";s:14:\"Dutch (Formal)\";s:11:\"native_name\";s:20:\"Nederlands (Formeel)\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/translation/core/6.8.1/nl_NL_formal.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:5:\"nn_NO\";a:8:{s:8:\"language\";s:5:\"nn_NO\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-03-18 10:59:16\";s:12:\"english_name\";s:19:\"Norwegian (Nynorsk)\";s:11:\"native_name\";s:13:\"Norsk nynorsk\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/translation/core/5.8-beta/nn_NO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nn\";i:2;s:3:\"nno\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Hald fram\";}}s:3:\"oci\";a:8:{s:8:\"language\";s:3:\"oci\";s:7:\"version\";s:6:\"4.8.25\";s:7:\"updated\";s:19:\"2017-08-25 10:03:08\";s:12:\"english_name\";s:7:\"Occitan\";s:11:\"native_name\";s:7:\"Occitan\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.8.25/oci.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"oc\";i:2;s:3:\"oci\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Contunhar\";}}s:5:\"pa_IN\";a:8:{s:8:\"language\";s:5:\"pa_IN\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-16 05:19:43\";s:12:\"english_name\";s:15:\"Panjabi (India)\";s:11:\"native_name\";s:18:\"ਪੰਜਾਬੀ\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/pa_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pa\";i:2;s:3:\"pan\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"ਜਾਰੀ ਰੱਖੋ\";}}s:5:\"pl_PL\";a:8:{s:8:\"language\";s:5:\"pl_PL\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-08 10:26:43\";s:12:\"english_name\";s:6:\"Polish\";s:11:\"native_name\";s:6:\"Polski\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/pl_PL.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pl\";i:2;s:3:\"pol\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Kontynuuj\";}}s:2:\"ps\";a:8:{s:8:\"language\";s:2:\"ps\";s:7:\"version\";s:6:\"4.3.34\";s:7:\"updated\";s:19:\"2015-12-02 21:41:29\";s:12:\"english_name\";s:6:\"Pashto\";s:11:\"native_name\";s:8:\"پښتو\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.3.34/ps.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ps\";i:2;s:3:\"pus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:19:\"دوام ورکړه\";}}s:5:\"pt_PT\";a:8:{s:8:\"language\";s:5:\"pt_PT\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-02 11:51:48\";s:12:\"english_name\";s:21:\"Portuguese (Portugal)\";s:11:\"native_name\";s:10:\"Português\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/pt_PT.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"pt\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:10:\"pt_PT_ao90\";a:8:{s:8:\"language\";s:10:\"pt_PT_ao90\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-02 11:55:29\";s:12:\"english_name\";s:27:\"Portuguese (Portugal, AO90)\";s:11:\"native_name\";s:17:\"Português (AO90)\";s:7:\"package\";s:69:\"https://downloads.wordpress.org/translation/core/6.8.1/pt_PT_ao90.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"pt\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"pt_BR\";a:8:{s:8:\"language\";s:5:\"pt_BR\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-05 11:53:58\";s:12:\"english_name\";s:19:\"Portuguese (Brazil)\";s:11:\"native_name\";s:20:\"Português do Brasil\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/pt_BR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pt\";i:2;s:3:\"por\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"pt_AO\";a:8:{s:8:\"language\";s:5:\"pt_AO\";s:7:\"version\";s:5:\"6.4.5\";s:7:\"updated\";s:19:\"2023-08-21 12:15:00\";s:12:\"english_name\";s:19:\"Portuguese (Angola)\";s:11:\"native_name\";s:20:\"Português de Angola\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.4.5/pt_AO.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"pt\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:3:\"rhg\";a:8:{s:8:\"language\";s:3:\"rhg\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-03-16 13:03:18\";s:12:\"english_name\";s:8:\"Rohingya\";s:11:\"native_name\";s:8:\"Ruáinga\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/rhg.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"rhg\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"ro_RO\";a:8:{s:8:\"language\";s:5:\"ro_RO\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-26 07:20:36\";s:12:\"english_name\";s:8:\"Romanian\";s:11:\"native_name\";s:8:\"Română\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/ro_RO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ro\";i:2;s:3:\"ron\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuă\";}}s:5:\"ru_RU\";a:8:{s:8:\"language\";s:5:\"ru_RU\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-12 10:49:08\";s:12:\"english_name\";s:7:\"Russian\";s:11:\"native_name\";s:14:\"Русский\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/ru_RU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ru\";i:2;s:3:\"rus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Продолжить\";}}s:3:\"sah\";a:8:{s:8:\"language\";s:3:\"sah\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-21 02:06:41\";s:12:\"english_name\";s:5:\"Sakha\";s:11:\"native_name\";s:14:\"Сахалыы\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/sah.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"sah\";i:3;s:3:\"sah\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Салҕаа\";}}s:3:\"snd\";a:8:{s:8:\"language\";s:3:\"snd\";s:7:\"version\";s:6:\"5.4.16\";s:7:\"updated\";s:19:\"2020-07-07 01:53:37\";s:12:\"english_name\";s:6:\"Sindhi\";s:11:\"native_name\";s:8:\"سنڌي\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/5.4.16/snd.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"sd\";i:2;s:3:\"snd\";i:3;s:3:\"snd\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"اڳتي هلو\";}}s:5:\"si_LK\";a:8:{s:8:\"language\";s:5:\"si_LK\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-11-12 06:00:52\";s:12:\"english_name\";s:7:\"Sinhala\";s:11:\"native_name\";s:15:\"සිංහල\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/si_LK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"si\";i:2;s:3:\"sin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:44:\"දිගටම කරගෙන යන්න\";}}s:5:\"sk_SK\";a:8:{s:8:\"language\";s:5:\"sk_SK\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-16 03:16:13\";s:12:\"english_name\";s:6:\"Slovak\";s:11:\"native_name\";s:11:\"Slovenčina\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/sk_SK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sk\";i:2;s:3:\"slk\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Pokračovať\";}}s:3:\"skr\";a:8:{s:8:\"language\";s:3:\"skr\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-24 16:58:02\";s:12:\"english_name\";s:7:\"Saraiki\";s:11:\"native_name\";s:14:\"سرائیکی\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.8.1/skr.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"skr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:17:\"جاری رکھو\";}}s:5:\"sl_SI\";a:8:{s:8:\"language\";s:5:\"sl_SI\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2024-08-30 07:14:35\";s:12:\"english_name\";s:9:\"Slovenian\";s:11:\"native_name\";s:13:\"Slovenščina\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/sl_SI.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sl\";i:2;s:3:\"slv\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Nadaljuj\";}}s:2:\"sq\";a:8:{s:8:\"language\";s:2:\"sq\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-18 09:38:51\";s:12:\"english_name\";s:8:\"Albanian\";s:11:\"native_name\";s:5:\"Shqip\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/sq.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sq\";i:2;s:3:\"sqi\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Vazhdo\";}}s:5:\"sr_RS\";a:8:{s:8:\"language\";s:5:\"sr_RS\";s:7:\"version\";s:5:\"6.7.2\";s:7:\"updated\";s:19:\"2024-09-20 22:15:56\";s:12:\"english_name\";s:7:\"Serbian\";s:11:\"native_name\";s:23:\"Српски језик\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.7.2/sr_RS.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sr\";i:2;s:3:\"srp\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:14:\"Настави\";}}s:5:\"sv_SE\";a:8:{s:8:\"language\";s:5:\"sv_SE\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-25 20:25:55\";s:12:\"english_name\";s:7:\"Swedish\";s:11:\"native_name\";s:7:\"Svenska\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/sv_SE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sv\";i:2;s:3:\"swe\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Fortsätt\";}}s:2:\"sw\";a:8:{s:8:\"language\";s:2:\"sw\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-03 07:52:09\";s:12:\"english_name\";s:7:\"Swahili\";s:11:\"native_name\";s:9:\"Kiswahili\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/sw.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sw\";i:2;s:3:\"swa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Endelea\";}}s:3:\"szl\";a:8:{s:8:\"language\";s:3:\"szl\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-09-24 19:58:14\";s:12:\"english_name\";s:8:\"Silesian\";s:11:\"native_name\";s:17:\"Ślōnskŏ gŏdka\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/szl.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"szl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:13:\"Kōntynuować\";}}s:5:\"ta_IN\";a:8:{s:8:\"language\";s:5:\"ta_IN\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-27 03:22:47\";s:12:\"english_name\";s:5:\"Tamil\";s:11:\"native_name\";s:15:\"தமிழ்\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/ta_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ta\";i:2;s:3:\"tam\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:24:\"தொடரவும்\";}}s:5:\"ta_LK\";a:8:{s:8:\"language\";s:5:\"ta_LK\";s:7:\"version\";s:6:\"4.2.38\";s:7:\"updated\";s:19:\"2015-12-03 01:07:44\";s:12:\"english_name\";s:17:\"Tamil (Sri Lanka)\";s:11:\"native_name\";s:15:\"தமிழ்\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.2.38/ta_LK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ta\";i:2;s:3:\"tam\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:18:\"தொடர்க\";}}s:2:\"te\";a:8:{s:8:\"language\";s:2:\"te\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-26 15:47:39\";s:12:\"english_name\";s:6:\"Telugu\";s:11:\"native_name\";s:18:\"తెలుగు\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/te.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"te\";i:2;s:3:\"tel\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"కొనసాగించు\";}}s:2:\"th\";a:8:{s:8:\"language\";s:2:\"th\";s:7:\"version\";s:6:\"5.8.10\";s:7:\"updated\";s:19:\"2022-06-08 04:30:30\";s:12:\"english_name\";s:4:\"Thai\";s:11:\"native_name\";s:9:\"ไทย\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/5.8.10/th.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"th\";i:2;s:3:\"tha\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"ต่อไป\";}}s:2:\"tl\";a:8:{s:8:\"language\";s:2:\"tl\";s:7:\"version\";s:6:\"4.8.25\";s:7:\"updated\";s:19:\"2017-09-30 09:04:29\";s:12:\"english_name\";s:7:\"Tagalog\";s:11:\"native_name\";s:7:\"Tagalog\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.8.25/tl.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tl\";i:2;s:3:\"tgl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Magpatuloy\";}}s:5:\"tr_TR\";a:8:{s:8:\"language\";s:5:\"tr_TR\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-16 23:11:08\";s:12:\"english_name\";s:7:\"Turkish\";s:11:\"native_name\";s:8:\"Türkçe\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/tr_TR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tr\";i:2;s:3:\"tur\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Devam\";}}s:5:\"tt_RU\";a:8:{s:8:\"language\";s:5:\"tt_RU\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-11-20 20:20:50\";s:12:\"english_name\";s:5:\"Tatar\";s:11:\"native_name\";s:19:\"Татар теле\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/tt_RU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tt\";i:2;s:3:\"tat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:17:\"дәвам итү\";}}s:3:\"tah\";a:8:{s:8:\"language\";s:3:\"tah\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-03-06 18:39:39\";s:12:\"english_name\";s:8:\"Tahitian\";s:11:\"native_name\";s:10:\"Reo Tahiti\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/tah.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"ty\";i:2;s:3:\"tah\";i:3;s:3:\"tah\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"ug_CN\";a:8:{s:8:\"language\";s:5:\"ug_CN\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-12 20:43:45\";s:12:\"english_name\";s:6:\"Uighur\";s:11:\"native_name\";s:16:\"ئۇيغۇرچە\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/ug_CN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ug\";i:2;s:3:\"uig\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:26:\"داۋاملاشتۇرۇش\";}}s:2:\"uk\";a:8:{s:8:\"language\";s:2:\"uk\";s:7:\"version\";s:3:\"6.8\";s:7:\"updated\";s:19:\"2025-04-18 21:10:00\";s:12:\"english_name\";s:9:\"Ukrainian\";s:11:\"native_name\";s:20:\"Українська\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/6.8/uk.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"uk\";i:2;s:3:\"ukr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Продовжити\";}}s:2:\"ur\";a:8:{s:8:\"language\";s:2:\"ur\";s:7:\"version\";s:6:\"5.4.16\";s:7:\"updated\";s:19:\"2020-04-09 11:17:33\";s:12:\"english_name\";s:4:\"Urdu\";s:11:\"native_name\";s:8:\"اردو\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/5.4.16/ur.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ur\";i:2;s:3:\"urd\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:19:\"جاری رکھیں\";}}s:5:\"uz_UZ\";a:8:{s:8:\"language\";s:5:\"uz_UZ\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-02-28 12:02:22\";s:12:\"english_name\";s:5:\"Uzbek\";s:11:\"native_name\";s:11:\"O‘zbekcha\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/translation/core/5.8-beta/uz_UZ.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"uz\";i:2;s:3:\"uzb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:11:\"Davom etish\";}}s:2:\"vi\";a:8:{s:8:\"language\";s:2:\"vi\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-29 12:00:43\";s:12:\"english_name\";s:10:\"Vietnamese\";s:11:\"native_name\";s:14:\"Tiếng Việt\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.8.1/vi.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"vi\";i:2;s:3:\"vie\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Tiếp tục\";}}s:5:\"zh_TW\";a:8:{s:8:\"language\";s:5:\"zh_TW\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-04-30 22:14:00\";s:12:\"english_name\";s:16:\"Chinese (Taiwan)\";s:11:\"native_name\";s:12:\"繁體中文\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/zh_TW.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"繼續\";}}s:5:\"zh_CN\";a:8:{s:8:\"language\";s:5:\"zh_CN\";s:7:\"version\";s:5:\"6.8.1\";s:7:\"updated\";s:19:\"2025-05-04 17:30:55\";s:12:\"english_name\";s:15:\"Chinese (China)\";s:11:\"native_name\";s:12:\"简体中文\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.8.1/zh_CN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"继续\";}}s:5:\"zh_HK\";a:8:{s:8:\"language\";s:5:\"zh_HK\";s:7:\"version\";s:5:\"6.2.6\";s:7:\"updated\";s:19:\"2022-07-15 15:25:03\";s:12:\"english_name\";s:19:\"Chinese (Hong Kong)\";s:11:\"native_name\";s:12:\"香港中文\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.6/zh_HK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"繼續\";}}}','off'),(354,'_site_transient_timeout_wp_theme_files_patterns-b24c4b64a1fe6f9f73313f730ddfc1cf','1747395209','off'),(355,'_site_transient_wp_theme_files_patterns-b24c4b64a1fe6f9f73313f730ddfc1cf','a:2:{s:7:\"version\";s:3:\"1.2\";s:8:\"patterns\";a:98:{s:21:\"banner-about-book.php\";a:4:{s:5:\"title\";s:28:\"Banner with book description\";s:4:\"slug\";s:34:\"twentytwentyfive/banner-about-book\";s:11:\"description\";s:66:\"Banner with book description and accompanying image for promotion.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:28:\"banner-cover-big-heading.php\";a:4:{s:5:\"title\";s:22:\"Cover with big heading\";s:4:\"slug\";s:41:\"twentytwentyfive/banner-cover-big-heading\";s:11:\"description\";s:82:\"A full-width cover section with a large background image and an oversized heading.\";s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}}s:22:\"banner-intro-image.php\";a:4:{s:5:\"title\";s:49:\"Short heading and paragraph and image on the left\";s:4:\"slug\";s:35:\"twentytwentyfive/banner-intro-image\";s:11:\"description\";s:68:\"A Intro pattern with Short heading, paragraph and image on the left.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}}s:16:\"banner-intro.php\";a:4:{s:5:\"title\";s:35:\"Intro with left-aligned description\";s:4:\"slug\";s:29:\"twentytwentyfive/banner-intro\";s:11:\"description\";s:66:\"A large left-aligned heading with a brand name emphasized in bold.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:17:\"banner-poster.php\";a:4:{s:5:\"title\";s:19:\"Poster-like section\";s:4:\"slug\";s:30:\"twentytwentyfive/banner-poster\";s:11:\"description\";s:78:\"A section that can be used as a banner or a landing page to announce an event.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:5:\"media\";}}s:43:\"banner-with-description-and-images-grid.php\";a:4:{s:5:\"title\";s:39:\"Banner with description and images grid\";s:4:\"slug\";s:47:\"twentytwentyfive/banner-description-images-grid\";s:11:\"description\";s:75:\"A banner with a short paragraph, and two images displayed in a grid layout.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}}s:18:\"binding-format.php\";a:4:{s:5:\"title\";s:16:\"Post format name\";s:4:\"slug\";s:31:\"twentytwentyfive/binding-format\";s:11:\"description\";s:75:\"Prints the name of the post format with the help of the Block Bindings API.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:12:\"comments.php\";a:5:{s:5:\"title\";s:8:\"Comments\";s:4:\"slug\";s:25:\"twentytwentyfive/comments\";s:11:\"description\";s:63:\"Comments area with comments list, pagination, and comment form.\";s:10:\"categories\";a:1:{i:0;s:4:\"text\";}s:10:\"blockTypes\";a:1:{i:0;s:13:\"core/comments\";}}s:32:\"contact-centered-social-link.php\";a:5:{s:5:\"title\";s:30:\"Centered link and social links\";s:4:\"slug\";s:45:\"twentytwentyfive/contact-centered-social-link\";s:11:\"description\";s:73:\"Centered contact section with a prominent message and social media links.\";s:10:\"categories\";a:1:{i:0;s:7:\"contact\";}s:8:\"keywords\";a:3:{i:0;s:7:\"contact\";i:1;s:3:\"faq\";i:2;s:9:\"questions\";}}s:26:\"contact-info-locations.php\";a:6:{s:5:\"title\";s:27:\"Contact, info and locations\";s:4:\"slug\";s:39:\"twentytwentyfive/contact-info-locations\";s:11:\"description\";s:78:\"Contact section with social media links, email, and multiple location details.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:7:\"contact\";}s:8:\"keywords\";a:2:{i:0;s:7:\"contact\";i:1;s:8:\"location\";}}s:29:\"contact-location-and-link.php\";a:4:{s:5:\"title\";s:25:\"Contact location and link\";s:4:\"slug\";s:42:\"twentytwentyfive/contact-location-and-link\";s:11:\"description\";s:89:\"Contact section with a location address, a directions link, and an image of the location.\";s:10:\"categories\";a:2:{i:0;s:7:\"contact\";i:1;s:8:\"featured\";}}s:18:\"cta-book-links.php\";a:4:{s:5:\"title\";s:30:\"Call to action with book links\";s:4:\"slug\";s:31:\"twentytwentyfive/cta-book-links\";s:11:\"description\";s:74:\"A call to action section with links to get the book in different websites.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:22:\"cta-book-locations.php\";a:4:{s:5:\"title\";s:29:\"Call to action with locations\";s:4:\"slug\";s:35:\"twentytwentyfive/cta-book-locations\";s:11:\"description\";s:82:\"A call to action section with links to get the book in the most popular locations.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:24:\"cta-centered-heading.php\";a:4:{s:5:\"title\";s:16:\"Centered heading\";s:4:\"slug\";s:37:\"twentytwentyfive/cta-centered-heading\";s:11:\"description\";s:53:\"A hero with a centered heading, paragraph and button.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:19:\"cta-events-list.php\";a:4:{s:5:\"title\";s:11:\"Events list\";s:4:\"slug\";s:32:\"twentytwentyfive/cta-events-list\";s:11:\"description\";s:37:\"A list of events with call to action.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:26:\"cta-grid-products-link.php\";a:5:{s:5:\"title\";s:54:\"Call to action with grid layout with products and link\";s:4:\"slug\";s:39:\"twentytwentyfive/cta-grid-products-link\";s:11:\"description\";s:42:\"A call to action featuring product images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"featured\";}}s:22:\"cta-heading-search.php\";a:4:{s:5:\"title\";s:23:\"Heading and search form\";s:4:\"slug\";s:35:\"twentytwentyfive/cta-heading-search\";s:11:\"description\";s:54:\"Large heading with a search form for quick navigation.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:18:\"cta-newsletter.php\";a:5:{s:5:\"title\";s:18:\"Newsletter sign-up\";s:4:\"slug\";s:31:\"twentytwentyfive/cta-newsletter\";s:11:\"description\";s:0:\"\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}s:8:\"keywords\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:10:\"newsletter\";}}s:15:\"event-3-col.php\";a:5:{s:5:\"title\";s:46:\"Events, 3 columns with event images and titles\";s:4:\"slug\";s:28:\"twentytwentyfive/event-3-col\";s:11:\"description\";s:95:\"A header with title and text and three columns that show 3 events with their images and titles.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:6:\"events\";i:1;s:7:\"columns\";i:2;s:6:\"images\";}}s:14:\"event-rsvp.php\";a:7:{s:5:\"title\";s:10:\"Event RSVP\";s:4:\"slug\";s:27:\"twentytwentyfive/event-rsvp\";s:11:\"description\";s:64:\"RSVP for an upcoming event with a cover image and event details.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}s:8:\"keywords\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:4:\"rsvp\";i:2;s:5:\"event\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:18:\"event-schedule.php\";a:5:{s:5:\"title\";s:14:\"Event schedule\";s:4:\"slug\";s:31:\"twentytwentyfive/event-schedule\";s:11:\"description\";s:54:\"A section with specified dates and times for an event.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}s:8:\"keywords\";a:4:{i:0;s:6:\"events\";i:1;s:6:\"agenda\";i:2;s:8:\"schedule\";i:3;s:8:\"lectures\";}}s:19:\"footer-centered.php\";a:5:{s:5:\"title\";s:15:\"Centered footer\";s:4:\"slug\";s:32:\"twentytwentyfive/footer-centered\";s:11:\"description\";s:44:\"Footer with centered site title and tagline.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:18:\"footer-columns.php\";a:5:{s:5:\"title\";s:19:\"Footer with columns\";s:4:\"slug\";s:31:\"twentytwentyfive/footer-columns\";s:11:\"description\";s:45:\"Footer columns with title, tagline and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:21:\"footer-newsletter.php\";a:5:{s:5:\"title\";s:29:\"Footer with newsletter signup\";s:4:\"slug\";s:34:\"twentytwentyfive/footer-newsletter\";s:11:\"description\";s:51:\"Footer with large site title and newsletter signup.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:17:\"footer-social.php\";a:5:{s:5:\"title\";s:33:\"Centered footer with social links\";s:4:\"slug\";s:30:\"twentytwentyfive/footer-social\";s:11:\"description\";s:49:\"Footer with centered site title and social links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:10:\"footer.php\";a:5:{s:5:\"title\";s:6:\"Footer\";s:4:\"slug\";s:23:\"twentytwentyfive/footer\";s:11:\"description\";s:51:\"Footer columns with logo, title, tagline and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:16:\"format-audio.php\";a:4:{s:5:\"title\";s:12:\"Audio format\";s:4:\"slug\";s:29:\"twentytwentyfive/format-audio\";s:11:\"description\";s:73:\"An audio post format with an image, title, audio player, and description.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:15:\"format-link.php\";a:4:{s:5:\"title\";s:11:\"Link format\";s:4:\"slug\";s:28:\"twentytwentyfive/format-link\";s:11:\"description\";s:77:\"A link post format with a description and an emphasized link for key content.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:15:\"grid-videos.php\";a:4:{s:5:\"title\";s:16:\"Grid with videos\";s:4:\"slug\";s:28:\"twentytwentyfive/grid-videos\";s:11:\"description\";s:19:\"A grid with videos.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}}s:24:\"grid-with-categories.php\";a:5:{s:5:\"title\";s:20:\"Grid with categories\";s:4:\"slug\";s:37:\"twentytwentyfive/grid-with-categories\";s:11:\"description\";s:41:\"A grid section with different categories.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:19:\"header-centered.php\";a:5:{s:5:\"title\";s:20:\"Centered site header\";s:4:\"slug\";s:32:\"twentytwentyfive/header-centered\";s:11:\"description\";s:52:\"Site header with centered site title and navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:18:\"header-columns.php\";a:5:{s:5:\"title\";s:19:\"Header with columns\";s:4:\"slug\";s:31:\"twentytwentyfive/header-columns\";s:11:\"description\";s:54:\"Site header with site title and navigation in columns.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:22:\"header-large-title.php\";a:5:{s:5:\"title\";s:23:\"Header with large title\";s:4:\"slug\";s:35:\"twentytwentyfive/header-large-title\";s:11:\"description\";s:63:\"Site header with large site title and right-aligned navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:10:\"header.php\";a:5:{s:5:\"title\";s:6:\"Header\";s:4:\"slug\";s:23:\"twentytwentyfive/header\";s:11:\"description\";s:43:\"Site header with site title and navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:36:\"heading-and-paragraph-with-image.php\";a:4:{s:5:\"title\";s:45:\"Heading and paragraph with image on the right\";s:4:\"slug\";s:49:\"twentytwentyfive/heading-and-paragraph-with-image\";s:11:\"description\";s:89:\"A two-column section with a heading and paragraph on the left, and an image on the right.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}}s:13:\"hero-book.php\";a:5:{s:5:\"title\";s:9:\"Hero book\";s:4:\"slug\";s:26:\"twentytwentyfive/hero-book\";s:11:\"description\";s:66:\"A hero section for the book with a description and pre-order link.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:7:\"podcast\";i:1;s:4:\"hero\";i:2;s:7:\"stories\";}}s:25:\"hero-full-width-image.php\";a:4:{s:5:\"title\";s:22:\"Hero, full width image\";s:4:\"slug\";s:38:\"twentytwentyfive/hero-full-width-image\";s:11:\"description\";s:68:\"A hero with a full width image, heading, short paragraph and button.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:41:\"hero-overlapped-book-cover-with-links.php\";a:4:{s:5:\"title\";s:38:\"Hero, overlapped book cover with links\";s:4:\"slug\";s:54:\"twentytwentyfive/hero-overlapped-book-cover-with-links\";s:11:\"description\";s:47:\"A hero with an overlapped book cover and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:16:\"hero-podcast.php\";a:5:{s:5:\"title\";s:12:\"Hero podcast\";s:4:\"slug\";s:29:\"twentytwentyfive/hero-podcast\";s:11:\"description\";s:0:\"\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:7:\"podcast\";i:1;s:4:\"hero\";i:2;s:7:\"stories\";}}s:14:\"hidden-404.php\";a:4:{s:5:\"title\";s:3:\"404\";s:4:\"slug\";s:27:\"twentytwentyfive/hidden-404\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:23:\"hidden-blog-heading.php\";a:4:{s:5:\"title\";s:19:\"Hidden blog heading\";s:4:\"slug\";s:36:\"twentytwentyfive/hidden-blog-heading\";s:11:\"description\";s:52:\"Hidden heading for the home page and index template.\";s:8:\"inserter\";b:0;}s:17:\"hidden-search.php\";a:4:{s:5:\"title\";s:6:\"Search\";s:4:\"slug\";s:30:\"twentytwentyfive/hidden-search\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:18:\"hidden-sidebar.php\";a:4:{s:5:\"title\";s:7:\"Sidebar\";s:4:\"slug\";s:31:\"twentytwentyfive/hidden-sidebar\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:21:\"hidden-written-by.php\";a:4:{s:5:\"title\";s:10:\"Written by\";s:4:\"slug\";s:34:\"twentytwentyfive/hidden-written-by\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:9:\"logos.php\";a:4:{s:5:\"title\";s:5:\"Logos\";s:4:\"slug\";s:22:\"twentytwentyfive/logos\";s:11:\"description\";s:77:\"Showcasing the podcast\'s clients with a heading and a series of client logos.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:24:\"media-instagram-grid.php\";a:5:{s:5:\"title\";s:14:\"Instagram grid\";s:4:\"slug\";s:37:\"twentytwentyfive/media-instagram-grid\";s:11:\"description\";s:62:\"A grid section with photos and a link to an Instagram profile.\";s:13:\"viewportWidth\";i:1440;s:10:\"categories\";a:3:{i:0;s:5:\"media\";i:1;s:7:\"gallery\";i:2;s:8:\"featured\";}}s:14:\"more-posts.php\";a:5:{s:5:\"title\";s:10:\"More posts\";s:4:\"slug\";s:27:\"twentytwentyfive/more-posts\";s:11:\"description\";s:45:\"Displays a list of posts with title and date.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:21:\"overlapped-images.php\";a:4:{s:5:\"title\";s:41:\"Overlapping images and paragraph on right\";s:4:\"slug\";s:34:\"twentytwentyfive/overlapped-images\";s:11:\"description\";s:53:\"A section with overlapping images, and a description.\";s:10:\"categories\";a:2:{i:0;s:5:\"about\";i:1;s:8:\"featured\";}}s:22:\"page-business-home.php\";a:8:{s:5:\"title\";s:17:\"Business homepage\";s:4:\"slug\";s:35:\"twentytwentyfive/page-business-home\";s:11:\"description\";s:28:\"A business homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:20:\"page-coming-soon.php\";a:8:{s:5:\"title\";s:11:\"Coming soon\";s:4:\"slug\";s:33:\"twentytwentyfive/page-coming-soon\";s:11:\"description\";s:96:\"A full-width cover banner that can be applied to a page or it can work as a single landing page.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:15:\"page-cv-bio.php\";a:7:{s:5:\"title\";s:6:\"CV/bio\";s:4:\"slug\";s:28:\"twentytwentyfive/page-cv-bio\";s:11:\"description\";s:36:\"A pattern for a CV/Bio landing page.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:21:\"page-landing-book.php\";a:8:{s:5:\"title\";s:21:\"Landing page for book\";s:4:\"slug\";s:34:\"twentytwentyfive/page-landing-book\";s:11:\"description\";s:104:\"A landing page for the book with a hero section, pre-order links, locations, FAQs and newsletter signup.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:22:\"page-landing-event.php\";a:8:{s:5:\"title\";s:22:\"Landing page for event\";s:4:\"slug\";s:35:\"twentytwentyfive/page-landing-event\";s:11:\"description\";s:87:\"A landing page for the event with a hero section, description, FAQs and call to action.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:24:\"page-landing-podcast.php\";a:8:{s:5:\"title\";s:24:\"Landing page for podcast\";s:4:\"slug\";s:37:\"twentytwentyfive/page-landing-podcast\";s:11:\"description\";s:111:\"A landing page for the podcast with a hero section, description, logos, grid with videos and newsletter signup.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:50:\"page-link-in-bio-heading-paragraph-links-image.php\";a:7:{s:5:\"title\";s:59:\"Link in bio heading, paragraph, links and full-height image\";s:4:\"slug\";s:63:\"twentytwentyfive/page-link-in-bio-heading-paragraph-links-image\";s:11:\"description\";s:84:\"A link in bio landing page with a heading, paragraph, links and a full height image.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:33:\"page-link-in-bio-wide-margins.php\";a:7:{s:5:\"title\";s:48:\"Link in bio with profile, links and wide margins\";s:4:\"slug\";s:46:\"twentytwentyfive/page-link-in-bio-wide-margins\";s:11:\"description\";s:86:\"A link in bio landing page with social links, a profile photo and a brief description.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:39:\"page-link-in-bio-with-tight-margins.php\";a:8:{s:5:\"title\";s:30:\"Link in bio with tight margins\";s:4:\"slug\";s:52:\"twentytwentyfive/page-link-in-bio-with-tight-margins\";s:11:\"description\";s:90:\"A full-width, full-height link in bio section with an image, a paragraph and social links.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:23:\"page-portfolio-home.php\";a:8:{s:5:\"title\";s:18:\"Portfolio homepage\";s:4:\"slug\";s:36:\"twentytwentyfive/page-portfolio-home\";s:11:\"description\";s:29:\"A portfolio homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:5:\"posts\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:18:\"page-shop-home.php\";a:8:{s:5:\"title\";s:13:\"Shop homepage\";s:4:\"slug\";s:31:\"twentytwentyfive/page-shop-home\";s:11:\"description\";s:24:\"A shop homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfive_page\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:19:\"post-navigation.php\";a:5:{s:5:\"title\";s:15:\"Post navigation\";s:4:\"slug\";s:32:\"twentytwentyfive/post-navigation\";s:11:\"description\";s:29:\"Next and previous post links.\";s:10:\"categories\";a:1:{i:0;s:4:\"text\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/post-navigation-link\";}}s:17:\"pricing-2-col.php\";a:5:{s:5:\"title\";s:18:\"Pricing, 2 columns\";s:4:\"slug\";s:30:\"twentytwentyfive/pricing-2-col\";s:11:\"description\";s:88:\"Pricing section with two columns, pricing plan, description, and call-to-action buttons.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:17:\"pricing-3-col.php\";a:4:{s:5:\"title\";s:18:\"Pricing, 3 columns\";s:4:\"slug\";s:30:\"twentytwentyfive/pricing-3-col\";s:11:\"description\";s:100:\"A three-column boxed pricing table designed to showcase services, descriptions, and pricing options.\";s:10:\"categories\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";i:2;s:8:\"services\";}}s:18:\"services-3-col.php\";a:4:{s:5:\"title\";s:19:\"Services, 3 columns\";s:4:\"slug\";s:31:\"twentytwentyfive/services-3-col\";s:11:\"description\";s:56:\"Three columns with images and text to showcase services.\";s:10:\"categories\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";i:2;s:8:\"services\";}}s:36:\"services-subscriber-only-section.php\";a:4:{s:5:\"title\";s:33:\"Services, subscriber only section\";s:4:\"slug\";s:49:\"twentytwentyfive/services-subscriber-only-section\";s:11:\"description\";s:72:\"A subscriber-only section highlighting exclusive services and offerings.\";s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"services\";}}s:24:\"services-team-photos.php\";a:4:{s:5:\"title\";s:21:\"Services, team photos\";s:4:\"slug\";s:37:\"twentytwentyfive/services-team-photos\";s:11:\"description\";s:59:\"Display team photos in a services section with grid layout.\";s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";i:2;s:8:\"featured\";}}s:37:\"template-404-vertical-header-blog.php\";a:5:{s:5:\"title\";s:17:\"Right-aligned 404\";s:4:\"slug\";s:50:\"twentytwentyfive/template-404-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:3:\"404\";}}s:30:\"template-archive-news-blog.php\";a:6:{s:5:\"title\";s:17:\"News blog archive\";s:4:\"slug\";s:43:\"twentytwentyfive/template-archive-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:31:\"template-archive-photo-blog.php\";a:6:{s:5:\"title\";s:18:\"Photo blog archive\";s:4:\"slug\";s:44:\"twentytwentyfive/template-archive-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:30:\"template-archive-text-blog.php\";a:6:{s:5:\"title\";s:17:\"Text blog archive\";s:4:\"slug\";s:43:\"twentytwentyfive/template-archive-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:41:\"template-archive-vertical-header-blog.php\";a:6:{s:5:\"title\";s:21:\"Right-aligned archive\";s:4:\"slug\";s:54:\"twentytwentyfive/template-archive-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:27:\"template-home-news-blog.php\";a:6:{s:5:\"title\";s:14:\"News blog home\";s:4:\"slug\";s:40:\"twentytwentyfive/template-home-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:28:\"template-home-photo-blog.php\";a:6:{s:5:\"title\";s:15:\"Photo blog home\";s:4:\"slug\";s:41:\"twentytwentyfive/template-home-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:38:\"template-home-posts-grid-news-blog.php\";a:5:{s:5:\"title\";s:34:\"News blog with featured posts grid\";s:4:\"slug\";s:51:\"twentytwentyfive/template-home-posts-grid-news-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:27:\"template-home-text-blog.php\";a:6:{s:5:\"title\";s:14:\"Text blog home\";s:4:\"slug\";s:40:\"twentytwentyfive/template-home-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:10:\"front-page\";i:1;s:4:\"home\";}}s:38:\"template-home-vertical-header-blog.php\";a:6:{s:5:\"title\";s:18:\"Right-aligned home\";s:4:\"slug\";s:51:\"twentytwentyfive/template-home-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:40:\"template-home-with-sidebar-news-blog.php\";a:6:{s:5:\"title\";s:22:\"News blog with sidebar\";s:4:\"slug\";s:53:\"twentytwentyfive/template-home-with-sidebar-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:28:\"template-page-photo-blog.php\";a:5:{s:5:\"title\";s:15:\"Photo blog page\";s:4:\"slug\";s:41:\"twentytwentyfive/template-page-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:4:\"page\";}}s:38:\"template-page-vertical-header-blog.php\";a:5:{s:5:\"title\";s:18:\"Right-aligned page\";s:4:\"slug\";s:51:\"twentytwentyfive/template-page-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:4:\"page\";}}s:33:\"template-query-loop-news-blog.php\";a:4:{s:5:\"title\";s:20:\"News blog query loop\";s:4:\"slug\";s:46:\"twentytwentyfive/template-query-loop-news-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:34:\"template-query-loop-photo-blog.php\";a:6:{s:5:\"title\";s:16:\"Photo blog posts\";s:4:\"slug\";s:47:\"twentytwentyfive/template-query-loop-photo-blog\";s:11:\"description\";s:54:\"A list of posts, 3 columns, with only featured images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:33:\"template-query-loop-text-blog.php\";a:4:{s:5:\"title\";s:20:\"Text blog query loop\";s:4:\"slug\";s:46:\"twentytwentyfive/template-query-loop-text-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:44:\"template-query-loop-vertical-header-blog.php\";a:4:{s:5:\"title\";s:24:\"Right-aligned query loop\";s:4:\"slug\";s:57:\"twentytwentyfive/template-query-loop-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:23:\"template-query-loop.php\";a:5:{s:5:\"title\";s:23:\"List of posts, 1 column\";s:4:\"slug\";s:36:\"twentytwentyfive/template-query-loop\";s:11:\"description\";s:61:\"A list of posts, 1 column, with featured image and post date.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:29:\"template-search-news-blog.php\";a:6:{s:5:\"title\";s:24:\"News blog search results\";s:4:\"slug\";s:42:\"twentytwentyfive/template-search-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:30:\"template-search-photo-blog.php\";a:6:{s:5:\"title\";s:25:\"Photo blog search results\";s:4:\"slug\";s:43:\"twentytwentyfive/template-search-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:29:\"template-search-text-blog.php\";a:6:{s:5:\"title\";s:24:\"Text blog search results\";s:4:\"slug\";s:42:\"twentytwentyfive/template-search-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:40:\"template-search-vertical-header-blog.php\";a:6:{s:5:\"title\";s:26:\"Right-aligned blog, search\";s:4:\"slug\";s:53:\"twentytwentyfive/template-search-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:40:\"template-single-left-aligned-content.php\";a:6:{s:5:\"title\";s:30:\"Post with left-aligned content\";s:4:\"slug\";s:47:\"twentytwentyfive/post-with-left-aligned-content\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:29:\"template-single-news-blog.php\";a:6:{s:5:\"title\";s:34:\"News blog single post with sidebar\";s:4:\"slug\";s:42:\"twentytwentyfive/template-single-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:26:\"template-single-offset.php\";a:6:{s:5:\"title\";s:34:\"Offset post without featured image\";s:4:\"slug\";s:39:\"twentytwentyfive/template-single-offset\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:30:\"template-single-photo-blog.php\";a:6:{s:5:\"title\";s:22:\"Photo blog single post\";s:4:\"slug\";s:43:\"twentytwentyfive/template-single-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:29:\"template-single-text-blog.php\";a:6:{s:5:\"title\";s:21:\"Text blog single post\";s:4:\"slug\";s:42:\"twentytwentyfive/template-single-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:40:\"template-single-vertical-header-blog.php\";a:6:{s:5:\"title\";s:25:\"Right-aligned single post\";s:4:\"slug\";s:53:\"twentytwentyfive/template-single-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:22:\"testimonials-2-col.php\";a:5:{s:5:\"title\";s:21:\"2 columns with avatar\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-2-col\";s:11:\"description\";s:42:\"Two columns with testimonials and avatars.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:22:\"testimonials-6-col.php\";a:5:{s:5:\"title\";s:35:\"3 column layout with 6 testimonials\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-6-col\";s:11:\"description\";s:86:\"A section with three columns and two rows, each containing a testimonial and citation.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:22:\"testimonials-large.php\";a:5:{s:5:\"title\";s:32:\"Review with large image on right\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-large\";s:11:\"description\";s:46:\"A testimonial with a large image on the right.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:13:\"text-faqs.php\";a:6:{s:5:\"title\";s:4:\"FAQs\";s:4:\"slug\";s:26:\"twentytwentyfive/text-faqs\";s:11:\"description\";s:68:\"A FAQs section with a FAQ heading and list of questions and answers.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:4:\"text\";i:1;s:5:\"about\";}s:8:\"keywords\";a:5:{i:0;s:3:\"faq\";i:1;s:5:\"about\";i:2;s:10:\"frequently\";i:3;s:5:\"asked\";i:4;s:9:\"questions\";}}s:19:\"vertical-header.php\";a:6:{s:5:\"title\";s:20:\"Vertical site header\";s:4:\"slug\";s:32:\"twentytwentyfive/vertical-header\";s:11:\"description\";s:52:\"Vertical site header with site title and navigation.\";s:13:\"viewportWidth\";i:300;s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:34:\"core/template-part/vertical-header\";}}}}','off'),(356,'_site_transient_timeout_theme_roots','1747395241','off'),(357,'_site_transient_theme_roots','a:15:{s:12:\"twentyeleven\";s:7:\"/themes\";s:13:\"twentyfifteen\";s:7:\"/themes\";s:14:\"twentyfourteen\";s:7:\"/themes\";s:14:\"twentynineteen\";s:7:\"/themes\";s:15:\"twentyseventeen\";s:7:\"/themes\";s:13:\"twentysixteen\";s:7:\"/themes\";s:9:\"twentyten\";s:7:\"/themes\";s:14:\"twentythirteen\";s:7:\"/themes\";s:12:\"twentytwelve\";s:7:\"/themes\";s:12:\"twentytwenty\";s:7:\"/themes\";s:16:\"twentytwentyfive\";s:7:\"/themes\";s:16:\"twentytwentyfour\";s:7:\"/themes\";s:15:\"twentytwentyone\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";s:15:\"twentytwentytwo\";s:7:\"/themes\";}','off'); +/*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_postmeta` +-- + +DROP TABLE IF EXISTS `wp_postmeta`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_postmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint(20) unsigned NOT NULL DEFAULT 0, + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext DEFAULT NULL, + PRIMARY KEY (`meta_id`), + KEY `post_id` (`post_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB AUTO_INCREMENT=198 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_postmeta` +-- + +LOCK TABLES `wp_postmeta` WRITE; +/*!40000 ALTER TABLE `wp_postmeta` DISABLE KEYS */; +INSERT INTO `wp_postmeta` VALUES (1,2,'_wp_page_template','default'),(2,3,'_wp_page_template','default'),(11,24,'_edit_lock','1743159674:1'),(12,26,'_edit_last','1'),(13,26,'_edit_lock','1743172384:1'),(14,27,'_edit_last','1'),(15,27,'_edit_lock','1743159812:1'),(16,28,'_edit_last','1'),(17,28,'_edit_lock','1743159837:1'),(33,320,'_wp_attached_file','2025/03/tim-mossholder-dqxr8A7Twwc-unsplash-scaled.jpg'),(34,320,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1707;s:4:\"file\";s:54:\"2025/03/tim-mossholder-dqxr8A7Twwc-unsplash-scaled.jpg\";s:8:\"filesize\";i:885515;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:47:\"tim-mossholder-dqxr8A7Twwc-unsplash-300x200.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:19437;}s:5:\"large\";a:5:{s:4:\"file\";s:48:\"tim-mossholder-dqxr8A7Twwc-unsplash-1024x683.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:175643;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:47:\"tim-mossholder-dqxr8A7Twwc-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9942;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:47:\"tim-mossholder-dqxr8A7Twwc-unsplash-768x512.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:102589;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:49:\"tim-mossholder-dqxr8A7Twwc-unsplash-1536x1024.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:365482;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:49:\"tim-mossholder-dqxr8A7Twwc-unsplash-2048x1365.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1365;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:605166;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:39:\"tim-mossholder-dqxr8A7Twwc-unsplash.jpg\";}'),(38,30,'_edit_lock','1747393602:1'),(39,322,'_wp_attached_file','2025/03/sebastian-tapia-huerta-5qba-p9ahTE-unsplash-scaled.jpg'),(40,322,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1707;s:4:\"file\";s:62:\"2025/03/sebastian-tapia-huerta-5qba-p9ahTE-unsplash-scaled.jpg\";s:8:\"filesize\";i:523407;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:55:\"sebastian-tapia-huerta-5qba-p9ahTE-unsplash-300x200.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:14335;}s:5:\"large\";a:5:{s:4:\"file\";s:56:\"sebastian-tapia-huerta-5qba-p9ahTE-unsplash-1024x683.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:103403;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:55:\"sebastian-tapia-huerta-5qba-p9ahTE-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:8216;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:55:\"sebastian-tapia-huerta-5qba-p9ahTE-unsplash-768x512.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:61650;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:57:\"sebastian-tapia-huerta-5qba-p9ahTE-unsplash-1536x1024.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:212192;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:57:\"sebastian-tapia-huerta-5qba-p9ahTE-unsplash-2048x1365.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1365;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:352470;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:47:\"sebastian-tapia-huerta-5qba-p9ahTE-unsplash.jpg\";}'),(43,30,'_thumbnail_id','322'),(44,31,'_edit_lock','1747393483:1'),(45,32,'_edit_lock','1747393536:1'),(49,31,'_thumbnail_id','320'),(55,32,'_thumbnail_id','322'),(56,19,'_edit_lock','1743161252:1'),(58,21,'_edit_lock','1743161378:1'),(59,22,'_edit_lock','1743161361:1'),(60,23,'_edit_lock','1743161375:1'),(61,327,'_wp_attached_file','2025/03/alim-twul1x77QEo-unsplash-scaled.jpg'),(62,327,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2048;s:6:\"height\";i:2560;s:4:\"file\";s:44:\"2025/03/alim-twul1x77QEo-unsplash-scaled.jpg\";s:8:\"filesize\";i:1113717;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:37:\"alim-twul1x77QEo-unsplash-240x300.jpg\";s:5:\"width\";i:240;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:27592;}s:5:\"large\";a:5:{s:4:\"file\";s:38:\"alim-twul1x77QEo-unsplash-819x1024.jpg\";s:5:\"width\";i:819;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:243103;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:37:\"alim-twul1x77QEo-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11831;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:37:\"alim-twul1x77QEo-unsplash-768x960.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:960;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:216088;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:39:\"alim-twul1x77QEo-unsplash-1229x1536.jpg\";s:5:\"width\";i:1229;s:6:\"height\";i:1536;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:482201;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:39:\"alim-twul1x77QEo-unsplash-1638x2048.jpg\";s:5:\"width\";i:1638;s:6:\"height\";i:2048;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:776456;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:29:\"alim-twul1x77QEo-unsplash.jpg\";}'),(63,328,'_acf_changed',''),(64,328,'footnotes',''),(67,19,'_thumbnail_id','327'),(68,330,'_wp_attached_file','2025/03/junhan-foong-ERLAcTp-8MQ-unsplash-scaled.jpg'),(69,330,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1920;s:4:\"file\";s:52:\"2025/03/junhan-foong-ERLAcTp-8MQ-unsplash-scaled.jpg\";s:8:\"filesize\";i:957696;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:45:\"junhan-foong-ERLAcTp-8MQ-unsplash-300x225.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:225;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:20168;}s:5:\"large\";a:5:{s:4:\"file\";s:46:\"junhan-foong-ERLAcTp-8MQ-unsplash-1024x768.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:157551;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:45:\"junhan-foong-ERLAcTp-8MQ-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9757;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:45:\"junhan-foong-ERLAcTp-8MQ-unsplash-768x576.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:93523;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:47:\"junhan-foong-ERLAcTp-8MQ-unsplash-1536x1152.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1152;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:333494;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:47:\"junhan-foong-ERLAcTp-8MQ-unsplash-2048x1536.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1536;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:597661;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:37:\"junhan-foong-ERLAcTp-8MQ-unsplash.jpg\";}'),(73,332,'_acf_changed',''),(74,332,'footnotes',''),(75,333,'_wp_attached_file','2025/03/let-s-see-persia-c8dFTAYI0-8-unsplash-scaled.jpg'),(76,333,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:1707;s:6:\"height\";i:2560;s:4:\"file\";s:56:\"2025/03/let-s-see-persia-c8dFTAYI0-8-unsplash-scaled.jpg\";s:8:\"filesize\";i:1067862;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:49:\"let-s-see-persia-c8dFTAYI0-8-unsplash-200x300.jpg\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:21170;}s:5:\"large\";a:5:{s:4:\"file\";s:50:\"let-s-see-persia-c8dFTAYI0-8-unsplash-683x1024.jpg\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:191199;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:49:\"let-s-see-persia-c8dFTAYI0-8-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11159;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:50:\"let-s-see-persia-c8dFTAYI0-8-unsplash-768x1152.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:237596;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:51:\"let-s-see-persia-c8dFTAYI0-8-unsplash-1024x1536.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:410721;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:51:\"let-s-see-persia-c8dFTAYI0-8-unsplash-1365x2048.jpg\";s:5:\"width\";i:1365;s:6:\"height\";i:2048;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:707358;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:41:\"let-s-see-persia-c8dFTAYI0-8-unsplash.jpg\";}'),(79,21,'_thumbnail_id','333'),(82,22,'_thumbnail_id','327'),(85,23,'_thumbnail_id','330'),(86,13,'_edit_lock','1743161654:1'),(87,14,'_edit_lock','1743161475:1'),(88,15,'_edit_lock','1743161485:1'),(89,7,'_edit_lock','1747325945:1'),(90,16,'_edit_lock','1743161585:1'),(91,8,'_edit_lock','1743161620:1'),(92,17,'_edit_lock','1743161633:1'),(93,9,'_edit_lock','1743161668:1'),(95,5,'_edit_lock','1743161733:1'),(96,337,'_wp_attached_file','2025/03/clay-banks-8pFh9JUcQOY-unsplash-scaled.jpg'),(97,337,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1600;s:4:\"file\";s:50:\"2025/03/clay-banks-8pFh9JUcQOY-unsplash-scaled.jpg\";s:8:\"filesize\";i:379095;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:43:\"clay-banks-8pFh9JUcQOY-unsplash-300x188.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:188;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11758;}s:5:\"large\";a:5:{s:4:\"file\";s:44:\"clay-banks-8pFh9JUcQOY-unsplash-1024x640.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:640;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:75037;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:43:\"clay-banks-8pFh9JUcQOY-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6941;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:43:\"clay-banks-8pFh9JUcQOY-unsplash-768x480.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:480;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:46566;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:44:\"clay-banks-8pFh9JUcQOY-unsplash-1536x960.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:960;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:151997;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:45:\"clay-banks-8pFh9JUcQOY-unsplash-2048x1280.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1280;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:253115;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:35:\"clay-banks-8pFh9JUcQOY-unsplash.jpg\";}'),(100,13,'_thumbnail_id','337'),(101,339,'_wp_attached_file','2025/03/pepe-nero-JsSM2T9iPRU-unsplash-scaled.jpg'),(102,339,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1707;s:4:\"file\";s:49:\"2025/03/pepe-nero-JsSM2T9iPRU-unsplash-scaled.jpg\";s:8:\"filesize\";i:773106;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:42:\"pepe-nero-JsSM2T9iPRU-unsplash-300x200.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:20952;}s:5:\"large\";a:5:{s:4:\"file\";s:43:\"pepe-nero-JsSM2T9iPRU-unsplash-1024x683.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:172770;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:42:\"pepe-nero-JsSM2T9iPRU-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:10108;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:42:\"pepe-nero-JsSM2T9iPRU-unsplash-768x512.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:104044;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:44:\"pepe-nero-JsSM2T9iPRU-unsplash-1536x1024.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:339517;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:44:\"pepe-nero-JsSM2T9iPRU-unsplash-2048x1365.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1365;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:543505;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:34:\"pepe-nero-JsSM2T9iPRU-unsplash.jpg\";}'),(105,14,'_thumbnail_id','339'),(108,15,'_thumbnail_id','337'),(109,342,'_wp_attached_file','2025/03/priscilla-fraire-_1LvAexVWa8-unsplash-scaled.jpg'),(110,342,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1706;s:4:\"file\";s:56:\"2025/03/priscilla-fraire-_1LvAexVWa8-unsplash-scaled.jpg\";s:8:\"filesize\";i:670433;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:49:\"priscilla-fraire-_1LvAexVWa8-unsplash-300x200.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:16477;}s:5:\"large\";a:5:{s:4:\"file\";s:50:\"priscilla-fraire-_1LvAexVWa8-unsplash-1024x683.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:110011;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:49:\"priscilla-fraire-_1LvAexVWa8-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9624;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:49:\"priscilla-fraire-_1LvAexVWa8-unsplash-768x512.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:68662;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:51:\"priscilla-fraire-_1LvAexVWa8-unsplash-1536x1024.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:226620;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:51:\"priscilla-fraire-_1LvAexVWa8-unsplash-2048x1365.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1365;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:413956;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:41:\"priscilla-fraire-_1LvAexVWa8-unsplash.jpg\";}'),(113,7,'_thumbnail_id','342'),(114,344,'_wp_attached_file','2025/03/alin-gavriliuc-sAkUB5aCRcs-unsplash-scaled.jpg'),(115,344,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:54:\"2025/03/alin-gavriliuc-sAkUB5aCRcs-unsplash-scaled.jpg\";s:8:\"filesize\";i:203293;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:47:\"alin-gavriliuc-sAkUB5aCRcs-unsplash-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11592;}s:5:\"large\";a:5:{s:4:\"file\";s:48:\"alin-gavriliuc-sAkUB5aCRcs-unsplash-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:53888;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:47:\"alin-gavriliuc-sAkUB5aCRcs-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7828;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:47:\"alin-gavriliuc-sAkUB5aCRcs-unsplash-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:35794;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:48:\"alin-gavriliuc-sAkUB5aCRcs-unsplash-1536x864.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:96444;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:49:\"alin-gavriliuc-sAkUB5aCRcs-unsplash-2048x1152.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:145300;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:39:\"alin-gavriliuc-sAkUB5aCRcs-unsplash.jpg\";}'),(118,16,'_thumbnail_id','344'),(119,346,'_wp_attached_file','2025/03/steve-douglas-JjEbmnY1e0w-unsplash-scaled.jpg'),(120,346,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1707;s:4:\"file\";s:53:\"2025/03/steve-douglas-JjEbmnY1e0w-unsplash-scaled.jpg\";s:8:\"filesize\";i:971895;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:46:\"steve-douglas-JjEbmnY1e0w-unsplash-300x200.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:20075;}s:5:\"large\";a:5:{s:4:\"file\";s:47:\"steve-douglas-JjEbmnY1e0w-unsplash-1024x683.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:194258;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:46:\"steve-douglas-JjEbmnY1e0w-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:10052;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:46:\"steve-douglas-JjEbmnY1e0w-unsplash-768x512.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:111792;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:48:\"steve-douglas-JjEbmnY1e0w-unsplash-1536x1024.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:395927;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:48:\"steve-douglas-JjEbmnY1e0w-unsplash-2048x1365.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1365;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:669965;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:38:\"steve-douglas-JjEbmnY1e0w-unsplash.jpg\";}'),(123,8,'_thumbnail_id','346'),(126,17,'_thumbnail_id','339'),(127,349,'_wp_attached_file','2025/03/mario-la-pergola-dSrEUAtF3kU-unsplash-scaled.jpg'),(128,349,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1706;s:4:\"file\";s:56:\"2025/03/mario-la-pergola-dSrEUAtF3kU-unsplash-scaled.jpg\";s:8:\"filesize\";i:850479;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:49:\"mario-la-pergola-dSrEUAtF3kU-unsplash-300x200.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:19408;}s:5:\"large\";a:5:{s:4:\"file\";s:50:\"mario-la-pergola-dSrEUAtF3kU-unsplash-1024x683.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:159579;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:49:\"mario-la-pergola-dSrEUAtF3kU-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9507;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:49:\"mario-la-pergola-dSrEUAtF3kU-unsplash-768x512.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:94169;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:51:\"mario-la-pergola-dSrEUAtF3kU-unsplash-1536x1024.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:334220;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:51:\"mario-la-pergola-dSrEUAtF3kU-unsplash-2048x1365.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1365;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:566116;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:41:\"mario-la-pergola-dSrEUAtF3kU-unsplash.jpg\";}'),(131,9,'_thumbnail_id','349'),(135,352,'_wp_attached_file','2025/03/jf-martin-kZjBucSSj2s-unsplash-scaled.jpg'),(136,352,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:1709;s:6:\"height\";i:2560;s:4:\"file\";s:49:\"2025/03/jf-martin-kZjBucSSj2s-unsplash-scaled.jpg\";s:8:\"filesize\";i:605133;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:42:\"jf-martin-kZjBucSSj2s-unsplash-200x300.jpg\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:16432;}s:5:\"large\";a:5:{s:4:\"file\";s:43:\"jf-martin-kZjBucSSj2s-unsplash-684x1024.jpg\";s:5:\"width\";i:684;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:128487;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:42:\"jf-martin-kZjBucSSj2s-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:10472;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:43:\"jf-martin-kZjBucSSj2s-unsplash-768x1150.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:1150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:156657;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:44:\"jf-martin-kZjBucSSj2s-unsplash-1026x1536.jpg\";s:5:\"width\";i:1026;s:6:\"height\";i:1536;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:259096;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:44:\"jf-martin-kZjBucSSj2s-unsplash-1367x2048.jpg\";s:5:\"width\";i:1367;s:6:\"height\";i:2048;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:420738;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:34:\"jf-martin-kZjBucSSj2s-unsplash.jpg\";}'),(139,5,'_thumbnail_id','352'),(144,355,'_edit_lock','1743161605:1'),(145,301,'_edit_lock','1747393457:1'),(146,313,'_edit_lock','1743161843:1'),(147,314,'_edit_lock','1743161867:1'),(148,315,'_edit_lock','1743161872:1'),(149,316,'_edit_lock','1743161880:1'),(150,317,'_edit_lock','1743161899:1'),(151,307,'_edit_lock','1743161960:1'),(152,308,'_edit_lock','1743161971:1'),(153,309,'_edit_lock','1743162020:1'),(154,310,'_edit_lock','1747325946:1'),(155,311,'_edit_lock','1743162031:1'),(156,302,'_edit_lock','1743162055:1'),(157,303,'_edit_lock','1747325947:1'),(158,304,'_edit_lock','1743162069:1'),(159,305,'_edit_lock','1743162076:1'),(160,356,'_wp_attached_file','2025/03/dabbas-j0OhftYAXR4-unsplash-scaled.jpg'),(161,356,'_wp_attachment_metadata','a:7:{s:5:\"width\";i:2560;s:6:\"height\";i:1921;s:4:\"file\";s:46:\"2025/03/dabbas-j0OhftYAXR4-unsplash-scaled.jpg\";s:8:\"filesize\";i:953553;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:39:\"dabbas-j0OhftYAXR4-unsplash-300x225.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:225;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:25014;}s:5:\"large\";a:5:{s:4:\"file\";s:40:\"dabbas-j0OhftYAXR4-unsplash-1024x768.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:223040;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:39:\"dabbas-j0OhftYAXR4-unsplash-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11344;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:39:\"dabbas-j0OhftYAXR4-unsplash-768x576.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:132969;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:41:\"dabbas-j0OhftYAXR4-unsplash-1536x1153.jpg\";s:5:\"width\";i:1536;s:6:\"height\";i:1153;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:440313;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:41:\"dabbas-j0OhftYAXR4-unsplash-2048x1537.jpg\";s:5:\"width\";i:2048;s:6:\"height\";i:1537;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:685580;}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}s:14:\"original_image\";s:31:\"dabbas-j0OhftYAXR4-unsplash.jpg\";}'),(162,309,'_thumbnail_id','356'),(163,301,'_thumbnail_id','342'),(164,28,'_wp_trash_meta_status','publish'),(165,28,'_wp_trash_meta_time','1743165634'),(166,28,'_wp_desired_post_slug','taxonomy_67e68296e2309'),(178,358,'_acf_changed',''),(179,358,'footnotes',''),(180,359,'_acf_changed',''),(181,359,'footnotes',''),(182,360,'_acf_changed',''),(183,361,'_acf_changed',''),(187,363,'_acf_changed',''),(188,363,'footnotes',''),(195,365,'_acf_changed',''),(196,365,'footnotes',''),(197,366,'_acf_changed',''); +/*!40000 ALTER TABLE `wp_postmeta` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_posts` +-- + +DROP TABLE IF EXISTS `wp_posts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_posts` ( + `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `post_author` bigint(20) unsigned NOT NULL DEFAULT 0, + `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_content` longtext NOT NULL, + `post_title` text NOT NULL, + `post_excerpt` text NOT NULL, + `post_status` varchar(20) NOT NULL DEFAULT 'publish', + `comment_status` varchar(20) NOT NULL DEFAULT 'open', + `ping_status` varchar(20) NOT NULL DEFAULT 'open', + `post_password` varchar(255) NOT NULL DEFAULT '', + `post_name` varchar(200) NOT NULL DEFAULT '', + `to_ping` text NOT NULL, + `pinged` text NOT NULL, + `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_content_filtered` longtext NOT NULL, + `post_parent` bigint(20) unsigned NOT NULL DEFAULT 0, + `guid` varchar(255) NOT NULL DEFAULT '', + `menu_order` int(11) NOT NULL DEFAULT 0, + `post_type` varchar(20) NOT NULL DEFAULT 'post', + `post_mime_type` varchar(100) NOT NULL DEFAULT '', + `comment_count` bigint(20) NOT NULL DEFAULT 0, + PRIMARY KEY (`ID`), + KEY `post_name` (`post_name`(191)), + KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), + KEY `post_parent` (`post_parent`), + KEY `post_author` (`post_author`) +) ENGINE=InnoDB AUTO_INCREMENT=367 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_posts` +-- + +LOCK TABLES `wp_posts` WRITE; +/*!40000 ALTER TABLE `wp_posts` DISABLE KEYS */; +INSERT INTO `wp_posts` VALUES (2,1,'2025-03-28 10:41:07','2025-03-28 10:41:07','\n

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:

\n\n\n\n

Hi there! I\'m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin\' caught in the rain.)

\n\n\n\n

...or something like this:

\n\n\n\n

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

\n\n\n\n

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

\n','Sample Page','','publish','closed','open','','sample-page','','','2025-03-28 10:41:07','2025-03-28 10:41:07','',0,'http://echoes.local/?page_id=2',0,'page','',0),(3,1,'2025-03-28 10:41:07','2025-03-28 10:41:07','\n

Who we are

\n\n\n

Suggested text: Our website address is: http://echoes.local.

\n\n\n

Comments

\n\n\n

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.

\n\n\n

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.

\n\n\n

Media

\n\n\n

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 and extract any location data from images on the website.

\n\n\n

Cookies

\n\n\n

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.

\n\n\n

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.

\n\n\n

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.

\n\n\n

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.

\n\n\n

Embedded content from other websites

\n\n\n

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.

\n\n\n

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.

\n\n\n

Who we share your data with

\n\n\n

Suggested text: If you request a password reset, your IP address will be included in the reset email.

\n\n\n

How long we retain your data

\n\n\n

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.

\n\n\n

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.

\n\n\n

What rights you have over your data

\n\n\n

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.

\n\n\n

Where your data is sent

\n\n\n

Suggested text: Visitor comments may be checked through an automated spam detection service.

\n\n','Privacy Policy','','draft','closed','open','','privacy-policy','','','2025-03-28 10:41:07','2025-03-28 10:41:07','',0,'http://echoes.local/?page_id=3',0,'page','',0),(4,1,'2025-03-28 10:41:26','0000-00-00 00:00:00','','Auto Draft','','auto-draft','open','open','','','','','2025-03-28 10:41:26','0000-00-00 00:00:00','',0,'http://echoes.local/?p=4',0,'post','',0),(5,1,'2025-03-28 10:52:33','2025-03-28 10:52:33','Stained glass windows were more than just decorative elements in medieval architecture; they were powerful tools for storytelling and religious education. These magnificent works of art combined innovative glass-making techniques with detailed artistic expression to create luminous scenes that transformed interior spaces. The way sunlight filtered through these colored windows was often described as \"divine light\" by medieval observers.\n\nThe creation of medieval stained glass was a complex process that required significant skill and knowledge. Craftsmen would cut colored glass into specific shapes, paint details onto the glass pieces, and join them together with lead cames. The most impressive examples of medieval stained glass can be found in Gothic cathedrals, where large rose windows and towering lancet windows create breathtaking displays of colored light.\n\nBeyond their artistic beauty, stained glass windows served as \"books of light\" for the largely illiterate medieval population, depicting biblical stories, saints\' lives, and moral lessons through their vivid imagery. The technical and artistic achievement of medieval stained glass makers continues to inspire awe and admiration today.','Stained Glass: The Medieval Art of Light','','publish','open','open','','stained-glass-the-medieval-art-of-light','','','2025-03-28 11:35:33','2025-03-28 11:35:33','',0,'https://example.com/?p=5',0,'post','',0),(7,1,'2025-03-28 10:56:33','2025-03-28 10:56:33','The Gothic cathedrals of France stand as testament to medieval architectural brilliance and religious devotion. These magnificent structures, built between the 12th and 16th centuries, revolutionized architectural design with their innovative features and soaring heights. The implementation of pointed arches, ribbed vaults, and flying buttresses allowed these buildings to reach unprecedented heights while featuring walls of stained glass that seemed to defy gravity.\n\nNotre-Dame de Paris, despite recent challenges, remains one of the finest examples of French Gothic architecture. Its harmonious proportions, twin towers, and spectacular rose windows have inspired architects and artists for centuries. The cathedral\'s flying buttresses, among the first of their kind, demonstrate the innovative engineering solutions that made Gothic architecture possible.','The Magnificent Gothic Cathedrals of France','','publish','open','open','','the-magnificent-gothic-cathedrals-of-france','','','2025-03-28 11:32:12','2025-03-28 11:32:12','',0,'https://example.com/?p=1',0,'post','',0),(8,1,'2025-03-28 10:55:33','2025-03-28 10:55:33','Medieval castles were masterpieces of defensive architecture, designed to protect their inhabitants from siege and assault. The evolution of castle design reflects the ongoing battle between defensive innovations and offensive warfare techniques. From simple wooden structures on hills, castles evolved into sophisticated stone fortresses with multiple layers of defense.\n\nThe key elements of castle defense included high stone walls, moats, drawbridges, and strategic placement on elevated ground. Concentric castles, with their multiple rings of walls, represented the pinnacle of medieval defensive architecture. These formidable structures often featured arrow slits, murder holes, and machicolations, all designed to give defenders the advantage over attacking forces.\n\nThe great keeps of these castles served not only as last-resort defensive positions but also as symbols of power and authority. Their thick walls and limited access points made them nearly impregnable when properly defended, while their impressive height served as a constant reminder of the lord\'s authority over the surrounding lands.','Medieval Castle Defense Systems','','publish','open','open','','medieval-castle-defense-systems','','','2025-03-28 11:33:42','2025-03-28 11:33:42','',0,'https://example.com/?p=2',0,'post','',0),(9,1,'2025-03-28 10:54:33','2025-03-28 10:54:33','\n \"Romanesque\n \n

Romanesque architecture, predominant in medieval Europe from the 6th to the 11th century, marked a significant evolution in building design. Characterized by its massive walls, round arches, and barrel vaults, this architectural style laid the foundation for the later Gothic period. The term \"Romanesque\" reflects the architecture\'s similarity to Roman designs, particularly in the use of round arches and vaulted ceilings.

\n\n

One of the most distinctive features of Romanesque architecture is the rounded arch, used for both structural and decorative purposes. These arches appeared in doorways, windows, and arcade sections, creating the characteristic appearance we associate with medieval churches and monasteries. The thick walls and small windows of Romanesque buildings were necessary to support the heavy stone vaults above.

\n ','Romanesque Architecture: The Round Arch Revolution','','publish','open','open','','romanesque-architecture-the-round-arch-revolution','','','2025-03-28 11:34:30','2025-03-28 11:34:30','',0,'https://example.com/?p=3',0,'post','',0),(11,1,'2025-03-28 11:01:53','2025-03-28 11:01:53','','Navigation','','publish','closed','closed','','navigation','','','2025-03-28 11:01:53','2025-03-28 11:01:53','',0,'http://echoes.local/navigation/',0,'wp_navigation','',0),(13,1,'2025-03-28 10:58:39','2025-03-28 10:58:39','Chinese pagodas represent some of the most iconic structures in Oriental architecture, serving as both religious monuments and symbols of cultural identity. These multi-tiered towers, evolving from Indian stupas, have become distinctive features of the Chinese landscape. Each level of a pagoda typically features characteristic upturned eaves, creating a visual rhythm that draws the eye skyward.\n\nThe engineering behind these structures is remarkably sophisticated, incorporating innovative techniques for earthquake resistance and weight distribution. The use of a central pillar, known as the \"heart pillar,\" combined with sophisticated bracketing systems, allows these towers to maintain their stability despite their impressive heights. Many ancient pagodas have survived centuries of natural disasters, testament to their ingenious construction methods.\n\nBeyond their structural brilliance, pagodas also serve as repositories of Buddhist relics and sacred texts, making them important centers of spiritual life. Their placement often follows precise feng shui principles, ensuring harmony with the surrounding landscape and optimal energy flow.','The Ancient Art of Chinese Pagodas','','publish','open','open','','the-ancient-art-of-chinese-pagodas','','','2025-03-28 11:30:41','2025-03-28 11:30:41','',0,'https://example.com/?p=1',0,'post','',0),(14,1,'2025-03-28 10:57:39','2025-03-28 10:57:39','Japanese Zen gardens, or karesansui, represent the epitome of minimalist architectural design in Oriental culture. These dry landscape gardens use carefully arranged rocks, gravel, and occasional plant elements to create spaces for meditation and contemplation. The architectural principles behind these gardens emphasize void spaces as much as physical elements, creating a perfect balance between presence and absence.\n\nThe design of Zen gardens follows strict principles that have been refined over centuries. The placement of each element is carefully considered, with rocks and sand patterns often representing natural landscapes in abstract forms. The surrounding architecture, including verandas and viewing pavilions, is integral to the garden experience, creating carefully framed views and meditation spaces.','Japanese Zen Gardens: Architecture of Tranquility','','publish','open','open','','japanese-zen-gardens-architecture-of-tranquility','','','2025-03-28 11:31:20','2025-03-28 11:31:20','',0,'https://example.com/?p=2',0,'post','',0),(15,1,'2025-03-28 10:56:39','2025-03-28 10:56:39','The Forbidden City stands as the ultimate expression of Chinese imperial architecture, embodying centuries of architectural wisdom and symbolic design. This vast palace complex demonstrates the sophisticated planning principles of traditional Chinese architecture, with its strict axiality, hierarchical spaces, and profound symbolic meanings embedded in every architectural detail.\n\nThe architectural features of the Forbidden City are rich with symbolism: the yellow roof tiles, exclusive to imperial buildings, the number of studs on doors indicating the rank of the building\'s occupant, and the intricate bracketing systems known as dougong that support the massive roofs without nails. The entire complex was designed according to cosmic principles, reflecting the emperor\'s role as the Son of Heaven.\n\nThe palace\'s defensive architecture is equally impressive, featuring high walls, moats, and strategic gates that created multiple layers of security. Yet within these defensive walls lie some of the most refined examples of Chinese architectural aesthetics, from delicate gardens to grand ceremonial halls.','The Forbidden City: Marvel of Imperial Chinese Architecture','','publish','open','open','','the-forbidden-city-marvel-of-imperial-chinese-architecture','','','2025-03-28 11:31:33','2025-03-28 11:31:33','',0,'https://example.com/?p=3',0,'post','',0),(16,1,'2025-03-28 10:55:39','2025-03-28 10:55:39','Japanese wooden architecture represents a unique tradition that has evolved over millennia, characterized by sophisticated joinery techniques that eliminate the need for nails or screws. This architectural tradition emphasizes the natural beauty of wood and creates structures that can be dismantled and rebuilt, contributing to their longevity and sustainability.\n\nThe most remarkable aspect of Japanese wooden architecture is its ability to create large, open spaces using post-and-beam construction combined with complex bracketing systems. Temples like Hōryū-ji, the world\'s oldest surviving wooden structure, demonstrate how these techniques have created buildings that have endured for over 1,300 years.\n\nThe aesthetic principles of Japanese wooden architecture emphasize the importance of the grain and natural patterns in the wood, often leaving it unfinished or minimally treated to maintain its natural beauty. This approach reflects the broader Japanese aesthetic principle of finding beauty in simplicity and natural materials.','Traditional Japanese Wood Architecture','','publish','open','open','','traditional-japanese-wood-architecture','','','2025-03-28 11:33:07','2025-03-28 11:33:07','',0,'https://example.com/?p=4',0,'post','',0),(17,1,'2025-03-28 10:54:39','2025-03-28 10:54:39','Feng Shui principles have profoundly influenced Oriental architecture for thousands of years, shaping everything from city planning to interior design. This ancient practice of harmonizing people with their surrounding environment has created architectural guidelines that promote balance, prosperity, and well-being. The careful consideration of natural elements, cardinal directions, and energy flow has resulted in distinctive architectural features throughout East Asia.\n\nIn traditional Oriental architecture, Feng Shui principles determine crucial aspects such as building orientation, door placement, and room layout. The concept of qi (life force) flowing through buildings has led to specific architectural features like curved pathways in gardens, strategic placement of water features, and the deliberate positioning of structural elements to promote positive energy flow.\n\nModern architects continue to incorporate these ancient principles into contemporary designs, recognizing their value in creating harmonious living and working spaces. The enduring influence of Feng Shui demonstrates how traditional wisdom can inform modern architectural practices.','Feng Shui in Oriental Architecture','','publish','open','open','','feng-shui-in-oriental-architecture','','','2025-03-28 11:33:55','2025-03-28 11:33:55','',0,'https://example.com/?p=5',0,'post','',0),(19,1,'2025-03-28 11:00:31','2025-03-28 11:00:31','Islamic geometric patterns represent one of the most distinctive features of Middle Eastern architecture, combining mathematical precision with artistic beauty. These intricate designs, which adorn everything from mosque walls to palace ceilings, reflect the Islamic appreciation of unity and order in art. The patterns are based on repeated geometric shapes, creating infinite patterns that symbolize the infinite nature of Allah.\n\nThe complexity of these patterns stems from the mathematical principles of symmetry and proportion. Architects and artisans used simple tools - compass and ruler - to create designs of astounding complexity. The patterns typically begin with a basic geometric shape, such as a circle, which is then repeated, interlaced, and expanded to create elaborate star patterns and complex polygonal compositions.\n\nThese geometric patterns serve both decorative and spiritual purposes. In the absence of figurative art in religious spaces, these patterns became a primary means of architectural decoration, creating spaces of contemplation and beauty that reflect the mathematical order of the universe.','The Art of Islamic Geometric Patterns','','publish','open','open','','the-art-of-islamic-geometric-patterns','','','2025-03-28 11:27:35','2025-03-28 11:27:35','',0,'https://example.com/?p=1',0,'post','',0),(21,1,'2025-03-28 11:00:31','2025-03-28 11:00:31','Persian gardens and palaces represent a unique architectural tradition that has influenced design throughout the Middle East and beyond. The concept of the chahar bagh (four-garden) layout, with its quadrilateral design divided by waterways and walkways, creates an earthly paradise that reflects the Islamic description of heaven. These gardens are not merely decorative but represent a sophisticated understanding of hydraulics, climatology, and spatial design.\n\nThe palaces integrated within these gardens showcase the refinement of Persian architecture, with their intricate tile work, mirror mosaics, and carved stucco decorations. The interplay between indoor and outdoor spaces creates a seamless flow between architecture and nature, while clever design features like wind towers (badgirs) provide natural cooling in the harsh desert climate.\n\nFamous examples like the Golestan Palace complex in Tehran demonstrate how these architectural principles evolved over time, incorporating new influences while maintaining traditional Persian design elements. The integration of water features, shade, and carefully planned sight lines creates spaces of extraordinary beauty and comfort.','Persian Gardens and Palace Architecture','','publish','open','open','','persian-gardens-and-palace-architecture','','','2025-03-28 11:29:05','2025-03-28 11:29:05','',0,'https://example.com/?p=3',0,'post','',0),(22,1,'2025-03-28 11:00:31','2025-03-28 11:00:31','Arabic calligraphy stands as one of the most distinctive features of Middle Eastern architecture, transforming buildings into three-dimensional manuscripts. This architectural calligraphy goes beyond mere decoration, incorporating Quranic verses, poetry, and historical inscriptions that give buildings both spiritual and cultural significance. The integration of script into architectural design reached its peak during the Islamic Golden Age, creating a unique fusion of text and architecture.\n\nThe evolution of architectural calligraphy reflects the development of various Arabic scripts, from the angular Kufic to the flowing Thuluth style. Artisans developed innovative techniques to incorporate these scripts into different materials - carved in stone, molded in stucco, or crafted in tilework. The placement of calligraphy often follows careful architectural planning, with specific texts chosen for particular locations within buildings.','The Evolution of Arabic Calligraphy in Architecture','','publish','open','open','','the-evolution-of-arabic-calligraphy-in-architecture','','','2025-03-28 11:29:24','2025-03-28 11:29:24','',0,'https://example.com/?p=4',0,'post','',0),(23,1,'2025-03-28 11:00:31','2025-03-28 11:00:31','Arabesque patterns represent one of the most sophisticated developments in architectural decoration, combining floral motifs with geometric patterns to create intricate, endless designs. These flowing, interlaced patterns are characterized by a continuous stem system that produces a variety of abstract flowers, leaves, and tendrils, creating a rhythmic pattern that appears to extend infinitely in all directions.\n\nThe development of arabesque patterns reflects the Islamic artistic tradition\'s emphasis on non-representational art. These patterns serve multiple purposes: they create visual interest, demonstrate mathematical and artistic sophistication, and reflect theological concepts about the infinite nature of divine creation. The complexity of arabesque designs often increases around focal points such as mihrab niches or entrance portals.\n\nModern Middle Eastern architecture continues to incorporate arabesque patterns, often reinterpreting traditional designs through contemporary materials and techniques. This enduring influence demonstrates how historical decorative elements can be adapted for contemporary architectural expression while maintaining their cultural significance.','The Art of Arabesque in Middle Eastern Architecture','','publish','open','open','','the-art-of-arabesque-in-middle-eastern-architecture','','','2025-03-28 11:29:36','2025-03-28 11:29:36','',0,'https://example.com/?p=5',0,'post','',0),(24,1,'2025-03-28 11:03:37','0000-00-00 00:00:00','','Auto Draft','','auto-draft','open','open','','','','','2025-03-28 11:03:37','0000-00-00 00:00:00','',0,'http://echoes.local/?p=24',0,'post','',0),(25,1,'2025-03-28 11:03:37','2025-03-28 11:03:37','{\"version\": 3, \"isGlobalStylesUserThemeJSON\": true }','Custom Styles','','publish','closed','closed','','wp-global-styles-twentytwentyfive','','','2025-03-28 11:03:37','2025-03-28 11:03:37','',0,'http://echoes.local/wp-global-styles-twentytwentyfive/',0,'wp_global_styles','',0),(26,1,'2025-03-28 11:05:00','2025-03-28 11:05:00','a:38:{s:9:\"post_type\";s:8:\"building\";s:22:\"advanced_configuration\";b:1;s:13:\"import_source\";s:0:\"\";s:11:\"import_date\";s:0:\"\";s:6:\"labels\";a:33:{s:4:\"name\";s:9:\"Buildings\";s:13:\"singular_name\";s:8:\"Building\";s:9:\"menu_name\";s:9:\"Buildings\";s:9:\"all_items\";s:13:\"All Buildings\";s:9:\"edit_item\";s:13:\"Edit Building\";s:9:\"view_item\";s:13:\"View Building\";s:10:\"view_items\";s:14:\"View Buildings\";s:12:\"add_new_item\";s:16:\"Add New Building\";s:7:\"add_new\";s:16:\"Add New Building\";s:8:\"new_item\";s:12:\"New Building\";s:17:\"parent_item_colon\";s:16:\"Parent Building:\";s:12:\"search_items\";s:16:\"Search Buildings\";s:9:\"not_found\";s:18:\"No buildings found\";s:18:\"not_found_in_trash\";s:27:\"No buildings found in Trash\";s:8:\"archives\";s:17:\"Building Archives\";s:10:\"attributes\";s:19:\"Building Attributes\";s:14:\"featured_image\";s:0:\"\";s:18:\"set_featured_image\";s:0:\"\";s:21:\"remove_featured_image\";s:0:\"\";s:18:\"use_featured_image\";s:0:\"\";s:16:\"insert_into_item\";s:20:\"Insert into building\";s:21:\"uploaded_to_this_item\";s:25:\"Uploaded to this building\";s:17:\"filter_items_list\";s:21:\"Filter buildings list\";s:14:\"filter_by_date\";s:24:\"Filter buildings by date\";s:21:\"items_list_navigation\";s:25:\"Buildings list navigation\";s:10:\"items_list\";s:14:\"Buildings list\";s:14:\"item_published\";s:19:\"Building published.\";s:24:\"item_published_privately\";s:29:\"Building published privately.\";s:22:\"item_reverted_to_draft\";s:27:\"Building reverted to draft.\";s:14:\"item_scheduled\";s:19:\"Building scheduled.\";s:12:\"item_updated\";s:17:\"Building updated.\";s:9:\"item_link\";s:13:\"Building Link\";s:21:\"item_link_description\";s:21:\"A link to a building.\";}s:11:\"description\";s:0:\"\";s:6:\"public\";b:1;s:12:\"hierarchical\";b:0;s:19:\"exclude_from_search\";b:0;s:18:\"publicly_queryable\";b:1;s:7:\"show_ui\";b:1;s:12:\"show_in_menu\";b:1;s:17:\"admin_menu_parent\";s:0:\"\";s:17:\"show_in_admin_bar\";b:1;s:17:\"show_in_nav_menus\";b:1;s:12:\"show_in_rest\";b:1;s:9:\"rest_base\";s:0:\"\";s:14:\"rest_namespace\";s:5:\"wp/v2\";s:21:\"rest_controller_class\";s:24:\"WP_REST_Posts_Controller\";s:13:\"menu_position\";s:0:\"\";s:9:\"menu_icon\";a:2:{s:4:\"type\";s:9:\"dashicons\";s:5:\"value\";s:20:\"dashicons-admin-post\";}s:19:\"rename_capabilities\";b:0;s:24:\"singular_capability_name\";s:4:\"post\";s:22:\"plural_capability_name\";s:5:\"posts\";s:8:\"supports\";a:5:{i:0;s:5:\"title\";i:1;s:6:\"editor\";i:2;s:7:\"excerpt\";i:3;s:9:\"thumbnail\";i:4;s:13:\"custom-fields\";}s:10:\"taxonomies\";s:0:\"\";s:11:\"has_archive\";b:0;s:16:\"has_archive_slug\";s:0:\"\";s:7:\"rewrite\";a:4:{s:17:\"permalink_rewrite\";s:13:\"post_type_key\";s:10:\"with_front\";s:1:\"1\";s:5:\"feeds\";s:1:\"0\";s:5:\"pages\";s:1:\"1\";}s:9:\"query_var\";s:13:\"post_type_key\";s:14:\"query_var_name\";s:0:\"\";s:10:\"can_export\";b:1;s:16:\"delete_with_user\";b:0;s:20:\"register_meta_box_cb\";s:0:\"\";s:16:\"enter_title_here\";s:0:\"\";s:15:\"show_in_graphql\";i:1;s:19:\"graphql_single_name\";s:8:\"building\";s:19:\"graphql_plural_name\";s:9:\"buildings\";}','Buildings','buildings','publish','closed','closed','','post_type_67e68244b3194','','','2025-03-28 14:19:30','2025-03-28 14:19:30','',0,'http://echoes.local/?post_type=acf-post-type&p=26',0,'acf-post-type','',0),(27,1,'2025-03-28 11:05:55','2025-03-28 11:05:55','a:32:{s:8:\"taxonomy\";s:6:\"period\";s:11:\"object_type\";a:2:{i:0;s:4:\"post\";i:1;s:8:\"building\";}s:22:\"advanced_configuration\";i:1;s:13:\"import_source\";s:0:\"\";s:11:\"import_date\";s:0:\"\";s:6:\"labels\";a:25:{s:4:\"name\";s:7:\"Periods\";s:13:\"singular_name\";s:6:\"Period\";s:9:\"menu_name\";s:7:\"Periods\";s:9:\"all_items\";s:11:\"All Periods\";s:9:\"edit_item\";s:11:\"Edit Period\";s:9:\"view_item\";s:11:\"View Period\";s:11:\"update_item\";s:13:\"Update Period\";s:12:\"add_new_item\";s:14:\"Add New Period\";s:13:\"new_item_name\";s:15:\"New Period Name\";s:12:\"search_items\";s:14:\"Search Periods\";s:13:\"popular_items\";s:15:\"Popular Periods\";s:26:\"separate_items_with_commas\";s:28:\"Separate periods with commas\";s:19:\"add_or_remove_items\";s:21:\"Add or remove periods\";s:21:\"choose_from_most_used\";s:33:\"Choose from the most used periods\";s:9:\"most_used\";s:0:\"\";s:9:\"not_found\";s:16:\"No periods found\";s:8:\"no_terms\";s:10:\"No periods\";s:22:\"name_field_description\";s:0:\"\";s:22:\"slug_field_description\";s:0:\"\";s:22:\"desc_field_description\";s:0:\"\";s:21:\"items_list_navigation\";s:23:\"Periods list navigation\";s:10:\"items_list\";s:12:\"Periods list\";s:13:\"back_to_items\";s:17:\"← Go to periods\";s:9:\"item_link\";s:11:\"Period Link\";s:21:\"item_link_description\";s:18:\"A link to a period\";}s:11:\"description\";s:0:\"\";s:12:\"capabilities\";a:4:{s:12:\"manage_terms\";s:17:\"manage_categories\";s:10:\"edit_terms\";s:17:\"manage_categories\";s:12:\"delete_terms\";s:17:\"manage_categories\";s:12:\"assign_terms\";s:10:\"edit_posts\";}s:6:\"public\";i:1;s:18:\"publicly_queryable\";i:1;s:12:\"hierarchical\";i:0;s:7:\"show_ui\";i:1;s:12:\"show_in_menu\";i:1;s:17:\"show_in_nav_menus\";i:1;s:12:\"show_in_rest\";i:1;s:9:\"rest_base\";s:0:\"\";s:14:\"rest_namespace\";s:5:\"wp/v2\";s:21:\"rest_controller_class\";s:24:\"WP_REST_Terms_Controller\";s:13:\"show_tagcloud\";i:1;s:18:\"show_in_quick_edit\";i:1;s:17:\"show_admin_column\";i:0;s:7:\"rewrite\";a:3:{s:17:\"permalink_rewrite\";s:12:\"taxonomy_key\";s:10:\"with_front\";s:1:\"1\";s:20:\"rewrite_hierarchical\";s:1:\"0\";}s:9:\"query_var\";s:13:\"post_type_key\";s:14:\"query_var_name\";s:0:\"\";s:12:\"default_term\";a:1:{s:20:\"default_term_enabled\";s:1:\"0\";}s:4:\"sort\";i:0;s:8:\"meta_box\";s:7:\"default\";s:11:\"meta_box_cb\";s:0:\"\";s:20:\"meta_box_sanitize_cb\";s:0:\"\";s:15:\"show_in_graphql\";i:1;s:19:\"graphql_single_name\";s:6:\"period\";s:19:\"graphql_plural_name\";s:7:\"periods\";}','Periods','periods','publish','closed','closed','','taxonomy_67e682650f8d6','','','2025-03-28 11:05:55','2025-03-28 11:05:55','',0,'http://echoes.local/?post_type=acf-taxonomy&p=27',0,'acf-taxonomy','',0),(28,1,'2025-03-28 11:06:20','2025-03-28 11:06:20','a:32:{s:8:\"taxonomy\";s:5:\"style\";s:11:\"object_type\";a:2:{i:0;s:8:\"building\";i:1;s:4:\"post\";}s:22:\"advanced_configuration\";i:1;s:13:\"import_source\";s:0:\"\";s:11:\"import_date\";s:0:\"\";s:6:\"labels\";a:25:{s:4:\"name\";s:6:\"Styles\";s:13:\"singular_name\";s:5:\"Style\";s:9:\"menu_name\";s:5:\"Style\";s:9:\"all_items\";s:9:\"All Style\";s:9:\"edit_item\";s:10:\"Edit Style\";s:9:\"view_item\";s:10:\"View Style\";s:11:\"update_item\";s:12:\"Update Style\";s:12:\"add_new_item\";s:13:\"Add New Style\";s:13:\"new_item_name\";s:14:\"New Style Name\";s:12:\"search_items\";s:12:\"Search Style\";s:13:\"popular_items\";s:13:\"Popular Style\";s:26:\"separate_items_with_commas\";s:26:\"Separate style with commas\";s:19:\"add_or_remove_items\";s:19:\"Add or remove style\";s:21:\"choose_from_most_used\";s:31:\"Choose from the most used style\";s:9:\"most_used\";s:0:\"\";s:9:\"not_found\";s:14:\"No style found\";s:8:\"no_terms\";s:8:\"No style\";s:22:\"name_field_description\";s:0:\"\";s:22:\"slug_field_description\";s:0:\"\";s:22:\"desc_field_description\";s:0:\"\";s:21:\"items_list_navigation\";s:21:\"Style list navigation\";s:10:\"items_list\";s:10:\"Style list\";s:13:\"back_to_items\";s:15:\"← Go to style\";s:9:\"item_link\";s:10:\"Style Link\";s:21:\"item_link_description\";s:17:\"A link to a style\";}s:11:\"description\";s:0:\"\";s:12:\"capabilities\";a:4:{s:12:\"manage_terms\";s:17:\"manage_categories\";s:10:\"edit_terms\";s:17:\"manage_categories\";s:12:\"delete_terms\";s:17:\"manage_categories\";s:12:\"assign_terms\";s:10:\"edit_posts\";}s:6:\"public\";i:1;s:18:\"publicly_queryable\";i:1;s:12:\"hierarchical\";i:0;s:7:\"show_ui\";i:1;s:12:\"show_in_menu\";i:1;s:17:\"show_in_nav_menus\";i:1;s:12:\"show_in_rest\";i:1;s:9:\"rest_base\";s:0:\"\";s:14:\"rest_namespace\";s:5:\"wp/v2\";s:21:\"rest_controller_class\";s:24:\"WP_REST_Terms_Controller\";s:13:\"show_tagcloud\";i:1;s:18:\"show_in_quick_edit\";i:1;s:17:\"show_admin_column\";i:0;s:7:\"rewrite\";a:3:{s:17:\"permalink_rewrite\";s:12:\"taxonomy_key\";s:10:\"with_front\";s:1:\"1\";s:20:\"rewrite_hierarchical\";s:1:\"0\";}s:9:\"query_var\";s:13:\"post_type_key\";s:14:\"query_var_name\";s:0:\"\";s:12:\"default_term\";a:1:{s:20:\"default_term_enabled\";s:1:\"0\";}s:4:\"sort\";i:0;s:8:\"meta_box\";s:7:\"default\";s:11:\"meta_box_cb\";s:0:\"\";s:20:\"meta_box_sanitize_cb\";s:0:\"\";s:15:\"show_in_graphql\";i:1;s:19:\"graphql_single_name\";s:5:\"style\";s:19:\"graphql_plural_name\";s:5:\"style\";}','Styles','styles','trash','closed','closed','','taxonomy_67e68296e2309__trashed','','','2025-03-28 12:40:34','2025-03-28 12:40:34','',0,'http://echoes.local/?post_type=acf-taxonomy&p=28',0,'acf-taxonomy','',0),(30,1,'2025-03-28 11:04:07','2025-03-28 11:04:07','The Inca civilization\'s most remarkable architectural achievement was their sophisticated stone masonry technique. Without the use of mortar, they created structures of such precision that even today, it\'s impossible to insert a knife blade between the stones. This technique, known as ashlar masonry, involved fitting massive stone blocks together like a complex three-dimensional puzzle, with each stone cut to perfectly match its neighbors.\n\nThe engineering principles behind Inca stone construction were remarkably advanced. The stones were cut to fit together in an interlocking pattern that made buildings extremely stable and earthquake-resistant. The slight inward tilt of walls, trapezoidal doorways, and rounded corners further enhanced structural stability, while the careful placement of stones created natural drainage systems that have preserved these structures for centuries.\n\nPerhaps most impressive is that these architectural feats were accomplished without the use of metal tools, the wheel, or any written language to record their techniques. The Inca builders relied on an intricate system of knotted cords called quipus for measurements and used stone hammers and bronze tools to achieve their remarkable precision.','Inca Stone Masonry: Engineering Marvel of the Ancient Americas','','publish','open','open','','inca-stone-masonry-engineering-marvel-of-the-ancient-americas','','','2025-03-28 11:25:04','2025-03-28 11:25:04','',0,'https://example.com/?p=1',0,'post','',0),(31,1,'2025-03-28 11:04:07','2025-03-28 11:04:07','Mayan pyramids represent some of the most sophisticated astronomical observatories ever created in the ancient world. These structures were not just ceremonial centers but precise calendrical tools that tracked celestial movements. The famous pyramid of Kukulcán at Chichen Itza, for example, is designed so that during the spring and autumn equinoxes, the play of sunlight and shadow creates the appearance of a serpent descending the northern stairway.\n\nThe architectural design of Mayan pyramids typically followed strict mathematical and astronomical principles. Many pyramids were built with exactly 365 steps, one for each day of the year, while their orientation and alignment were precisely calculated to mark important celestial events. The structures often featured multiple layers, with each new layer corresponding to different periods in Maya chronology.','Mayan Pyramids: Sacred Architecture of Time and Space','','publish','open','open','','mayan-pyramids-sacred-architecture-of-time-and-space','','','2025-03-28 11:25:35','2025-03-28 11:25:35','',0,'https://example.com/?p=2',0,'post','',0),(32,1,'2025-03-28 11:04:07','2025-03-28 11:04:07','The agricultural terraces of the Inca Empire represent one of the most impressive feats of ancient engineering and architectural innovation. These andenes (terraced fields) transformed steep mountain slopes into fertile farmland, creating microclimates that could sustain crops at altitudes where agriculture would otherwise be impossible. The terraces at sites like Moray served as agricultural laboratories where the Inca could study the effects of different growing conditions.\n\nThe construction of these terraces involved sophisticated engineering principles. Each terrace level was built with layers of stone, gravel, and soil that provided excellent drainage and prevented erosion. The stone retaining walls were slightly inclined inward to resist the pressure of the earth behind them, while sophisticated drainage systems helped prevent water accumulation that could destabilize the structures.\n\nBeyond their practical function, these terraces created stunning visual effects, transforming entire mountainsides into giant green staircases that followed the natural contours of the landscape. Sites like Machu Picchu demonstrate how the Inca seamlessly integrated agricultural functionality with aesthetic and ceremonial considerations.','Agricultural Terraces of the Inca Empire','','publish','open','open','','agricultural-terraces-of-the-inca-empire','','','2025-03-28 11:26:24','2025-03-28 11:26:24','',0,'https://example.com/?p=3',0,'post','',0),(301,1,'2025-03-28 11:15:57','2025-03-28 11:15:57','

Overview

\nNotre-Dame Cathedral stands as one of the finest examples of French Gothic architecture. Construction began in 1163 and was largely completed by 1345. The cathedral\'s architectural innovations, including its pioneering use of the rib vault and flying buttress, set new standards for medieval architecture.\n

Architectural Features

\n
    \n
  • Flying buttresses
  • \n
  • Pointed arches
  • \n
  • Ribbed vaults
  • \n
  • Rose windows
  • \n
  • Twin western towers
  • \n
\n

Dimensions

\nHeight: 69 meters (towers)\nLength: 128 meters\nWidth: 48 meters\n

Historical Significance

\nThe cathedral has served as the religious heart of Paris for centuries and represents the peak of French Gothic architectural achievement. Its construction spanned multiple architectural phases, showcasing the evolution of Gothic style.','Notre-Dame Cathedral, Paris','','publish','closed','closed','','notre-dame-cathedral-paris','','','2025-03-28 11:40:52','2025-03-28 11:40:52','',0,'https://example.com/building/?p=301',0,'building','',0),(302,1,'2025-03-28 11:15:57','2025-03-28 11:15:57','

Overview

\nDurham Cathedral represents the most complete survival of a Norman monastic cathedral church in England. Built between 1093 and 1133, it showcases innovative architectural solutions including the first known example of pointed ribbed vaults.\n

Architectural Features

\n
    \n
  • Ribbed vaulting
  • \n
  • Massive cylindrical piers
  • \n
  • Geometric stone patterns
  • \n
  • Galilee Chapel
  • \n
  • Central tower
  • \n
\n

Dimensions

\nHeight: 66 meters (central tower)\nLength: 143 meters\nWidth: 30 meters (nave)\n

Historical Significance

\nThe cathedral represents the height of Norman architectural achievement and serves as a prototype for later Gothic developments in architecture.','Durham Cathedral','','publish','closed','closed','','durham-cathedral','','','2025-03-28 11:41:00','2025-03-28 11:41:00','',0,'https://example.com/building/?p=302',0,'building','',0),(303,1,'2025-03-28 11:15:57','2025-03-28 11:15:57','

Overview

\nThe Château de Loches is one of the best-preserved medieval castles in France. Built in the 9th century and expanded through the 14th century, it exemplifies medieval military architecture with its massive keep and fortified walls.\n

Architectural Features

\n
    \n
  • Square stone keep
  • \n
  • Defensive walls
  • \n
  • Arrow slits
  • \n
  • Machicolations
  • \n
  • Drawbridge
  • \n
\n

Dimensions

\nKeep height: 36 meters\nWall thickness: up to 3 meters\nSite area: 1.5 hectares\n

Historical Significance

\nThe castle served as both a military stronghold and royal residence, demonstrating the evolution of medieval defensive architecture.','Château de Loches','','publish','closed','closed','','chateau-de-loches','','','2025-03-28 11:41:08','2025-03-28 11:41:08','',0,'https://example.com/building/?p=303',0,'building','',0),(304,1,'2025-03-28 11:15:57','2025-03-28 11:15:57','

Overview

\nSalisbury Cathedral, built between 1220 and 1258, represents the epitome of Early English Gothic architecture. Its spire, added in the 14th century, is the tallest medieval church spire in Britain.\n

Architectural Features

\n
    \n
  • Pointed spire
  • \n
  • Lancet windows
  • \n
  • Vaulted ceiling
  • \n
  • Flying buttresses
  • \n
  • Cloisters
  • \n
\n

Dimensions

\nSpire height: 123 meters\nLength: 134 meters\nWidth: 52 meters\n

Historical Significance

\nThe cathedral showcases the transition from Early English to Decorated Gothic styles and houses one of the four surviving copies of the Magna Carta.','Salisbury Cathedral','','publish','closed','closed','','salisbury-cathedral','','','2025-03-28 11:41:15','2025-03-28 11:41:15','',0,'https://example.com/building/?p=304',0,'building','',0),(305,1,'2025-03-28 11:15:57','2025-03-28 11:15:57','

Overview

\nSainte-Chapelle, completed in 1248, represents the highest achievement of Rayonnant Gothic architecture. The chapel was built to house Christ\'s Crown of Thorns and other precious relics.\n

Architectural Features

\n
    \n
  • Stained glass walls
  • \n
  • Two-story chapel design
  • \n
  • Slender columns
  • \n
  • Intricate tracery
  • \n
  • Pointed spire
  • \n
\n

Dimensions

\nHeight: 42.5 meters\nLength: 36 meters\nWidth: 17 meters\n

Historical Significance

\nThe chapel is considered one of the highest achievements of the Rayonnant period of Gothic architecture, featuring the most extensive 13th-century stained glass collection anywhere in the world.','Saint-Chapelle','','publish','closed','closed','','saint-chapelle','','','2025-03-28 11:41:22','2025-03-28 11:41:22','',0,'https://example.com/building/?p=305',0,'building','',0),(307,1,'2025-03-28 11:18:27','2025-03-28 11:18:27','

Overview

\nThe Great Mosque of Damascus, also known as the Umayyad Mosque, was completed in 715 CE and stands as one of the oldest and largest mosques in the world. The building represents a remarkable fusion of Byzantine and Islamic architectural traditions.\n

Architectural Features

\n
    \n
  • Three minarets
  • \n
  • Large courtyard
  • \n
  • Byzantine-style mosaics
  • \n
  • Prayer hall with central nave
  • \n
  • Marble floors and columns
  • \n
\n

Dimensions

\nTotal area: 4 hectares\nCourtyard: 122 x 50 meters\nPrayer hall: 136 x 37 meters\n

Historical Significance

\nThe mosque represents the architectural achievement of the Umayyad dynasty and set the standard for mosque architecture throughout the Islamic world.','Great Mosque of Damascus','','publish','closed','closed','','great-mosque-of-damascus','','','2025-03-28 11:39:22','2025-03-28 11:39:22','',0,'https://example.com/building/?p=306',0,'building','',0),(308,1,'2025-03-28 11:18:27','2025-03-28 11:18:27','

Overview

\nFounded in 970 CE, Al-Azhar Mosque represents the finest Fatimid architecture in Egypt. It was established as both a mosque and a center of learning, becoming one of the world\'s oldest operating universities.\n

Architectural Features

\n
    \n
  • Five minarets from different periods
  • \n
  • Multiple prayer halls
  • \n
  • Pointed arches
  • \n
  • Decorated mihrab
  • \n
  • Central courtyard
  • \n
\n

Dimensions

\nTotal area: 3 hectares\nMain prayer hall: 80 x 50 meters\nTallest minaret: 84 meters\n

Historical Significance

\nThe mosque showcases the evolution of Islamic architecture through various historical periods and remains a crucial center of Islamic learning.','Al-Azhar Mosque','','publish','closed','closed','','al-azhar-mosque','','','2025-03-28 11:39:37','2025-03-28 11:39:37','',0,'https://example.com/building/?p=307',0,'building','',0),(309,1,'2025-03-28 11:18:27','2025-03-28 11:18:27','

Overview

\nThe Citadel of Aleppo is one of the oldest and largest castles in the world. While the site has been occupied since the 3rd millennium BCE, the current structure dates mainly from the 12th and 13th centuries.\n

Architectural Features

\n
    \n
  • Massive stone walls
  • \n
  • Entrance bridge complex
  • \n
  • Great Mosque within the citadel
  • \n
  • Underground passages
  • \n
  • Defensive towers
  • \n
\n

Dimensions

\nHeight: 50 meters above city level\nTotal area: 4.5 hectares\nWall thickness: up to 3 meters\n

Historical Significance

\nThe citadel represents the pinnacle of medieval Islamic military architecture and demonstrates the evolution of fortress design during the Crusader period.','Citadel of Aleppo','','publish','closed','closed','','citadel-of-aleppo','','','2025-03-28 11:40:19','2025-03-28 11:40:19','',0,'https://example.com/building/?p=308',0,'building','',0),(310,1,'2025-03-28 11:18:27','2025-03-28 11:18:27','

Overview

\nBuilt in 1233 CE in Baghdad, the Al-Mustansiriya Madrasah is one of the oldest examples of Islamic architectural educational institutions. It represents the sophistication of Abbasid architecture and academic tradition.\n

Architectural Features

\n
    \n
  • Four-iwan design
  • \n
  • Central courtyard
  • \n
  • Student cells
  • \n
  • Decorative brickwork
  • \n
  • Water clock system
  • \n
\n

Dimensions

\nBuilding length: 106 meters\nWidth: 48 meters\nCourtyard: 40 x 30 meters\n

Historical Significance

\nThe madrasah serves as a prime example of medieval Islamic educational architecture and the integration of academic and religious spaces.','Al-Mustansiriya Madrasah','','publish','closed','closed','','al-mustansiriya-madrasah','','','2025-03-28 11:40:30','2025-03-28 11:40:30','',0,'https://example.com/building/?p=309',0,'building','',0),(311,1,'2025-03-28 11:18:27','2025-03-28 11:18:27','

Overview

\nKrak des Chevaliers, built in the 12th century, is one of the best-preserved Crusader castles in the world. It represents the height of medieval military architecture, combining European and Middle Eastern defensive features.\n

Architectural Features

\n
    \n
  • Concentric castle design
  • \n
  • Multiple baileys
  • \n
  • Gothic elements in chapel
  • \n
  • Massive towers
  • \n
  • Elaborate defensive systems
  • \n
\n

Dimensions

\nCastle area: 3 hectares\nOuter wall length: 270 meters\nWall height: up to 30 meters\n

Historical Significance

\nThe castle exemplifies the synthesis of Western and Eastern military architecture during the Crusader period and stands as one of the most important preserved medieval castles.','Krak des Chevaliers','','publish','closed','closed','','krak-des-chevaliers','','','2025-03-28 11:40:38','2025-03-28 11:40:38','',0,'https://example.com/building/?p=310',0,'building','',0),(313,1,'2025-03-28 11:20:35','2025-03-28 11:20:35','

Overview

\nTodaiji Temple, constructed in 752 CE, is one of Japan\'s most historically significant temples. The Great Buddha Hall (Daibutsuden) remains the world\'s largest wooden building, despite being rebuilt in 1709 at two-thirds its original size.\n

Architectural Features

\n
    \n
  • Massive wooden structure
  • \n
  • Traditional bracketing system
  • \n
  • Central Buddha statue
  • \n
  • Curved roof lines
  • \n
  • Symmetrical design
  • \n
\n

Dimensions

\nHeight: 48.7 meters\nWidth: 57 meters\nDepth: 50.5 meters\n

Historical Significance

\nThe temple represents the pinnacle of ancient Japanese wooden architecture and served as the head temple of all provincial Buddhist temples.','Todaiji Temple','','publish','closed','closed','','todaiji-temple','','','2025-03-28 11:37:00','2025-03-28 11:37:00','',0,'https://example.com/building/?p=311',0,'building','',0),(314,1,'2025-03-28 11:20:35','2025-03-28 11:20:35','

Overview

\nThe Forbidden City, constructed between 1406 and 1420, represents the pinnacle of Chinese imperial architecture. The complex demonstrates perfect symmetry and hierarchy in traditional Chinese architecture.\n

Architectural Features

\n
    \n
  • Yellow glazed roof tiles
  • \n
  • Dougong bracket system
  • \n
  • Red walls
  • \n
  • Marble terraces
  • \n
  • Ceremonial gates
  • \n
\n

Dimensions

\nTotal area: 72 hectares\nBuildings: 980\nRooms: 8,707\n

Historical Significance

\nThe palace complex exemplifies traditional Chinese architecture\'s principles of symmetry, hierarchy, and cosmic symbolism.','Forbidden City Imperial Palace','','publish','closed','closed','','forbidden-city-imperial-palace','','','2025-03-28 11:37:51','2025-03-28 11:37:51','',0,'https://example.com/building/?p=312',0,'building','',0),(315,1,'2025-03-28 11:20:35','2025-03-28 11:20:35','

Overview

\nBuilt in 751 CE during the Silla Dynasty, Bulguksa Temple represents the golden age of Buddhist art in Korea. The temple complex showcases the unique characteristics of Korean Buddhist architecture.\n

Architectural Features

\n
    \n
  • Stone terraces
  • \n
  • Twin stone pagodas
  • \n
  • Wooden halls
  • \n
  • Stone bridges
  • \n
  • Decorative brackets
  • \n
\n

Dimensions

\nTemple grounds: 8 hectares\nMain hall width: 23 meters\nPagoda height: 10.4 meters\n

Historical Significance

\nThe temple exemplifies the adaptation of Buddhist architecture to Korean aesthetic and architectural traditions.','Bulguksa Temple','','publish','closed','closed','','bulguksa-temple','','','2025-03-28 11:37:58','2025-03-28 11:37:58','',0,'https://example.com/building/?p=313',0,'building','',0),(316,1,'2025-03-28 11:20:35','2025-03-28 11:20:35','

Overview

\nBuilt in 652 during the Tang Dynasty, the Giant Wild Goose Pagoda in Xi\'an is a masterpiece of Chinese Buddhist architecture. Originally five stories tall, it was later expanded to seven stories.\n

Architectural Features

\n
    \n
  • Brick construction
  • \n
  • Multi-tiered eaves
  • \n
  • Internal staircase
  • \n
  • Carved Buddha images
  • \n
  • Square base design
  • \n
\n

Dimensions

\nHeight: 64 meters\nBase width: 25 meters\nStories: 7\n

Historical Significance

\nThe pagoda served as a repository for Buddhist scriptures and marked the eastern spread of Buddhism along the Silk Road.','Giant Wild Goose Pagoda','','publish','closed','closed','','giant-wild-goose-pagoda','','','2025-03-28 11:38:08','2025-03-28 11:38:08','',0,'https://example.com/building/?p=314',0,'building','',0),(317,1,'2025-03-28 11:20:35','2025-03-28 11:20:35','

Overview

\nBuilt in 1053, the Phoenix Hall of Byodo-in Temple is one of the few remaining examples of Heian period architecture in Japan. Its unique wing-like design represents the tail feathers of a phoenix.\n

Architectural Features

\n
    \n
  • Central hall with flanking wings
  • \n
  • Curved roof lines
  • \n
  • Reflected pond design
  • \n
  • Gilded phoenix ornaments
  • \n
  • Interior Buddha statue
  • \n
\n

Dimensions

\nBuilding width: 24 meters\nCorridor length: 33 meters\nCentral hall height: 11 meters\n

Historical Significance

\nThe building represents the peak of Fujiwara period architecture and the adaptation of Buddhist temple design to Japanese aesthetic principles.','Byodo-in Phoenix Hall','','publish','closed','closed','','byodo-in-phoenix-hall','','','2025-03-28 11:38:25','2025-03-28 11:38:25','',0,'https://example.com/building/?p=315',0,'building','',0),(320,1,'2025-03-28 11:23:35','2025-03-28 11:23:35','','tim-mossholder-dqxr8A7Twwc-unsplash','Photo by Tim Mossholder on Unsplash','inherit','open','closed','','tim-mossholder-dqxr8a7twwc-unsplash','','','2025-03-28 11:24:02','2025-03-28 11:24:02','',0,'http://echoes.local/wp-content/uploads/2025/03/tim-mossholder-dqxr8A7Twwc-unsplash.jpg',0,'attachment','image/jpeg',0),(322,1,'2025-03-28 11:24:51','2025-03-28 11:24:51','','sebastian-tapia-huerta-5qba-p9ahTE-unsplash','Photo by Sebastian Tapia Huerta on Unsplash','inherit','open','closed','','sebastian-tapia-huerta-5qba-p9ahte-unsplash','','','2025-03-28 11:25:02','2025-03-28 11:25:02','',30,'http://echoes.local/wp-content/uploads/2025/03/sebastian-tapia-huerta-5qba-p9ahTE-unsplash.jpg',0,'attachment','image/jpeg',0),(323,1,'2025-03-28 11:25:04','2025-03-28 11:25:04','The Inca civilization\'s most remarkable architectural achievement was their sophisticated stone masonry technique. Without the use of mortar, they created structures of such precision that even today, it\'s impossible to insert a knife blade between the stones. This technique, known as ashlar masonry, involved fitting massive stone blocks together like a complex three-dimensional puzzle, with each stone cut to perfectly match its neighbors.\n\nThe engineering principles behind Inca stone construction were remarkably advanced. The stones were cut to fit together in an interlocking pattern that made buildings extremely stable and earthquake-resistant. The slight inward tilt of walls, trapezoidal doorways, and rounded corners further enhanced structural stability, while the careful placement of stones created natural drainage systems that have preserved these structures for centuries.\n\nPerhaps most impressive is that these architectural feats were accomplished without the use of metal tools, the wheel, or any written language to record their techniques. The Inca builders relied on an intricate system of knotted cords called quipus for measurements and used stone hammers and bronze tools to achieve their remarkable precision.','Inca Stone Masonry: Engineering Marvel of the Ancient Americas','','inherit','closed','closed','','30-revision-v1','','','2025-03-28 11:25:04','2025-03-28 11:25:04','',30,'http://echoes.local/?p=323',0,'revision','',0),(324,1,'2025-03-28 11:25:35','2025-03-28 11:25:35','Mayan pyramids represent some of the most sophisticated astronomical observatories ever created in the ancient world. These structures were not just ceremonial centers but precise calendrical tools that tracked celestial movements. The famous pyramid of Kukulcán at Chichen Itza, for example, is designed so that during the spring and autumn equinoxes, the play of sunlight and shadow creates the appearance of a serpent descending the northern stairway.\n\nThe architectural design of Mayan pyramids typically followed strict mathematical and astronomical principles. Many pyramids were built with exactly 365 steps, one for each day of the year, while their orientation and alignment were precisely calculated to mark important celestial events. The structures often featured multiple layers, with each new layer corresponding to different periods in Maya chronology.','Mayan Pyramids: Sacred Architecture of Time and Space','','inherit','closed','closed','','31-revision-v1','','','2025-03-28 11:25:35','2025-03-28 11:25:35','',31,'http://echoes.local/?p=324',0,'revision','',0),(326,1,'2025-03-28 11:26:24','2025-03-28 11:26:24','The agricultural terraces of the Inca Empire represent one of the most impressive feats of ancient engineering and architectural innovation. These andenes (terraced fields) transformed steep mountain slopes into fertile farmland, creating microclimates that could sustain crops at altitudes where agriculture would otherwise be impossible. The terraces at sites like Moray served as agricultural laboratories where the Inca could study the effects of different growing conditions.\n\nThe construction of these terraces involved sophisticated engineering principles. Each terrace level was built with layers of stone, gravel, and soil that provided excellent drainage and prevented erosion. The stone retaining walls were slightly inclined inward to resist the pressure of the earth behind them, while sophisticated drainage systems helped prevent water accumulation that could destabilize the structures.\n\nBeyond their practical function, these terraces created stunning visual effects, transforming entire mountainsides into giant green staircases that followed the natural contours of the landscape. Sites like Machu Picchu demonstrate how the Inca seamlessly integrated agricultural functionality with aesthetic and ceremonial considerations.','Agricultural Terraces of the Inca Empire','','inherit','closed','closed','','32-revision-v1','','','2025-03-28 11:26:24','2025-03-28 11:26:24','',32,'http://echoes.local/?p=326',0,'revision','',0),(327,1,'2025-03-28 11:27:29','2025-03-28 11:27:29','','alim-twul1x77QEo-unsplash','Photo by Alim on Unsplash','inherit','open','closed','','alim-twul1x77qeo-unsplash','','','2025-03-28 11:27:33','2025-03-28 11:27:33','',19,'http://echoes.local/wp-content/uploads/2025/03/alim-twul1x77QEo-unsplash.jpg',0,'attachment','image/jpeg',0),(328,1,'2025-03-28 11:27:34','2025-03-28 11:27:34','Islamic geometric patterns represent one of the most distinctive features of Middle Eastern architecture, combining mathematical precision with artistic beauty. These intricate designs, which adorn everything from mosque walls to palace ceilings, reflect the Islamic appreciation of unity and order in art. The patterns are based on repeated geometric shapes, creating infinite patterns that symbolize the infinite nature of Allah.\n\nThe complexity of these patterns stems from the mathematical principles of symmetry and proportion. Architects and artisans used simple tools - compass and ruler - to create designs of astounding complexity. The patterns typically begin with a basic geometric shape, such as a circle, which is then repeated, interlaced, and expanded to create elaborate star patterns and complex polygonal compositions.\n\nThese geometric patterns serve both decorative and spiritual purposes. In the absence of figurative art in religious spaces, these patterns became a primary means of architectural decoration, creating spaces of contemplation and beauty that reflect the mathematical order of the universe.','The Art of Islamic Geometric Patterns','','inherit','closed','closed','','19-autosave-v1','','','2025-03-28 11:27:34','2025-03-28 11:27:34','',19,'http://echoes.local/?p=328',0,'revision','',0),(329,1,'2025-03-28 11:27:35','2025-03-28 11:27:35','Islamic geometric patterns represent one of the most distinctive features of Middle Eastern architecture, combining mathematical precision with artistic beauty. These intricate designs, which adorn everything from mosque walls to palace ceilings, reflect the Islamic appreciation of unity and order in art. The patterns are based on repeated geometric shapes, creating infinite patterns that symbolize the infinite nature of Allah.\n\nThe complexity of these patterns stems from the mathematical principles of symmetry and proportion. Architects and artisans used simple tools - compass and ruler - to create designs of astounding complexity. The patterns typically begin with a basic geometric shape, such as a circle, which is then repeated, interlaced, and expanded to create elaborate star patterns and complex polygonal compositions.\n\nThese geometric patterns serve both decorative and spiritual purposes. In the absence of figurative art in religious spaces, these patterns became a primary means of architectural decoration, creating spaces of contemplation and beauty that reflect the mathematical order of the universe.','The Art of Islamic Geometric Patterns','','inherit','closed','closed','','19-revision-v1','','','2025-03-28 11:27:35','2025-03-28 11:27:35','',19,'http://echoes.local/?p=329',0,'revision','',0),(330,1,'2025-03-28 11:28:12','2025-03-28 11:28:12','','junhan-foong-ERLAcTp-8MQ-unsplash','Photo by Junhan Foong on Unsplash','inherit','open','closed','','junhan-foong-erlactp-8mq-unsplash','','','2025-03-28 11:28:15','2025-03-28 11:28:15','',0,'http://echoes.local/wp-content/uploads/2025/03/junhan-foong-ERLAcTp-8MQ-unsplash.jpg',0,'attachment','image/jpeg',0),(332,1,'2025-03-28 11:28:39','2025-03-28 11:28:39','Persian gardens and palaces represent a unique architectural tradition that has influenced design throughout the Middle East and beyond. The concept of the chahar bagh (four-garden) layout, with its quadrilateral design divided by waterways and walkways, creates an earthly paradise that reflects the Islamic description of heaven. These gardens are not merely decorative but represent a sophisticated understanding of hydraulics, climatology, and spatial design.\n\nThe palaces integrated within these gardens showcase the refinement of Persian architecture, with their intricate tile work, mirror mosaics, and carved stucco decorations. The interplay between indoor and outdoor spaces creates a seamless flow between architecture and nature, while clever design features like wind towers (badgirs) provide natural cooling in the harsh desert climate.\n\nFamous examples like the Golestan Palace complex in Tehran demonstrate how these architectural principles evolved over time, incorporating new influences while maintaining traditional Persian design elements. The integration of water features, shade, and carefully planned sight lines creates spaces of extraordinary beauty and comfort.','Persian Gardens and Palace Architecture','','inherit','closed','closed','','21-autosave-v1','','','2025-03-28 11:28:39','2025-03-28 11:28:39','',21,'http://echoes.local/?p=332',0,'revision','',0),(333,1,'2025-03-28 11:28:58','2025-03-28 11:28:58','','let-s-see-persia-c8dFTAYI0-8-unsplash','Photo by let\'s see persia on Unsplash','inherit','open','closed','','let-s-see-persia-c8dftayi0-8-unsplash','','','2025-03-28 11:29:03','2025-03-28 11:29:03','',21,'http://echoes.local/wp-content/uploads/2025/03/let-s-see-persia-c8dFTAYI0-8-unsplash.jpg',0,'attachment','image/jpeg',0),(334,1,'2025-03-28 11:29:05','2025-03-28 11:29:05','Persian gardens and palaces represent a unique architectural tradition that has influenced design throughout the Middle East and beyond. The concept of the chahar bagh (four-garden) layout, with its quadrilateral design divided by waterways and walkways, creates an earthly paradise that reflects the Islamic description of heaven. These gardens are not merely decorative but represent a sophisticated understanding of hydraulics, climatology, and spatial design.\n\nThe palaces integrated within these gardens showcase the refinement of Persian architecture, with their intricate tile work, mirror mosaics, and carved stucco decorations. The interplay between indoor and outdoor spaces creates a seamless flow between architecture and nature, while clever design features like wind towers (badgirs) provide natural cooling in the harsh desert climate.\n\nFamous examples like the Golestan Palace complex in Tehran demonstrate how these architectural principles evolved over time, incorporating new influences while maintaining traditional Persian design elements. The integration of water features, shade, and carefully planned sight lines creates spaces of extraordinary beauty and comfort.','Persian Gardens and Palace Architecture','','inherit','closed','closed','','21-revision-v1','','','2025-03-28 11:29:05','2025-03-28 11:29:05','',21,'http://echoes.local/?p=334',0,'revision','',0),(335,1,'2025-03-28 11:29:24','2025-03-28 11:29:24','Arabic calligraphy stands as one of the most distinctive features of Middle Eastern architecture, transforming buildings into three-dimensional manuscripts. This architectural calligraphy goes beyond mere decoration, incorporating Quranic verses, poetry, and historical inscriptions that give buildings both spiritual and cultural significance. The integration of script into architectural design reached its peak during the Islamic Golden Age, creating a unique fusion of text and architecture.\n\nThe evolution of architectural calligraphy reflects the development of various Arabic scripts, from the angular Kufic to the flowing Thuluth style. Artisans developed innovative techniques to incorporate these scripts into different materials - carved in stone, molded in stucco, or crafted in tilework. The placement of calligraphy often follows careful architectural planning, with specific texts chosen for particular locations within buildings.','The Evolution of Arabic Calligraphy in Architecture','','inherit','closed','closed','','22-revision-v1','','','2025-03-28 11:29:24','2025-03-28 11:29:24','',22,'http://echoes.local/?p=335',0,'revision','',0),(336,1,'2025-03-28 11:29:36','2025-03-28 11:29:36','Arabesque patterns represent one of the most sophisticated developments in architectural decoration, combining floral motifs with geometric patterns to create intricate, endless designs. These flowing, interlaced patterns are characterized by a continuous stem system that produces a variety of abstract flowers, leaves, and tendrils, creating a rhythmic pattern that appears to extend infinitely in all directions.\n\nThe development of arabesque patterns reflects the Islamic artistic tradition\'s emphasis on non-representational art. These patterns serve multiple purposes: they create visual interest, demonstrate mathematical and artistic sophistication, and reflect theological concepts about the infinite nature of divine creation. The complexity of arabesque designs often increases around focal points such as mihrab niches or entrance portals.\n\nModern Middle Eastern architecture continues to incorporate arabesque patterns, often reinterpreting traditional designs through contemporary materials and techniques. This enduring influence demonstrates how historical decorative elements can be adapted for contemporary architectural expression while maintaining their cultural significance.','The Art of Arabesque in Middle Eastern Architecture','','inherit','closed','closed','','23-revision-v1','','','2025-03-28 11:29:36','2025-03-28 11:29:36','',23,'http://echoes.local/?p=336',0,'revision','',0),(337,1,'2025-03-28 11:30:36','2025-03-28 11:30:36','','clay-banks-8pFh9JUcQOY-unsplash','Photo by Clay Banks on Unsplash','inherit','open','closed','','clay-banks-8pfh9jucqoy-unsplash','','','2025-03-28 11:30:39','2025-03-28 11:30:39','',13,'http://echoes.local/wp-content/uploads/2025/03/clay-banks-8pFh9JUcQOY-unsplash.jpg',0,'attachment','image/jpeg',0),(338,1,'2025-03-28 11:30:41','2025-03-28 11:30:41','Chinese pagodas represent some of the most iconic structures in Oriental architecture, serving as both religious monuments and symbols of cultural identity. These multi-tiered towers, evolving from Indian stupas, have become distinctive features of the Chinese landscape. Each level of a pagoda typically features characteristic upturned eaves, creating a visual rhythm that draws the eye skyward.\n\nThe engineering behind these structures is remarkably sophisticated, incorporating innovative techniques for earthquake resistance and weight distribution. The use of a central pillar, known as the \"heart pillar,\" combined with sophisticated bracketing systems, allows these towers to maintain their stability despite their impressive heights. Many ancient pagodas have survived centuries of natural disasters, testament to their ingenious construction methods.\n\nBeyond their structural brilliance, pagodas also serve as repositories of Buddhist relics and sacred texts, making them important centers of spiritual life. Their placement often follows precise feng shui principles, ensuring harmony with the surrounding landscape and optimal energy flow.','The Ancient Art of Chinese Pagodas','','inherit','closed','closed','','13-revision-v1','','','2025-03-28 11:30:41','2025-03-28 11:30:41','',13,'http://echoes.local/?p=338',0,'revision','',0),(339,1,'2025-03-28 11:31:13','2025-03-28 11:31:13','','pepe-nero-JsSM2T9iPRU-unsplash','Photo by pepe nero on Unsplash','inherit','open','closed','','pepe-nero-jssm2t9ipru-unsplash','','','2025-03-28 11:31:18','2025-03-28 11:31:18','',14,'http://echoes.local/wp-content/uploads/2025/03/pepe-nero-JsSM2T9iPRU-unsplash.jpg',0,'attachment','image/jpeg',0),(340,1,'2025-03-28 11:31:20','2025-03-28 11:31:20','Japanese Zen gardens, or karesansui, represent the epitome of minimalist architectural design in Oriental culture. These dry landscape gardens use carefully arranged rocks, gravel, and occasional plant elements to create spaces for meditation and contemplation. The architectural principles behind these gardens emphasize void spaces as much as physical elements, creating a perfect balance between presence and absence.\n\nThe design of Zen gardens follows strict principles that have been refined over centuries. The placement of each element is carefully considered, with rocks and sand patterns often representing natural landscapes in abstract forms. The surrounding architecture, including verandas and viewing pavilions, is integral to the garden experience, creating carefully framed views and meditation spaces.','Japanese Zen Gardens: Architecture of Tranquility','','inherit','closed','closed','','14-revision-v1','','','2025-03-28 11:31:20','2025-03-28 11:31:20','',14,'http://echoes.local/?p=340',0,'revision','',0),(341,1,'2025-03-28 11:31:33','2025-03-28 11:31:33','The Forbidden City stands as the ultimate expression of Chinese imperial architecture, embodying centuries of architectural wisdom and symbolic design. This vast palace complex demonstrates the sophisticated planning principles of traditional Chinese architecture, with its strict axiality, hierarchical spaces, and profound symbolic meanings embedded in every architectural detail.\n\nThe architectural features of the Forbidden City are rich with symbolism: the yellow roof tiles, exclusive to imperial buildings, the number of studs on doors indicating the rank of the building\'s occupant, and the intricate bracketing systems known as dougong that support the massive roofs without nails. The entire complex was designed according to cosmic principles, reflecting the emperor\'s role as the Son of Heaven.\n\nThe palace\'s defensive architecture is equally impressive, featuring high walls, moats, and strategic gates that created multiple layers of security. Yet within these defensive walls lie some of the most refined examples of Chinese architectural aesthetics, from delicate gardens to grand ceremonial halls.','The Forbidden City: Marvel of Imperial Chinese Architecture','','inherit','closed','closed','','15-revision-v1','','','2025-03-28 11:31:33','2025-03-28 11:31:33','',15,'http://echoes.local/?p=341',0,'revision','',0),(342,1,'2025-03-28 11:32:07','2025-03-28 11:32:07','','priscilla-fraire-_1LvAexVWa8-unsplash','Photo by Priscilla Fraire on Unsplash','inherit','open','closed','','priscilla-fraire-_1lvaexvwa8-unsplash','','','2025-03-28 11:32:11','2025-03-28 11:32:11','',7,'http://echoes.local/wp-content/uploads/2025/03/priscilla-fraire-_1LvAexVWa8-unsplash.jpg',0,'attachment','image/jpeg',0),(343,1,'2025-03-28 11:32:12','2025-03-28 11:32:12','The Gothic cathedrals of France stand as testament to medieval architectural brilliance and religious devotion. These magnificent structures, built between the 12th and 16th centuries, revolutionized architectural design with their innovative features and soaring heights. The implementation of pointed arches, ribbed vaults, and flying buttresses allowed these buildings to reach unprecedented heights while featuring walls of stained glass that seemed to defy gravity.\n\nNotre-Dame de Paris, despite recent challenges, remains one of the finest examples of French Gothic architecture. Its harmonious proportions, twin towers, and spectacular rose windows have inspired architects and artists for centuries. The cathedral\'s flying buttresses, among the first of their kind, demonstrate the innovative engineering solutions that made Gothic architecture possible.','The Magnificent Gothic Cathedrals of France','','inherit','closed','closed','','7-revision-v1','','','2025-03-28 11:32:12','2025-03-28 11:32:12','',7,'http://echoes.local/?p=343',0,'revision','',0),(344,1,'2025-03-28 11:33:02','2025-03-28 11:33:02','','alin-gavriliuc-sAkUB5aCRcs-unsplash','Photo by Alin Gavriliuc on Unsplash','inherit','open','closed','','alin-gavriliuc-sakub5acrcs-unsplash','','','2025-03-28 11:33:05','2025-03-28 11:33:05','',16,'http://echoes.local/wp-content/uploads/2025/03/alin-gavriliuc-sAkUB5aCRcs-unsplash.jpg',0,'attachment','image/jpeg',0),(345,1,'2025-03-28 11:33:07','2025-03-28 11:33:07','Japanese wooden architecture represents a unique tradition that has evolved over millennia, characterized by sophisticated joinery techniques that eliminate the need for nails or screws. This architectural tradition emphasizes the natural beauty of wood and creates structures that can be dismantled and rebuilt, contributing to their longevity and sustainability.\n\nThe most remarkable aspect of Japanese wooden architecture is its ability to create large, open spaces using post-and-beam construction combined with complex bracketing systems. Temples like Hōryū-ji, the world\'s oldest surviving wooden structure, demonstrate how these techniques have created buildings that have endured for over 1,300 years.\n\nThe aesthetic principles of Japanese wooden architecture emphasize the importance of the grain and natural patterns in the wood, often leaving it unfinished or minimally treated to maintain its natural beauty. This approach reflects the broader Japanese aesthetic principle of finding beauty in simplicity and natural materials.','Traditional Japanese Wood Architecture','','inherit','closed','closed','','16-revision-v1','','','2025-03-28 11:33:07','2025-03-28 11:33:07','',16,'http://echoes.local/?p=345',0,'revision','',0),(346,1,'2025-03-28 11:33:37','2025-03-28 11:33:37','','steve-douglas-JjEbmnY1e0w-unsplash','Photo by Steve Douglas on Unsplash','inherit','open','closed','','steve-douglas-jjebmny1e0w-unsplash','','','2025-03-28 11:33:41','2025-03-28 11:33:41','',8,'http://echoes.local/wp-content/uploads/2025/03/steve-douglas-JjEbmnY1e0w-unsplash.jpg',0,'attachment','image/jpeg',0),(347,1,'2025-03-28 11:33:42','2025-03-28 11:33:42','Medieval castles were masterpieces of defensive architecture, designed to protect their inhabitants from siege and assault. The evolution of castle design reflects the ongoing battle between defensive innovations and offensive warfare techniques. From simple wooden structures on hills, castles evolved into sophisticated stone fortresses with multiple layers of defense.\n\nThe key elements of castle defense included high stone walls, moats, drawbridges, and strategic placement on elevated ground. Concentric castles, with their multiple rings of walls, represented the pinnacle of medieval defensive architecture. These formidable structures often featured arrow slits, murder holes, and machicolations, all designed to give defenders the advantage over attacking forces.\n\nThe great keeps of these castles served not only as last-resort defensive positions but also as symbols of power and authority. Their thick walls and limited access points made them nearly impregnable when properly defended, while their impressive height served as a constant reminder of the lord\'s authority over the surrounding lands.','Medieval Castle Defense Systems','','inherit','closed','closed','','8-revision-v1','','','2025-03-28 11:33:42','2025-03-28 11:33:42','',8,'http://echoes.local/?p=347',0,'revision','',0),(348,1,'2025-03-28 11:33:55','2025-03-28 11:33:55','Feng Shui principles have profoundly influenced Oriental architecture for thousands of years, shaping everything from city planning to interior design. This ancient practice of harmonizing people with their surrounding environment has created architectural guidelines that promote balance, prosperity, and well-being. The careful consideration of natural elements, cardinal directions, and energy flow has resulted in distinctive architectural features throughout East Asia.\n\nIn traditional Oriental architecture, Feng Shui principles determine crucial aspects such as building orientation, door placement, and room layout. The concept of qi (life force) flowing through buildings has led to specific architectural features like curved pathways in gardens, strategic placement of water features, and the deliberate positioning of structural elements to promote positive energy flow.\n\nModern architects continue to incorporate these ancient principles into contemporary designs, recognizing their value in creating harmonious living and working spaces. The enduring influence of Feng Shui demonstrates how traditional wisdom can inform modern architectural practices.','Feng Shui in Oriental Architecture','','inherit','closed','closed','','17-revision-v1','','','2025-03-28 11:33:55','2025-03-28 11:33:55','',17,'http://echoes.local/?p=348',0,'revision','',0),(349,1,'2025-03-28 11:34:26','2025-03-28 11:34:26','','mario-la-pergola-dSrEUAtF3kU-unsplash','Photo by Mario La Pergola on Unsplash','inherit','open','closed','','mario-la-pergola-dsreuatf3ku-unsplash','','','2025-03-28 11:34:29','2025-03-28 11:34:29','',9,'http://echoes.local/wp-content/uploads/2025/03/mario-la-pergola-dSrEUAtF3kU-unsplash.jpg',0,'attachment','image/jpeg',0),(350,1,'2025-03-28 11:34:30','2025-03-28 11:34:30','\n \"Romanesque\n \n

Romanesque architecture, predominant in medieval Europe from the 6th to the 11th century, marked a significant evolution in building design. Characterized by its massive walls, round arches, and barrel vaults, this architectural style laid the foundation for the later Gothic period. The term \"Romanesque\" reflects the architecture\'s similarity to Roman designs, particularly in the use of round arches and vaulted ceilings.

\n\n

One of the most distinctive features of Romanesque architecture is the rounded arch, used for both structural and decorative purposes. These arches appeared in doorways, windows, and arcade sections, creating the characteristic appearance we associate with medieval churches and monasteries. The thick walls and small windows of Romanesque buildings were necessary to support the heavy stone vaults above.

\n ','Romanesque Architecture: The Round Arch Revolution','','inherit','closed','closed','','9-revision-v1','','','2025-03-28 11:34:30','2025-03-28 11:34:30','',9,'http://echoes.local/?p=350',0,'revision','',0),(352,1,'2025-03-28 11:35:28','2025-03-28 11:35:28','','jf-martin-kZjBucSSj2s-unsplash','Photo by JF Martin on Unsplash','inherit','open','closed','','jf-martin-kzjbucssj2s-unsplash','','','2025-03-28 11:35:32','2025-03-28 11:35:32','',5,'http://echoes.local/wp-content/uploads/2025/03/jf-martin-kZjBucSSj2s-unsplash.jpg',0,'attachment','image/jpeg',0),(353,1,'2025-03-28 11:35:33','2025-03-28 11:35:33','Stained glass windows were more than just decorative elements in medieval architecture; they were powerful tools for storytelling and religious education. These magnificent works of art combined innovative glass-making techniques with detailed artistic expression to create luminous scenes that transformed interior spaces. The way sunlight filtered through these colored windows was often described as \"divine light\" by medieval observers.\n\nThe creation of medieval stained glass was a complex process that required significant skill and knowledge. Craftsmen would cut colored glass into specific shapes, paint details onto the glass pieces, and join them together with lead cames. The most impressive examples of medieval stained glass can be found in Gothic cathedrals, where large rose windows and towering lancet windows create breathtaking displays of colored light.\n\nBeyond their artistic beauty, stained glass windows served as \"books of light\" for the largely illiterate medieval population, depicting biblical stories, saints\' lives, and moral lessons through their vivid imagery. The technical and artistic achievement of medieval stained glass makers continues to inspire awe and admiration today.','Stained Glass: The Medieval Art of Light','','inherit','closed','closed','','5-revision-v1','','','2025-03-28 11:35:33','2025-03-28 11:35:33','',5,'http://echoes.local/?p=353',0,'revision','',0),(355,1,'2025-03-28 11:35:49','0000-00-00 00:00:00','','Auto Draft','','auto-draft','open','open','','','','','2025-03-28 11:35:49','0000-00-00 00:00:00','',0,'http://echoes.local/?p=355',0,'post','',0),(356,1,'2025-03-28 11:40:15','2025-03-28 11:40:15','','dabbas-j0OhftYAXR4-unsplash','Photo by Dabbas on Unsplash','inherit','open','closed','','dabbas-j0ohftyaxr4-unsplash','','','2025-03-28 11:40:18','2025-03-28 11:40:18','',309,'http://echoes.local/wp-content/uploads/2025/03/dabbas-j0OhftYAXR4-unsplash.jpg',0,'attachment','image/jpeg',0),(358,1,'2025-05-16 11:05:28','2025-05-16 11:05:28','The agricultural terraces of the Inca Empire represent one of the most impressive feats of ancient engineering and architectural innovation. These andenes (terraced fields) transformed steep mountain slopes into fertile farmland, creating microclimates that could sustain crops at altitudes where agriculture would otherwise be impossible. The terraces at sites like Moray served as agricultural laboratories where the Inca could study the effects of different growing conditions.\n\nThe construction of these terraces involved sophisticated engineering principles. Each terrace level was built with layers of stone, gravel, and soil that provided excellent drainage and prevented erosion. The stone retaining walls were slightly inclined inward to resist the pressure of the earth behind them, while sophisticated drainage systems helped prevent water accumulation that could destabilize the structures.\n\nBeyond their practical function, these terraces created stunning visual effects, transforming entire mountainsides into giant green staircases that followed the natural contours of the landscape. Sites like Machu Picchu demonstrate how the Inca seamlessly integrated agricultural functionality with aesthetic and ceremonial considerations.','Agricultural Terraces of the Inca Empire','','inherit','closed','closed','','32-autosave-v1','','','2025-05-16 11:05:28','2025-05-16 11:05:28','',32,'http://localhost:8888/?p=358',0,'revision','',0),(359,1,'2025-05-15 16:17:31','2025-05-15 16:17:31','The Gothic cathedrals of France stand as testament to medieval architectural brilliance and religious devotion. These magnificent structures, built between the 12th and 16th centuries, revolutionized architectural design with their innovative features and soaring heights. The implementation of pointed arches, ribbed vaults, and flying buttresses allowed these buildings to reach unprecedented heights while featuring walls of stained glass that seemed to defy gravity.\n\nNotre-Dame de Paris, despite recent challenges, remains one of the finest examples of French Gothic architecture. Its harmonious proportions, twin towers, and spectacular rose windows have inspired architects and artists for centuries. The cathedral\'s flying buttresses, among the first of their kind, demonstrate the innovative engineering solutions that made Gothic architecture possible.','The Magnificent Gothic Cathedrals of France','','inherit','closed','closed','','7-autosave-v1','','','2025-05-15 16:17:31','2025-05-15 16:17:31','',7,'http://localhost:8888/?p=359',0,'revision','',0),(360,1,'2025-05-15 16:13:53','2025-05-15 16:13:53','

Overview

\nBuilt in 1233 CE in Baghdad, the Al-Mustansiriya Madrasah is one of the oldest examples of Islamic architectural educational institutions. It represents the sophistication of Abbasid architecture and academic tradition.\n

Architectural Features

\n
    \n
  • Four-iwan design
  • \n
  • Central courtyard
  • \n
  • Student cells
  • \n
  • Decorative brickwork
  • \n
  • Water clock system
  • \n
\n

Dimensions

\nBuilding length: 106 meters\nWidth: 48 meters\nCourtyard: 40 x 30 meters\n

Historical Significance

\nThe madrasah serves as a prime example of medieval Islamic educational architecture and the integration of academic and religious spaces.','Al-Mustansiriya Madrasah','','inherit','closed','closed','','310-autosave-v1','','','2025-05-15 16:13:53','2025-05-15 16:13:53','',310,'http://localhost:8888/?p=360',0,'revision','',0),(361,1,'2025-05-15 16:14:05','2025-05-15 16:14:05','

Overview

\nThe Château de Loches is one of the best-preserved medieval castles in France. Built in the 9th century and expanded through the 14th century, it exemplifies medieval military architecture with its massive keep and fortified walls.\n

Architectural Features

\n
    \n
  • Square stone keep
  • \n
  • Defensive walls
  • \n
  • Arrow slits
  • \n
  • Machicolations
  • \n
  • Drawbridge
  • \n
\n

Dimensions

\nKeep height: 36 meters\nWall thickness: up to 3 meters\nSite area: 1.5 hectares\n

Historical Significance

\nThe castle served as both a military stronghold and royal residence, demonstrating the evolution of medieval defensive architecture.','Château de Loches','','inherit','closed','closed','','303-autosave-v1','','','2025-05-15 16:14:05','2025-05-15 16:14:05','',303,'http://localhost:8888/?p=361',0,'revision','',0),(363,1,'2025-05-16 11:04:35','2025-05-16 11:04:35','Mayan pyramids represent some of the most sophisticated astronomical observatories ever created in the ancient world. These structures were not just ceremonial centers but precise calendrical tools that tracked celestial movements. The famous pyramid of Kukulcán at Chichen Itza, for example, is designed so that during the spring and autumn equinoxes, the play of sunlight and shadow creates the appearance of a serpent descending the northern stairway.\n\nThe architectural design of Mayan pyramids typically followed strict mathematical and astronomical principles. Many pyramids were built with exactly 365 steps, one for each day of the year, while their orientation and alignment were precisely calculated to mark important celestial events. The structures often featured multiple layers, with each new layer corresponding to different periods in Maya chronology.','Mayan Pyramids: Sacred Architecture of Time and Space','','inherit','closed','closed','','31-autosave-v1','','','2025-05-16 11:04:35','2025-05-16 11:04:35','',31,'http://localhost:8888/?p=363',0,'revision','',0),(365,1,'2025-05-16 11:05:55','2025-05-16 11:05:55','The Inca civilization\'s most remarkable architectural achievement was their sophisticated stone masonry technique. Without the use of mortar, they created structures of such precision that even today, it\'s impossible to insert a knife blade between the stones. This technique, known as ashlar masonry, involved fitting massive stone blocks together like a complex three-dimensional puzzle, with each stone cut to perfectly match its neighbors.\n\nThe engineering principles behind Inca stone construction were remarkably advanced. The stones were cut to fit together in an interlocking pattern that made buildings extremely stable and earthquake-resistant. The slight inward tilt of walls, trapezoidal doorways, and rounded corners further enhanced structural stability, while the careful placement of stones created natural drainage systems that have preserved these structures for centuries.\n\nPerhaps most impressive is that these architectural feats were accomplished without the use of metal tools, the wheel, or any written language to record their techniques. The Inca builders relied on an intricate system of knotted cords called quipus for measurements and used stone hammers and bronze tools to achieve their remarkable precision.','Inca Stone Masonry: Engineering Marvel of the Ancient Americas','','inherit','closed','closed','','30-autosave-v1','','','2025-05-16 11:05:55','2025-05-16 11:05:55','',30,'http://localhost:8888/?p=365',0,'revision','',0),(366,1,'2025-05-16 11:06:34','2025-05-16 11:06:34','

Overview

\nNotre-Dame Cathedral stands as one of the finest examples of French Gothic architecture. Construction began in 1163 and was largely completed by 1345. The cathedral\'s architectural innovations, including its pioneering use of the rib vault and flying buttress, set new standards for medieval architecture.\n

Architectural Features

\n
    \n
  • Flying buttresses
  • \n
  • Pointed arches
  • \n
  • Ribbed vaults
  • \n
  • Rose windows
  • \n
  • Twin western towers
  • \n
\n

Dimensions

\nHeight: 69 meters (towers)\nLength: 128 meters\nWidth: 48 meters\n

Historical Significance

\nThe cathedral has served as the religious heart of Paris for centuries and represents the peak of French Gothic architectural achievement. Its construction spanned multiple architectural phases, showcasing the evolution of Gothic style.','Notre-Dame Cathedral, Paris','','inherit','closed','closed','','301-autosave-v1','','','2025-05-16 11:06:34','2025-05-16 11:06:34','',301,'http://localhost:8888/?p=366',0,'revision','',0); +/*!40000 ALTER TABLE `wp_posts` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_term_relationships` +-- + +DROP TABLE IF EXISTS `wp_term_relationships`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_term_relationships` ( + `object_id` bigint(20) unsigned NOT NULL DEFAULT 0, + `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT 0, + `term_order` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`object_id`,`term_taxonomy_id`), + KEY `term_taxonomy_id` (`term_taxonomy_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_term_relationships` +-- + +LOCK TABLES `wp_term_relationships` WRITE; +/*!40000 ALTER TABLE `wp_term_relationships` DISABLE KEYS */; +INSERT INTO `wp_term_relationships` VALUES (5,2,0),(5,5,0),(5,10,0),(7,2,0),(7,5,0),(7,6,0),(7,10,0),(8,4,0),(8,8,0),(9,3,0),(9,5,0),(9,7,0),(9,8,0),(13,11,0),(13,13,0),(13,15,0),(13,19,0),(14,12,0),(14,16,0),(15,11,0),(15,14,0),(15,18,0),(16,12,0),(16,13,0),(16,17,0),(17,11,0),(17,19,0),(19,20,0),(19,23,0),(21,14,0),(21,22,0),(22,20,0),(22,24,0),(23,20,0),(23,23,0),(23,26,0),(25,28,0),(30,29,0),(30,34,0),(31,30,0),(31,32,0),(31,33,0),(31,36,0),(32,29,0),(32,34,0),(32,35,0),(301,40,0),(301,46,0),(302,42,0),(302,45,0),(303,38,0),(303,46,0),(304,39,0),(304,46,0),(305,40,0),(305,46,0),(307,38,0),(307,44,0),(308,38,0),(308,46,0),(309,42,0),(309,48,0),(310,38,0),(310,46,0),(311,39,0),(311,48,0),(313,38,0),(313,44,0),(314,38,0),(314,47,0),(315,38,0),(315,44,0),(316,38,0),(316,44,0),(317,38,0),(317,46,0); +/*!40000 ALTER TABLE `wp_term_relationships` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_term_taxonomy` +-- + +DROP TABLE IF EXISTS `wp_term_taxonomy`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_term_taxonomy` ( + `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `term_id` bigint(20) unsigned NOT NULL DEFAULT 0, + `taxonomy` varchar(32) NOT NULL DEFAULT '', + `description` longtext NOT NULL, + `parent` bigint(20) unsigned NOT NULL DEFAULT 0, + `count` bigint(20) NOT NULL DEFAULT 0, + PRIMARY KEY (`term_taxonomy_id`), + UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), + KEY `taxonomy` (`taxonomy`) +) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_term_taxonomy` +-- + +LOCK TABLES `wp_term_taxonomy` WRITE; +/*!40000 ALTER TABLE `wp_term_taxonomy` DISABLE KEYS */; +INSERT INTO `wp_term_taxonomy` VALUES (1,1,'category','',0,0),(2,2,'category','',0,2),(3,3,'category','',0,1),(4,4,'category','',0,1),(5,5,'category','',0,3),(6,6,'post_tag','',0,1),(7,7,'post_tag','',0,1),(8,8,'post_tag','',0,2),(9,9,'post_tag','',0,0),(10,10,'post_tag','',0,2),(11,11,'category','',0,3),(12,12,'category','',0,2),(13,13,'category','',0,2),(14,14,'category','',0,2),(15,15,'post_tag','',0,1),(16,16,'post_tag','',0,1),(17,17,'post_tag','',0,1),(18,18,'post_tag','',0,1),(19,19,'post_tag','',0,2),(20,20,'category','',0,3),(21,21,'category','',0,0),(22,22,'category','',0,1),(23,23,'post_tag','',0,2),(24,24,'post_tag','',0,1),(25,25,'post_tag','',0,0),(26,26,'post_tag','',0,1),(27,27,'post_tag','',0,0),(28,28,'wp_theme','',0,1),(29,29,'category','',0,2),(30,30,'category','',0,1),(31,31,'category','',0,0),(32,32,'category','',0,1),(33,33,'post_tag','',0,1),(34,34,'post_tag','',0,2),(35,35,'post_tag','',0,1),(36,36,'post_tag','',0,1),(37,37,'post_tag','',0,0),(38,38,'style','Characterized by round arches, thick walls, sturdy columns, large towers, and decorative arcading. Developed between 800-1200 CE.',0,9),(39,39,'style','Features pointed arches, ribbed vaults, and flying buttresses. Emerged in 12th century France.',0,2),(40,40,'style','Characterized by height, large windows, ornate decoration, and complex architectural features. Peaked in 13th century.',0,2),(41,41,'style','Features elaborate tracery, ornate decoration, and flame-like window patterns. Late 14th-15th century.',0,0),(42,42,'style','Anglo-Norman architecture characterized by massive proportions, round arches, and decorative geometric patterns.',0,2),(43,43,'style','English Gothic style featuring vertical lines, large windows, and fan vaulting. Late 14th-16th century.',0,0),(44,44,'period','Also known as the Dark Ages, spanning from 5th to 10th century CE.',0,4),(45,45,'period','From late 10th to early 12th century, marked by the revival of stone architecture.',0,1),(46,46,'period','From 11th to 13th century, characterized by Gothic architecture and cathedral building.',0,7),(47,47,'period','14th and 15th centuries, featuring elaborate Gothic styles and secular architecture.',0,1),(48,48,'period','11th to 13th century, featuring military architecture and fortifications influenced by European and Middle Eastern styles.',0,2),(49,49,'period','Late 15th to early 16th century, showing the gradual shift from medieval to Renaissance styles.',0,0); +/*!40000 ALTER TABLE `wp_term_taxonomy` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_termmeta` +-- + +DROP TABLE IF EXISTS `wp_termmeta`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_termmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `term_id` bigint(20) unsigned NOT NULL DEFAULT 0, + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext DEFAULT NULL, + PRIMARY KEY (`meta_id`), + KEY `term_id` (`term_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_termmeta` +-- + +LOCK TABLES `wp_termmeta` WRITE; +/*!40000 ALTER TABLE `wp_termmeta` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_termmeta` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_terms` +-- + +DROP TABLE IF EXISTS `wp_terms`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_terms` ( + `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(200) NOT NULL DEFAULT '', + `slug` varchar(200) NOT NULL DEFAULT '', + `term_group` bigint(20) NOT NULL DEFAULT 0, + PRIMARY KEY (`term_id`), + KEY `slug` (`slug`(191)), + KEY `name` (`name`(191)) +) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_terms` +-- + +LOCK TABLES `wp_terms` WRITE; +/*!40000 ALTER TABLE `wp_terms` DISABLE KEYS */; +INSERT INTO `wp_terms` VALUES (1,'Uncategorized','uncategorized',0),(2,'Gothic Architecture','gothic-architecture',0),(3,'Romanesque','romanesque',0),(4,'Castles','castles',0),(5,'Religious Buildings','religious-buildings',0),(6,'Buttresses','buttresses',0),(7,'Arches','arches',0),(8,'Stonework','stonework',0),(9,'Vaulted Ceilings','vaulted-ceilings',0),(10,'Stained Glass','stained-glass',0),(11,'Chinese Architecture','chinese-architecture',0),(12,'Japanese Architecture','japanese-architecture',0),(13,'Temples','temples',0),(14,'Palaces','palaces',0),(15,'Pagodas','pagodas',0),(16,'Zen Gardens','zen-gardens',0),(17,'Wooden Architecture','wooden-architecture',0),(18,'Imperial Design','imperial-design',0),(19,'Feng Shui','feng-shui',0),(20,'Islamic Architecture','islamic-architecture',0),(21,'Mosques','mosques',0),(22,'Persian Architecture','persian-architecture',0),(23,'Geometric Patterns','geometric-patterns',0),(24,'Calligraphy','calligraphy',0),(25,'Domes','domes',0),(26,'Arabesques','arabesques',0),(27,'Minarets','minarets',0),(28,'twentytwentyfive','twentytwentyfive',0),(29,'Inca Architecture','inca-architecture',0),(30,'Mayan Architecture','mayan-architecture',0),(31,'Aztec Architecture','aztec-architecture',0),(32,'Ceremonial Centers','ceremonial-centers',0),(33,'Pyramids','pyramids',0),(34,'Stone Masonry','stone-masonry',0),(35,'Terraces','terraces',0),(36,'Astronomical Alignment','astronomical-alignment',0),(37,'Sacred Geometry','sacred-geometry',0),(38,'Romanesque','romanesque',0),(39,'Early Gothic','early-gothic',0),(40,'High Gothic','high-gothic',0),(41,'Flamboyant Gothic','flamboyant-gothic',0),(42,'Norman','norman',0),(43,'Perpendicular Gothic','perpendicular-gothic',0),(44,'Early Middle Ages','early-middle-ages',0),(45,'Romanesque Period','romanesque-period',0),(46,'High Middle Ages','high-middle-ages',0),(47,'Late Middle Ages','late-middle-ages',0),(48,'Crusader Period','crusader-period',0),(49,'Medieval-Renaissance Transition','medieval-renaissance-transition',0); +/*!40000 ALTER TABLE `wp_terms` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_usermeta` +-- + +DROP TABLE IF EXISTS `wp_usermeta`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_usermeta` ( + `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) unsigned NOT NULL DEFAULT 0, + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext DEFAULT NULL, + PRIMARY KEY (`umeta_id`), + KEY `user_id` (`user_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_usermeta` +-- + +LOCK TABLES `wp_usermeta` WRITE; +/*!40000 ALTER TABLE `wp_usermeta` DISABLE KEYS */; +INSERT INTO `wp_usermeta` VALUES (1,1,'nickname','admin'),(2,1,'first_name',''),(3,1,'last_name',''),(4,1,'description',''),(5,1,'rich_editing','true'),(6,1,'syntax_highlighting','true'),(7,1,'comment_shortcuts','false'),(8,1,'admin_color','fresh'),(9,1,'use_ssl','0'),(10,1,'show_admin_bar_front','true'),(11,1,'locale',''),(12,1,'wp_capabilities','a:1:{s:13:\"administrator\";b:1;}'),(13,1,'wp_user_level','10'),(14,1,'dismissed_wp_pointers',''),(15,1,'show_welcome_panel','0'),(17,1,'wp_dashboard_quick_press_last_post_id','4'),(18,1,'closedpostboxes_dashboard','a:0:{}'),(19,1,'metaboxhidden_dashboard','a:0:{}'),(20,1,'meta-box-order_dashboard','a:4:{s:6:\"normal\";s:41:\"dashboard_site_health,dashboard_right_now\";s:4:\"side\";s:21:\"dashboard_quick_press\";s:7:\"column3\";s:18:\"dashboard_activity\";s:7:\"column4\";s:17:\"dashboard_primary\";}'),(21,1,'manageedit-acf-post-typecolumnshidden','a:1:{i:0;s:7:\"acf-key\";}'),(22,1,'acf_user_settings','a:2:{s:19:\"post-type-first-run\";b:1;s:20:\"taxonomies-first-run\";b:1;}'),(23,1,'closedpostboxes_acf-post-type','a:0:{}'),(24,1,'metaboxhidden_acf-post-type','a:1:{i:0;s:7:\"slugdiv\";}'),(25,1,'manageedit-acf-taxonomycolumnshidden','a:1:{i:0;s:7:\"acf-key\";}'),(26,1,'closedpostboxes_acf-taxonomy','a:0:{}'),(27,1,'metaboxhidden_acf-taxonomy','a:1:{i:0;s:7:\"slugdiv\";}'),(28,1,'wp_user-settings','libraryContent=browse&mfold=o'),(29,1,'wp_user-settings-time','1743760965'),(30,1,'community-events-location','a:1:{s:2:\"ip\";s:12:\"192.168.65.0\";}'),(31,1,'_application_passwords','a:0:{}'),(50,1,'session_tokens','a:2:{s:64:\"4dbb4736210a6ddfc25fc387f1661a0108bcf781ec8b69c02f292a687108f458\";a:4:{s:10:\"expiration\";i:1747557754;s:2:\"ip\";s:12:\"192.168.65.1\";s:2:\"ua\";s:117:\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\";s:5:\"login\";i:1747384954;}s:64:\"d0d52b0466a3ee237235d96c910cad399b7bbb644866be895054c75cc04479df\";a:4:{s:10:\"expiration\";i:1747558497;s:2:\"ip\";s:12:\"192.168.65.1\";s:2:\"ua\";s:117:\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\";s:5:\"login\";i:1747385697;}}'); +/*!40000 ALTER TABLE `wp_usermeta` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_users` +-- + +DROP TABLE IF EXISTS `wp_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_users` ( + `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_login` varchar(60) NOT NULL DEFAULT '', + `user_pass` varchar(255) NOT NULL DEFAULT '', + `user_nicename` varchar(50) NOT NULL DEFAULT '', + `user_email` varchar(100) NOT NULL DEFAULT '', + `user_url` varchar(100) NOT NULL DEFAULT '', + `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `user_activation_key` varchar(255) NOT NULL DEFAULT '', + `user_status` int(11) NOT NULL DEFAULT 0, + `display_name` varchar(250) NOT NULL DEFAULT '', + PRIMARY KEY (`ID`), + KEY `user_login_key` (`user_login`), + KEY `user_nicename` (`user_nicename`), + KEY `user_email` (`user_email`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_users` +-- + +LOCK TABLES `wp_users` WRITE; +/*!40000 ALTER TABLE `wp_users` DISABLE KEYS */; +INSERT INTO `wp_users` VALUES (1,'admin','$wp$2y$10$DoOzizE.k4xf/9Z6R6cBBuGVYUoD.pRva36KnHWBLlR1RUfD0MhMO','admin','dev-email@wpengine.local','','2025-03-28 10:41:07','',0,'admin'); +/*!40000 ALTER TABLE `wp_users` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-05-16 11:21:50 diff --git a/examples/next/hwp-preview-wpgraphql/wp-env/setup/.htaccess b/examples/next/hwp-preview-wpgraphql/wp-env/setup/.htaccess new file mode 100644 index 00000000..ad8663f5 --- /dev/null +++ b/examples/next/hwp-preview-wpgraphql/wp-env/setup/.htaccess @@ -0,0 +1,21 @@ + + Header set Access-Control-Allow-Origin "*" + Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" + Header set Access-Control-Allow-Headers "Authorization, Content-Type" + + +# BEGIN WordPress +# The directives (lines) between "BEGIN WordPress" and "END WordPress" are +# dynamically generated, and should only be modified via WordPress filters. +# Any changes to the directives between these markers will be overwritten. + +RewriteEngine On +RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] +RewriteBase / +RewriteRule ^index\.php$ - [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule . /index.php [L] + + +# END WordPress \ No newline at end of file diff --git a/examples/next/hwp-preview-wpgraphql/wp-env/uploads.zip b/examples/next/hwp-preview-wpgraphql/wp-env/uploads.zip new file mode 100644 index 00000000..b177051b Binary files /dev/null and b/examples/next/hwp-preview-wpgraphql/wp-env/uploads.zip differ diff --git a/plugins/README.md b/plugins/README.md index 03982f48..7efcb5a1 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -4,6 +4,8 @@ WordPress plugins for the Headless WordPress Toolkit. Each plugin is paired with ## Plugins +- `hwp-previews`: WordPress plugin for previewing posts in a headless environment + - `hwp-cli`: WordPress plugin for CLI operations and status endpoints - NPM Package: `@placeholder/cli` - Features: REST API endpoints, admin interface diff --git a/plugins/hwp-previews/.editorconfig b/plugins/hwp-previews/.editorconfig new file mode 100644 index 00000000..465c8289 --- /dev/null +++ b/plugins/hwp-previews/.editorconfig @@ -0,0 +1,18 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +# WordPress Coding Standards +# https://make.wordpress.org/core/handbook/coding-standards/ + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab + + +[*.md] +trim_trailing_whitespace = false diff --git a/plugins/hwp-previews/.gitignore b/plugins/hwp-previews/.gitignore new file mode 100644 index 00000000..f46060e3 --- /dev/null +++ b/plugins/hwp-previews/.gitignore @@ -0,0 +1,2 @@ +/vendor +*.zip diff --git a/plugins/hwp-previews/README.md b/plugins/hwp-previews/README.md new file mode 100644 index 00000000..cff60303 --- /dev/null +++ b/plugins/hwp-previews/README.md @@ -0,0 +1,151 @@ +# HWP Previews + +**Headless Previews** solution for WordPress: fully configurable preview URLs via the settings page. + +[![Version](https://img.shields.io/badge/version-0.0.1-blue)]() [![License](https://img.shields.io/badge/license-GPLv2%2B-lightgrey)]() + +> [!CAUTION] +> This plugin is currently in an alpha state. It's still under active development, so you may encounter bugs or incomplete features. Updates will be rolled out regularly. Use with caution and provide feedback if possible. + +--- + +## Table of Contents + +* [Overview](#overview) +* [Features](#features) +* [Configuration](#configuration) +* [Hooks & Extensibility](#hooks--extensibility) +* [Integration](#integration) + +## Overview + +HWP Previews is a robust and extensible WordPress plugin that centralizes all preview configurations into a user-friendly settings interface. +It empowers site administrators and developers to tailor preview behaviors for each public post type independently, facilitating seamless headless or decoupled workflows. +With HWP Previews, you can define dynamic URL templates, enforce unique slugs for drafts, allow all post statuses be used as parent and extend functionality through flexible hooks and filters, ensuring a consistent and conflict-free preview experience across diverse environments. + +--- + +## Features + +* **Enable/Disable Previews**: Turn preview functionality on or off for each public post type (including custom types). +* **Custom URL Templates**: Define preview URLs using placeholder tokens for dynamic content. Default tokens include: + + * `{ID}` – Post ID + * `{author_ID}` – Post author’s user ID + * `{status}` – Post status slug + * `{slug}` – Post slug + * `{parent_ID}` – Parent post ID (hierarchical types) + * `{type}` – Post type slug + * `{uri}` – Page URI/path + * `{template}` – Template filename + +* **Unique Post Slugs**: Force unique slugs for all post statuses in the post status config. +* **Parent Status**: Allow posts of **all** statuses to be used as parent within hierarchical post types. +* **Default Post Statuses Config**: `publish`, `future`, `draft`, `pending`, `private`, `auto-draft` (modifiable via core hook). +* **Parameter Registry**: Register, unregister, or customize URL tokens through the `hwp_previews_core` action. +* **Iframe Template for Previews**: Allows enable previews in the iframe on the WP Admin side. User can override the iframe preview template via `hwp_previews_template_path` filter. + +--- + +## Configuration + +### Default Post Types Config: +All public post types are enabled by default on the settings page. It is filterable via `hwp_previews_filter_post_type_setting` filter hook. + +### Default Post Statuses Config: +Post statuses are `publish`, `future`, `draft`, `pending`, `private`, `auto-draft` (modifiable via core hook). + +### Configure HWP Previews Plugin: +Navigate in WP Admin to **Settings › HWP Previews**. For each public post type, configure: + +* **Enable HWP Previews** – Master switch +* **Unique Post Slugs** – Force unique slugs for all post statuses in the post status config. +* **Allow All Statuses as Parent** – (Hierarchical types only) +* **Preview URL Template** – Custom URL with tokens like `{ID}`, `{slug}` +* **Load Previews in Iframe** – Toggle iframe-based preview rendering + +_Note: Retrieving of settings is cached for performance._ + +--- + +## Hooks & Extensibility + +### Filter: Post Types List + +Modify which post types appear in the settings UI: + +```php +// Removes attachment post type from the settings page configuration. + +add_filter( 'hwp_previews_filter_post_type_setting', 'hwp_previews_filter_post_type_setting_callback' ); +function hwp_previews_filter_post_type_setting_callback( $post_types ) { + if ( isset( $post_types['attachment'] ) ) { + unset( $post_types['attachment'] ); + } + return $post_types; +} +``` + +### Action: Core Registry + +Register or unregister URL parameters, and adjust types/statuses: + +```php +add_action( 'hwp_previews_core', 'modify_preview_url_parameters' ); +function modify_preview_url_parameters( + \HWP\Previews\Preview\Parameter\Preview_Parameter_Registry $registry +) { + // Remove default parameter + $registry->unregister( 'author_ID' ); + + // Add custom parameter + $registry->register( new \HWP\Previews\Preview\Parameter\Preview_Parameter( + 'current_time', + static fn( \WP_Post $post ) => (string) time(), + __( 'Current Unix timestamp', 'your-domain' ) + ) ); +} +``` + +Modify post types and statuses: + +```php +add_action( 'hwp_previews_core', 'modify_post_types_and_statuses_configs', 10, 3 ); +function modify_post_types_and_statuses_configs( + \HWP\Previews\Preview\Parameter\Preview_Parameter_Registry $registry, + \HWP\Previews\Post\Type\Post_Types_Config $types, + \HWP\Previews\Post\Status\Post_Statuses_Config $statuses +) { + // Limit to pages only + $types->set_post_types( [ 'page' ] ); + // Only include drafts + $statuses->set_post_statuses( [ 'draft' ] ); +} +``` + +### Filter: Iframe Template Path + +Use your own template for iframe previews: + +```php +add_filter( 'hwp_previews_template_path', function( $default_path ) { + return get_stylesheet_directory() . '/my-preview-template.php'; +}); +``` + +--- + +## Integration + +HWP Previews is framework and API agnostic, meaning you can integrate it with any front-end application and with any data-fetching method (WPGraphQL, REST). + +To get started quickly you can use our [example based on Next.js and WPGraphQL](https://github.com/wpengine/hwptoolkit/examples/next/hwp-preview-wpgraphql). This example uses the Draft Mode feature of Next.js. + +To implement your own approach from scratch you can refer to the appropriate documentation pages for each framework. HWP Previews relies on custom preview URLs, allowing you to integrate any method. Below you can find the guides to implement framework-specific preview mode. + +- [Next.js Draft Mode with Pages Router](https://nextjs.org/docs/pages/guides/draft-mode) +- [Next.js Draft Mode with App router](https://nextjs.org/docs/app/guides/draft-mode) +- [Nuxt usePreviewMode](https://nuxt.com/docs/api/composables/use-preview-mode) + + +--- diff --git a/plugins/hwp-previews/assets/js/hwp-previews.js b/plugins/hwp-previews/assets/js/hwp-previews.js new file mode 100644 index 00000000..e69de29b diff --git a/plugins/hwp-previews/autoload.php b/plugins/hwp-previews/autoload.php new file mode 100644 index 00000000..a098c42e --- /dev/null +++ b/plugins/hwp-previews/autoload.php @@ -0,0 +1,52 @@ +' . esc_html( $hwp_class ) . '', + '' . esc_html( $hwp_file ) . '' + ), + '1.0.0' + ); +} ); diff --git a/plugins/hwp-previews/composer.json b/plugins/hwp-previews/composer.json new file mode 100644 index 00000000..c7b0eaaf --- /dev/null +++ b/plugins/hwp-previews/composer.json @@ -0,0 +1,107 @@ +{ + "name": "hwp/previews", + "version": "1.0.0", + "type": "wordpress-plugin", + "description": "This is a WordPress plugin that provides a preview....", + "keywords": [ + "package", + "dependency", + "autoload" + ], + "homepage": "https://wpengine.com/", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "WP Engine Headless OSS Development Team", + "email": "headless-oss@wpengine.com", + "homepage": "https://wpengine.com/" + } + ], + "minimum-stability": "dev", + "prefer-stable": true, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "automattic/vipwpcs": "^3.0", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "humanmade/psalm-plugin-wordpress": "^3.1", + "johnpbloch/wordpress-core": "^6.8", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "slevomat/coding-standard": "^8.0", + "szepeviktor/phpstan-wordpress": "^2.0" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true, + "phpstan/extension-installer": true + }, + "optimize-autoloader": true, + "platform": { + "php": "7.4" + }, + "preferred-install": "dist", + "sort-packages": true + }, + "extra": { + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] + } + }, + "archive": { + "exclude": [ + "vendor/", + "phpcs/", + "phpstan/", + ".gitignore", + ".editorconfig", + "composer.json", + "composer.lock", + "*.xml", + "*.dist", + "*.md" + ] + }, + "autoload": { + "psr-4": { + "HWP\\Previews\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "HWP\\Previews\\Unit\\": "tests/unit/", + "HWP\\Previews\\Integration\\": "tests/integration/", + "HWP\\Previews\\PHPStan\\": "phpstan/", + "HWPStandard\\": "phpcs/HWPStandard" + } + }, + "scripts": { + "build": [ + "rm -f my-plugin.zip", + "composer install --no-dev --optimize-autoloader", + "composer archive --format=zip --file=hwp-previews" + ], + "php:lint": "vendor/bin/phpcs", + "php:lint:i": [ + "php ./vendor/bin/phpcs -i" + ], + "php:lint:fix": "vendor/bin/phpcbf", + "php:stan": [ + "phpstan analyze --ansi --memory-limit=2G -v" + ], + "php:psalm": "psalm", + "php:psalm:info": "psalm --show-info=true" + }, + "scripts-descriptions": { + }, + "support": { + "docs": "https://github.com/composer/composer/docs", + "email": "headless-oss@wpengine.com", + "forum": "https://github.com/composer/composer/forum", + "issues": "https://github.com/composer/composer/issues", + "security": "https://github.com/composer/composer/security/policy" + } +} diff --git a/plugins/hwp-previews/composer.lock b/plugins/hwp-previews/composer.lock new file mode 100644 index 00000000..59169e0e --- /dev/null +++ b/plugins/hwp-previews/composer.lock @@ -0,0 +1,3527 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "a833cde255a62cc18472ed252c99b7be", + "packages": [], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "react/promise": "^2", + "vimeo/psalm": "^3.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T18:52:26+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-13T18:00:56+00:00" + }, + { + "name": "automattic/vipwpcs", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/Automattic/VIP-Coding-Standards.git", + "reference": "2b1d206d81b74ed999023cffd924f862ff2753c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/VIP-Coding-Standards/zipball/2b1d206d81b74ed999023cffd924f862ff2753c8", + "reference": "2b1d206d81b74ed999023cffd924f862ff2753c8", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsextra": "^1.2.1", + "phpcsstandards/phpcsutils": "^1.0.11", + "sirbrillig/phpcs-variable-analysis": "^2.11.18", + "squizlabs/php_codesniffer": "^3.9.2", + "wp-coding-standards/wpcs": "^3.1.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9", + "phpcsstandards/phpcsdevtools": "^1.0", + "phpunit/phpunit": "^4 || ^5 || ^6 || ^7 || ^8 || ^9" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/Automattic/VIP-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress VIP minimum coding conventions", + "keywords": [ + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/Automattic/VIP-Coding-Standards/issues", + "source": "https://github.com/Automattic/VIP-Coding-Standards", + "wiki": "https://github.com/Automattic/VIP-Coding-Standards/wiki" + }, + "time": "2024-05-10T20:31:09+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" + }, + "time": "2023-01-05T11:28:13+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.3", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" + }, + "time": "2024-04-30T00:40:11+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "humanmade/psalm-plugin-wordpress", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/psalm/psalm-plugin-wordpress.git", + "reference": "3f4689ad5264eee7b37121053cec810a3754f7e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/psalm/psalm-plugin-wordpress/zipball/3f4689ad5264eee7b37121053cec810a3754f7e4", + "reference": "3f4689ad5264eee7b37121053cec810a3754f7e4", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php-stubs/wordpress-globals": "^0.2.0", + "php-stubs/wordpress-stubs": "^6.0", + "php-stubs/wp-cli-stubs": "^2.7", + "vimeo/psalm": "^5 || ^6", + "wp-hooks/wordpress-core": "^1.3.0" + }, + "require-dev": { + "humanmade/coding-standards": "^1.2", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.18.4" + }, + "type": "psalm-plugin", + "extra": { + "psalm": { + "pluginClass": "PsalmWordPress\\Plugin" + } + }, + "autoload": { + "psr-4": { + "PsalmWordPress\\": [ + "." + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "kkmuffme", + "role": "Maintainer" + }, + { + "name": "Joe Hoyle", + "role": "Creator" + } + ], + "description": "WordPress stubs and plugin for Psalm static analysis.", + "support": { + "issues": "https://github.com/psalm/psalm-plugin-wordpress/issues", + "source": "https://github.com/psalm/psalm-plugin-wordpress" + }, + "time": "2024-04-01T10:36:11+00:00" + }, + { + "name": "johnpbloch/wordpress-core", + "version": "6.8.0", + "source": { + "type": "git", + "url": "https://github.com/johnpbloch/wordpress-core.git", + "reference": "74197a5012b0a72834ffc58bb32ef0045f15a26c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/johnpbloch/wordpress-core/zipball/74197a5012b0a72834ffc58bb32ef0045f15a26c", + "reference": "74197a5012b0a72834ffc58bb32ef0045f15a26c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.2.24" + }, + "provide": { + "wordpress/core-implementation": "6.8.0" + }, + "type": "wordpress-core", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "WordPress Community", + "homepage": "https://wordpress.org/about/" + } + ], + "description": "WordPress is open source software you can use to create a beautiful website, blog, or app.", + "homepage": "https://wordpress.org/", + "keywords": [ + "blog", + "cms", + "wordpress" + ], + "support": { + "forum": "https://wordpress.org/support/", + "irc": "irc://irc.freenode.net/wordpress", + "issues": "https://core.trac.wordpress.org/", + "source": "https://core.trac.wordpress.org/browser", + "wiki": "https://codex.wordpress.org/" + }, + "time": "2025-04-15T15:47:20+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" + }, + "time": "2024-09-08T10:13:13+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" + }, + "time": "2024-09-29T15:01:53+00:00" + }, + { + "name": "php-stubs/wordpress-globals", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-stubs/wordpress-globals.git", + "reference": "748a1fb2ae8fda94844bd0545935095dbf404b32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-stubs/wordpress-globals/zipball/748a1fb2ae8fda94844bd0545935095dbf404b32", + "reference": "748a1fb2ae8fda94844bd0545935095dbf404b32", + "shasum": "" + }, + "require-dev": { + "php": "~7.1" + }, + "suggest": { + "php-stubs/wordpress-stubs": "Up-to-date WordPress function and class declaration stubs", + "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Global variables and global constants from WordPress core.", + "homepage": "https://github.com/php-stubs/wordpress-globals", + "keywords": [ + "PHPStan", + "constants", + "globals", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/php-stubs/wordpress-globals/issues", + "source": "https://github.com/php-stubs/wordpress-globals/tree/master" + }, + "time": "2020-01-13T06:12:59+00:00" + }, + { + "name": "php-stubs/wordpress-stubs", + "version": "v6.8.0", + "source": { + "type": "git", + "url": "https://github.com/php-stubs/wordpress-stubs.git", + "reference": "1824db4d1d00d32c0119175d2369d9425dbc4953" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/1824db4d1d00d32c0119175d2369d9425dbc4953", + "reference": "1824db4d1d00d32c0119175d2369d9425dbc4953", + "shasum": "" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "5.6.1" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "nikic/php-parser": "^4.13", + "php": "^7.4 || ^8.0", + "php-stubs/generator": "^0.8.3", + "phpdocumentor/reflection-docblock": "^5.4.1", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^9.5", + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.1.1", + "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" + }, + "suggest": { + "paragonie/sodium_compat": "Pure PHP implementation of libsodium", + "symfony/polyfill-php80": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WordPress function and class declaration stubs for static analysis.", + "homepage": "https://github.com/php-stubs/wordpress-stubs", + "keywords": [ + "PHPStan", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/php-stubs/wordpress-stubs/issues", + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.8.0" + }, + "time": "2025-04-17T15:13:53+00:00" + }, + { + "name": "php-stubs/wp-cli-stubs", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/php-stubs/wp-cli-stubs.git", + "reference": "f27ff9e8e29d7962cb070e58de70dfaf63183007" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-stubs/wp-cli-stubs/zipball/f27ff9e8e29d7962cb070e58de70dfaf63183007", + "reference": "f27ff9e8e29d7962cb070e58de70dfaf63183007", + "shasum": "" + }, + "require": { + "php-stubs/wordpress-stubs": "^4.7 || ^5.0 || ^6.0" + }, + "require-dev": { + "php": "~7.3 || ~8.0", + "php-stubs/generator": "^0.8.0" + }, + "suggest": { + "symfony/polyfill-php73": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WP-CLI function and class declaration stubs for static analysis.", + "homepage": "https://github.com/php-stubs/wp-cli-stubs", + "keywords": [ + "PHPStan", + "static analysis", + "wordpress", + "wp-cli" + ], + "support": { + "issues": "https://github.com/php-stubs/wp-cli-stubs/issues", + "source": "https://github.com/php-stubs/wp-cli-stubs/tree/v2.11.0" + }, + "time": "2024-11-25T10:09:13+00:00" + }, + { + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + }, + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + } + ], + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2019-12-27T09:44:58+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-paragonie", + "version": "1.3.3", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", + "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/293975b465e0e709b571cbf0c957c6c0a7b9a2ac", + "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "paragonie/random_compat": "dev-master", + "paragonie/sodium_compat": "dev-master" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "paragonie", + "phpcs", + "polyfill", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "security": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/security/policy", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "funding": [ + { + "url": "https://github.com/PHPCompatibility", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-04-24T21:30:46+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-wp", + "version": "2.1.6", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", + "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/80ccb1a7640995edf1b87a4409fa584cd5869469", + "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/phpcompatibility-paragonie": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "funding": [ + { + "url": "https://github.com/PHPCompatibility", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2025-01-16T22:34:19+00:00" + }, + { + "name": "phpcsstandards/phpcsextra", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", + "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", + "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsutils": "^1.0.9", + "squizlabs/php_codesniffer": "^3.8.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "phpcsstandards/phpcsdevtools": "^1.2.1", + "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" + } + ], + "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", + "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSExtra" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2023-12-08T16:49:07+00:00" + }, + { + "name": "phpcsstandards/phpcsutils", + "version": "1.0.12", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" + }, + "require-dev": { + "ext-filter": "*", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPCSUtils/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + } + ], + "description": "A suite of utility functions for use with PHP_CodeSniffer", + "homepage": "https://phpcsutils.com/", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "phpcs3", + "standards", + "static analysis", + "tokens", + "utility" + ], + "support": { + "docs": "https://phpcsutils.com/", + "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", + "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSUtils" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-05-20T13:34:27+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" + }, + "time": "2025-04-13T19:20:35+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + }, + "time": "2025-02-19T13:28:12+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.1.12", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", + "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2025-04-16T13:19:18+00:00" + }, + { + "name": "phpstan/phpstan-strict-rules", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-strict-rules.git", + "reference": "3e139cbe67fafa3588e1dbe27ca50f31fdb6236a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/3e139cbe67fafa3588e1dbe27ca50f31fdb6236a", + "reference": "3e139cbe67fafa3588e1dbe27ca50f31fdb6236a", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0.4" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Extra strict and opinionated rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.4" + }, + "time": "2025-03-18T11:42:40+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sirbrillig/phpcs-variable-analysis", + "version": "v2.12.0", + "source": { + "type": "git", + "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git", + "reference": "4debf5383d9ade705e0a25121f16c3fecaf433a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/4debf5383d9ade705e0a25121f16c3fecaf433a7", + "reference": "4debf5383d9ade705e0a25121f16c3fecaf433a7", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "squizlabs/php_codesniffer": "^3.5.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0", + "phpcsstandards/phpcsdevcs": "^1.1", + "phpstan/phpstan": "^1.7", + "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0 || ^10.5.32 || ^11.3.3", + "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0" + }, + "type": "phpcodesniffer-standard", + "autoload": { + "psr-4": { + "VariableAnalysis\\": "VariableAnalysis/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Sam Graham", + "email": "php-codesniffer-variableanalysis@illusori.co.uk" + }, + { + "name": "Payton Swick", + "email": "payton@foolord.com" + } + ], + "description": "A PHPCS sniff to detect problems with variables.", + "keywords": [ + "phpcs", + "static analysis" + ], + "support": { + "issues": "https://github.com/sirbrillig/phpcs-variable-analysis/issues", + "source": "https://github.com/sirbrillig/phpcs-variable-analysis", + "wiki": "https://github.com/sirbrillig/phpcs-variable-analysis/wiki" + }, + "time": "2025-03-17T16:17:38+00:00" + }, + { + "name": "slevomat/coding-standard", + "version": "8.17.0", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "ace04a4e2e20c9bc26ad14d6c4c737cde6056ec0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/ace04a4e2e20c9bc26ad14d6c4c737cde6056ec0", + "reference": "ace04a4e2e20c9bc26ad14d6c4c737cde6056ec0", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^2.1.0", + "squizlabs/php_codesniffer": "^3.12.1" + }, + "require-dev": { + "phing/phing": "3.0.1", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/phpstan": "2.1.11", + "phpstan/phpstan-deprecation-rules": "2.0.1", + "phpstan/phpstan-phpunit": "2.0.6", + "phpstan/phpstan-strict-rules": "2.0.4", + "phpunit/phpunit": "9.6.8|10.5.45|11.4.4|11.5.17|12.1.2" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" + ], + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.17.0" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2025-04-10T06:06:16+00:00" + }, + { + "name": "spatie/array-to-xml", + "version": "2.17.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/5cbec9c6ab17e320c58a259f0cebe88bde4a7c46", + "reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "phpunit/phpunit": "^9.0", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ArrayToXml\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" + } + ], + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], + "support": { + "source": "https://github.com/spatie/array-to-xml/tree/2.17.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-12-26T08:22:07+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.12.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", + "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-04-13T04:10:18+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-06T11:30:55+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-22T13:05:35+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-10T20:33:58+00:00" + }, + { + "name": "szepeviktor/phpstan-wordpress", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/szepeviktor/phpstan-wordpress.git", + "reference": "f7beb13cd22998e3d913fdb897a1e2553ccd637e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/f7beb13cd22998e3d913fdb897a1e2553ccd637e", + "reference": "f7beb13cd22998e3d913fdb897a1e2553ccd637e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "php-stubs/wordpress-stubs": "^6.6.2", + "phpstan/phpstan": "^2.0" + }, + "require-dev": { + "composer/composer": "^2.1.14", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.0", + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.0", + "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" + }, + "suggest": { + "swissspidy/phpstan-no-private": "Detect usage of internal core functions, classes and methods" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "SzepeViktor\\PHPStan\\WordPress\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WordPress extensions for PHPStan", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/szepeviktor/phpstan-wordpress/issues", + "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v2.0.1" + }, + "time": "2024-12-01T02:13:05+00:00" + }, + { + "name": "vimeo/psalm", + "version": "5.26.1", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer-runtime-api": "^2", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.1", + "felixfbecker/language-server-protocol": "^1.5.2", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.17", + "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "nikic/php-parser": "4.17.0" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "amphp/phpunit-util": "^2.0", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "ext-curl": "*", + "mockery/mockery": "^1.5", + "nunomaduro/mock-final-classes": "^1.1", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpdoc-parser": "^1.6", + "phpunit/phpunit": "^9.6", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.6", + "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "project", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev", + "dev-3.x": "3.x-dev", + "dev-4.x": "4.x-dev", + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php", + "static analysis" + ], + "support": { + "docs": "https://psalm.dev/docs", + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm" + }, + "time": "2024-09-08T18:53:08+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/9333efcbff231f10dfd9c56bb7b65818b4733ca7", + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-libxml": "*", + "ext-tokenizer": "*", + "ext-xmlreader": "*", + "php": ">=5.4", + "phpcsstandards/phpcsextra": "^1.2.1", + "phpcsstandards/phpcsutils": "^1.0.10", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.0", + "phpcsstandards/phpcsdevtools": "^1.2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "suggest": { + "ext-iconv": "For improved results", + "ext-mbstring": "For improved results" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/php_codesniffer", + "type": "custom" + } + ], + "time": "2024-03-25T16:39:00+00:00" + }, + { + "name": "wp-hooks/wordpress-core", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/wp-hooks/wordpress-core-hooks.git", + "reference": "127af21a918a52bcead7ce9b743b17b5d64eb148" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-hooks/wordpress-core-hooks/zipball/127af21a918a52bcead7ce9b743b17b5d64eb148", + "reference": "127af21a918a52bcead7ce9b743b17b5d64eb148", + "shasum": "" + }, + "replace": { + "johnbillion/wp-hooks": "*" + }, + "require-dev": { + "erusev/parsedown": "1.8.0-beta-7", + "oomphinc/composer-installers-extender": "^2", + "roots/wordpress-core-installer": "^1.0.0", + "roots/wordpress-full": "6.8", + "wp-hooks/generator": "1.0.0" + }, + "type": "library", + "extra": { + "wp-hooks": { + "ignore-files": [ + "wp-admin/includes/deprecated.php", + "wp-admin/includes/ms-deprecated.php", + "wp-content/", + "wp-includes/deprecated.php", + "wp-includes/ID3/", + "wp-includes/ms-deprecated.php", + "wp-includes/pomo/", + "wp-includes/random_compat/", + "wp-includes/Requests/", + "wp-includes/SimplePie/", + "wp-includes/sodium_compat/", + "wp-includes/Text/" + ], + "ignore-hooks": [ + "load-categories.php", + "load-edit-link-categories.php", + "load-edit-tags.php", + "load-page-new.php", + "load-page.php", + "option_enable_xmlrpc", + "edit_post_{$field}", + "pre_post_{$field}", + "post_{$field}", + "pre_option_enable_xmlrpc", + "$page_hook", + "$hook", + "$hook_name" + ] + }, + "wordpress-install-dir": "vendor/wordpress/wordpress" + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "John Blackbourn", + "homepage": "https://johnblackbourn.com/" + } + ], + "description": "All the actions and filters from WordPress core in machine-readable JSON format.", + "support": { + "issues": "https://github.com/wp-hooks/wordpress-core-hooks/issues", + "source": "https://github.com/wp-hooks/wordpress-core-hooks/tree/1.10.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/johnbillion", + "type": "github" + } + ], + "time": "2025-04-16T22:20:41+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^7.4 || ^8.0" + }, + "platform-dev": {}, + "platform-overrides": { + "php": "7.4" + }, + "plugin-api-version": "2.6.0" +} diff --git a/plugins/hwp-previews/hwp-previews.php b/plugins/hwp-previews/hwp-previews.php new file mode 100644 index 00000000..786ad745 --- /dev/null +++ b/plugins/hwp-previews/hwp-previews.php @@ -0,0 +1,38 @@ + HWP\Previews\Plugin::get_instance( + '0.0.1', + plugin_dir_path( __FILE__ ), + plugin_dir_url( __FILE__ ) + )->init(), + 5, + 0 +); diff --git a/plugins/hwp-previews/phpcs.xml b/plugins/hwp-previews/phpcs.xml new file mode 100644 index 00000000..cb5703fe --- /dev/null +++ b/plugins/hwp-previews/phpcs.xml @@ -0,0 +1,346 @@ + + + + + + + + Coding standards for the HWP Previews plugin + ./hwp-previews.php + ./autoload.php + ./src/ + ./templates/ + */languages/* + */phpunit.xml* + **/tests/** + */vendor/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + warning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/hwp-previews/phpcs/HWPStandard/Sniffs/ControlStructures/ElseKeywordSniff.php b/plugins/hwp-previews/phpcs/HWPStandard/Sniffs/ControlStructures/ElseKeywordSniff.php new file mode 100644 index 00000000..98bd26de --- /dev/null +++ b/plugins/hwp-previews/phpcs/HWPStandard/Sniffs/ControlStructures/ElseKeywordSniff.php @@ -0,0 +1,47 @@ +getTokens(); + $token = $tokens[$stackPtr]; + + if ($token['code'] === T_ELSE) { + $warning = 'Usage of "else" detected; consider refactoring to avoid else branches'; + $phpcsFile->addWarning($warning, $stackPtr, 'ElseDetected'); + + return; + } + + if ($token['code'] === T_ELSEIF) { + $warning = 'Usage of "elseif" detected; consider refactoring to avoid else branches'; + $phpcsFile->addWarning($warning, $stackPtr, 'ElseIfDetected'); + } + } +} diff --git a/plugins/hwp-previews/phpcs/HWPStandard/ruleset.xml b/plugins/hwp-previews/phpcs/HWPStandard/ruleset.xml new file mode 100644 index 00000000..89470394 --- /dev/null +++ b/plugins/hwp-previews/phpcs/HWPStandard/ruleset.xml @@ -0,0 +1,4 @@ + + + HWP custom coding standard. + diff --git a/plugins/hwp-previews/phpstan.neon.dist b/plugins/hwp-previews/phpstan.neon.dist new file mode 100644 index 00000000..19353dd3 --- /dev/null +++ b/plugins/hwp-previews/phpstan.neon.dist @@ -0,0 +1,37 @@ +includes: + - vendor/szepeviktor/phpstan-wordpress/extension.neon + - vendor/phpstan/phpstan-strict-rules/rules.neon + +services: + - + class: HWP\Previews\PHPStan\Rules\ClassConstantVarAnnotationRule + tags: [phpstan.rules.rule] + +parameters: + # Analysis Rules + treatPhpDocTypesAsCertain: false + inferPrivatePropertyTypeFromConstructor: true + checkExplicitMixedMissingReturn: true + checkMissingTypehints: true + checkFunctionNameCase: true + checkInternalClassCaseSensitivity: true + checkTooWideReturnTypesInProtectedAndPublicMethods: true + polluteScopeWithAlwaysIterableForeach: false + polluteScopeWithLoopInitialAssignments: false + reportAlwaysTrueInLastCondition: true + reportStaticMethodSignatures: true + reportWrongPhpDocTypeInVarTag: true + + # Configuration + level: 8 + phpVersion: + min: 70400 + max: 80400 + paths: + - hwp-previews.php + - autoload.php + - templates/ + - src/ + ignoreErrors: + - + identifier: empty.notAllowed diff --git a/plugins/hwp-previews/phpstan/Rules/ClassConstantVarAnnotationRule.php b/plugins/hwp-previews/phpstan/Rules/ClassConstantVarAnnotationRule.php new file mode 100644 index 00000000..f469fb38 --- /dev/null +++ b/plugins/hwp-previews/phpstan/Rules/ClassConstantVarAnnotationRule.php @@ -0,0 +1,41 @@ + + */ +class ClassConstantVarAnnotationRule implements Rule +{ + public function getNodeType(): string + { + return Node\Stmt\ClassConst::class; + } + + public function processNode(Node $node, Scope $scope): array + { + $docComment = $node->getDocComment(); + if (!$docComment instanceof Doc) { + return [ + RuleErrorBuilder::message('Class constant must have a @var annotation in its docblock.')->build(), + ]; + } + + $docText = $docComment->getText(); + if (!preg_match('/@var\s+\S+/', $docText)) { + return [ + RuleErrorBuilder::message('Class constant docblock must contain a non-empty @var annotation.')->build(), + ]; + } + + return []; + } +} diff --git a/plugins/hwp-previews/psalm.xml b/plugins/hwp-previews/psalm.xml new file mode 100644 index 00000000..1040a7c7 --- /dev/null +++ b/plugins/hwp-previews/psalm.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/plugins/hwp-previews/src/Plugin.php b/plugins/hwp-previews/src/Plugin.php new file mode 100644 index 00000000..f297c258 --- /dev/null +++ b/plugins/hwp-previews/src/Plugin.php @@ -0,0 +1,664 @@ + + */ + public const SETTINGS_FIELDS = [ + self::ENABLED_FIELD => 'bool', + self::UNIQUE_POST_SLUGS_FIELD => 'bool', + self::POST_STATUSES_AS_PARENT_FIELD => 'bool', + self::PREVIEW_URL_FIELD => 'string', + self::IN_IFRAME_FIELD => 'bool', + ]; + + /** + * Post statuses that are applicable for previews. + * + * @var array + */ + public const POST_STATUSES = [ + 'publish', + 'future', + 'draft', + 'pending', + 'private', + 'auto-draft', + ]; + + /** + * Settings object used for value retrieving. + * + * @var \HWP\Previews\Settings\Preview_Settings + */ + private Preview_Settings $settings; + + /** + * Post types configuration. + * + * @var \HWP\Previews\Post\Type\Contracts\Post_Types_Config_Interface + */ + private Post_Types_Config_Interface $types_config; + + /** + * Post statuses configuration. + * + * @var \HWP\Previews\Post\Status\Contracts\Post_Statuses_Config_Interface + */ + private Post_Statuses_Config_Interface $statuses_config; + + /** + * Preview parameter registry. + * + * @var \HWP\Previews\Preview\Parameter\Preview_Parameter_Registry + */ + private Preview_Parameter_Registry $parameters; + + /** + * Preview link service class that handles the generation of preview links. + * + * @var \HWP\Previews\Preview\Link\Preview_Link_Service + */ + private Preview_Link_Service $link_service; + + /** + * The version of the plugin. + * + * @var string + */ + private string $version; + + /** + * The directory path of the plugin. + * + * @var string + */ + private string $dir_path; + + /** + * The URL of the plugin. + * + * @var string + */ + private string $plugin_url; + + /** + * The instance of the plugin. + * + * @var \HWP\Previews\Plugin|null + */ + private static ?Plugin $instance = null; + + /** + * Constructor. + * + * @param string $version The version of the plugin. + * @param string $dir_path The directory path of the plugin. + * @param string $plugin_url The URL of the plugin. + */ + private function __construct( string $version, string $dir_path, string $plugin_url ) { + $this->version = $version; + $this->dir_path = $dir_path; + $this->plugin_url = $plugin_url; + + // Initialize the settings object with a cache group. + $this->settings = new Preview_Settings( + new Settings_Cache_Group( self::SETTINGS_KEY, self::SETTINGS_GROUP, self::SETTINGS_FIELDS ) + ); + + // Initialize the post types and statuses configurations. + $this->types_config = ( new Post_Types_Config( new Post_Type_Inspector() ) )->set_post_types( $this->settings->post_types_enabled() ); + $this->statuses_config = ( new Post_Statuses_Config() )->set_post_statuses( self::POST_STATUSES ); + + // Initialize the preview parameter registry. + $this->parameters = new Preview_Parameter_Registry(); + + // Initialize the preview link service. + $this->link_service = new Preview_Link_Service( + $this->types_config, + $this->statuses_config, + new Preview_Link_Placeholder_Resolver( $this->parameters ) + ); + } + + /** + * Get the instance of this class. Passes the version, directory path, and plugin URL to the constructor. + * + * @param string $version The version of the plugin. + * @param string $dir_path The directory path of the plugin. + * @param string $plugin_url The URL of the plugin. + */ + public static function get_instance( string $version, string $dir_path, string $plugin_url ): Plugin { + if ( null === self::$instance ) { + self::$instance = new self( $version, $dir_path, $plugin_url ); + } + + return self::$instance; + } + + /** + * Initialize the plugin functionality. + */ + public function init(): void { + // Init core functionality. + $this->init_core_functionality(); + + // Settings. + $this->register_settings_pages(); + $this->register_settings_fields(); + + // JS. + $this->enqueue_plugin_js(); + + // Functionality. + $this->enable_unique_post_slug(); + $this->enable_post_statuses_as_parent(); + $this->enable_preview_in_iframe(); + $this->enable_preview_functionality(); + } + + /** + * Enqueues the JavaScript file for the plugin admin area. + * Todo: if more complexity is added, consider using a separate class Sript_Enqueue. + */ + public function enqueue_plugin_js(): void { + add_action( 'admin_enqueue_scripts', function ( string $hook ): void { + if ( 'toplevel_page_' . self::PLUGIN_MENU_SLUG !== $hook ) { + return; + } + + wp_enqueue_script( + self::PLUGIN_JS_HANDLE, + trailingslashit( $this->plugin_url ) . self::PLUGIN_JS_SRC, + [], + $this->version, + true + ); + } ); + } + + /** + * Enable unique post slugs for post statuses specified in the post statuses config. + */ + public function enable_unique_post_slug(): void { + add_filter( 'wp_insert_post_data', function ( $data, $postarr ) { + $post = new WP_Post( new Post_Data_Model( $data, (int) ( $postarr['ID'] ?? 0 ) ) ); + + // Check if the correspondent setting is enabled. + if ( ! $this->settings->unique_post_slugs( $post->post_type ) ) { + return $data; + } + + $post_slug = ( new Post_Slug_Manager( + $this->types_config, + $this->statuses_config, + new Post_Slug_Repository() + ) )->force_unique_post_slug( $post ); + + if ( ! empty( $post_slug ) ) { + $data['post_name'] = $post_slug; + } + + return $data; + }, 10, 2 ); + } + + /** + * Replace the preview link in the REST response. + * + * @param \WP_REST_Response $response The REST response object. + * @param \WP_Post $post The post object. + */ + public function filter_rest_prepare_link( WP_REST_Response $response, WP_Post $post ): WP_REST_Response { + if ( $this->settings->in_iframe( $post->post_type ) ) { + return $response; + } + + $preview_url = $this->generate_preview_url( $post ); + if ( ! empty( $preview_url ) ) { + $response->data['link'] = $preview_url; + } + + return $response; + } + + /** + * Setups default preview parameters on the 'init' hook. + * Creates custom action hook 'hwp_previews_core'. + */ + private function init_core_functionality(): void { + add_action( 'init', function (): void { + + // Register default preview parameters. + $this->setup_default_preview_parameters(); + + + /** + * Allows access to the parameters registry, types config, statuses config. + */ + do_action( 'hwp_previews_core', $this->parameters, $this->types_config, $this->statuses_config ); + }, 5, 0 ); + } + + /** + * Registers default preview parameters on the init hook. + * Uses 'hwp_previews_parameters_registry' action to allow modification of the parameters registry. + */ + private function setup_default_preview_parameters(): void { + $this->parameters + ->register( + new Preview_Parameter( 'ID', static fn( WP_Post $post ) => (string) $post->ID, __( 'Post ID.', 'hwp-previews' ) ) + )->register( + new Preview_Parameter( 'author_ID', static fn( WP_Post $post ) => $post->post_author, __( 'ID of post author..', 'hwp-previews' ) ) + )->register( + new Preview_Parameter( 'status', static fn( WP_Post $post ) => $post->post_status, __( 'The post\'s status..', 'hwp-previews' ) ) + )->register( + new Preview_Parameter( 'slug', static fn( WP_Post $post ) => $post->post_name, __( 'The post\'s slug.', 'hwp-previews' ) ) + )->register( + new Preview_Parameter( 'parent_ID', static fn( WP_Post $post ) => (string) $post->post_parent, __( 'ID of a post\'s parent post.', 'hwp-previews' ) ) + )->register( + new Preview_Parameter( 'type', static fn( WP_Post $post ) => $post->post_type, __( 'The post\'s type, like post or page.', 'hwp-previews' ) ) + )->register( + new Preview_Parameter( 'uri', static fn( WP_Post $post ) => (string) get_page_uri( $post ), __( 'The URI path for a page.', 'hwp-previews' ) ) + )->register( + new Preview_Parameter( 'template', static fn( WP_Post $post ) => (string) get_page_template_slug( $post ), __( 'Specific template filename for a given post.', 'hwp-previews' ) ) + ); + } + + /** + * Registers settings pages and subpages. + */ + private function register_settings_pages(): void { + add_action( 'admin_menu', function (): void { + /** + * Array of post types where key is the post type slug and value is the label. + * + * @var array $post_types + */ + $post_types = apply_filters( 'hwp_previews_filter_post_type_setting', $this->types_config->get_public_post_types() ); + + $this->create_settings_page( $post_types )->register_page(); + + // Todo: Register the settings subpage. + // $this->create_settings_subpage()->register_page(); . + } ); + } + + /** + * Registers settings fields. + */ + private function register_settings_fields(): void { + add_action( 'admin_init', function (): void { + + /** + * Array of post types where key is the post type slug and value is the label. + * + * @var array $post_types + */ + $post_types = apply_filters( 'hwp_previews_filter_post_type_setting', $this->types_config->get_public_post_types() ); + + /** + * Register setting itself. + */ + $this->create_tabbed_settings( $post_types )->register_settings(); + + /** + * Register settings sections and fields for each post type. + */ + foreach ( $post_types as $post_type => $label ) { + $this->create_setting_section( $post_type, $label )->register_section( self::SETTINGS_KEY, $post_type, "hwp-previews-{$post_type}" ); + } + }, 10, 0 ); + } + + /** + * Enable post statuses specified in the post statuses config as parent for the post types specified in the post types config. + */ + private function enable_post_statuses_as_parent(): void { + $post_parent_manager = new Post_Parent_Manager( $this->types_config, $this->statuses_config ); + + $post_parent_manager_callback = function ( array $args ) use ( $post_parent_manager ): array { + if ( empty( $args['post_type'] ) ) { + return $args; + } + + $post_type = (string) $args['post_type']; + + // Check if the correspondent setting is enabled. + if ( ! $this->settings->post_statuses_as_parent( $post_type ) ) { + return $args; + } + + $post_statuses = $post_parent_manager->get_post_statuses_as_parent( $post_type ); + if ( ! empty( $post_statuses ) ) { + $args['post_status'] = $post_statuses; + } + + return $args; + }; + + add_filter( 'page_attributes_dropdown_pages_args', $post_parent_manager_callback ); + add_filter( 'quick_edit_dropdown_pages_args', $post_parent_manager_callback ); + + // And for Gutenberg. + foreach ( $this->types_config->get_post_types() as $post_type ) { + if ( ! $this->types_config->gutenberg_editor_enabled( $post_type ) ) { + continue; + } + add_filter( 'rest_' . $post_type . '_query', $post_parent_manager_callback ); + } + } + + /** + * Enable preview functionality in iframe. + */ + private function enable_preview_in_iframe(): void { + $template_resolver = new Preview_Template_Resolver( $this->types_config, $this->statuses_config ); + + add_filter( 'template_include', function ( $template ) use ( $template_resolver ) { + if ( ! is_preview() ) { + return $template; + } + + $post = get_post(); + if ( ! $post instanceof WP_Post ) { + return $template; + } + + // Check if the correspondent setting is enabled. + if ( ! $this->settings->in_iframe( $post->post_type ) ) { + return $template; + } + + /** + * The filter 'hwp_previews_template_path' allows to change the template directory path. + */ + $template_dir_path = (string) apply_filters( + 'hwp_previews_template_path', + $this->dir_path . 'templates/hwp-preview.php' + ); + + $preview_template = $template_resolver->resolve_template_path( $post, $template_dir_path ); + + if ( empty( $preview_template ) ) { + return $template; + } + + set_query_var( $template_resolver::HWP_PREVIEWS_IFRAME_PREVIEW_URL, $this->generate_preview_url( $post ) ); + + return $preview_template; + }, 999 ); + } + + /** + * Swaps the preview link for the post types specified in the post types config. + * Is being enabled only if the preview is not in iframe. Otherwise preview functionality is resolved on the template redirect level. + */ + private function enable_preview_functionality(): void { + add_filter( 'preview_post_link', function ( $link, $post ) { + // If iframe option is enabled, we need to resolve preview on the template redirect level. + if ( $this->settings->in_iframe( $post->post_type ) ) { + return $link; + } + + $url = $this->generate_preview_url( $post ); + + return ! empty( $url ) ? $url : $link; + }, 10, 2 ); + + /** + * Hack Function that changes the preview link for draft articles, + * this must be removed when properly fixed https://github.com/WordPress/gutenberg/issues/13998. + */ + foreach ( $this->types_config->get_public_post_types() as $key => $label ) { + add_filter( 'rest_prepare_' . $key, [ $this, 'filter_rest_prepare_link' ], 10, 2 ); + } + } + + /** + * Generates the preview URL for the given post based on the preview URL template provided in settings. + * + * @param \WP_Post $post The post object. + * + * @return string The generated preview URL. + */ + private function generate_preview_url( WP_Post $post ): string { + // Check if the correspondent setting is enabled. + $url = $this->settings->url_template( $post->post_type ); + + if ( empty( $url ) ) { + return ''; + } + + return $this->link_service->generate_preview_post_link( $url, $post ); + } + + /** + * Creates the settings page. + * + * @param array $post_types The post types to be used in the settings page. + */ + private function create_settings_page( array $post_types ): Menu_Page { + return new Menu_Page( + __( 'HWP Previews Settings', 'hwp-previews' ), + 'HWP Previews', + self::PLUGIN_MENU_SLUG, + $this->dir_path . 'templates/admin/settings-page-main.php', + [ + self::SETTINGS_ARGS => [ + 'tabs' => $post_types, + 'current_tab' => $this->get_current_tab( $post_types ), + 'params' => $this->parameters->get_descriptions(), + ], + ], + 'dashicons-welcome-view-site' + ); + } + + /** + * Get the current tab for the settings page. + * + * @param array $post_types The post types to be used in the settings page. + * @param string $tab The name of the tab. + */ + private function get_current_tab( $post_types, string $tab = 'tab' ): string { + // phpcs:disable WordPress.Security.NonceVerification.Recommended + if ( isset( $_GET[ $tab ] ) && is_string( $_GET[ $tab ] ) ) { + return sanitize_key( $_GET[ $tab ] ); + } + + return ! empty( $post_types ) ? (string) key( $post_types ) : ''; + } + + /** + * Creates the settings subpage. + */ + private function create_settings_subpage(): Submenu_Page { + return new Submenu_Page( + self::PLUGIN_MENU_SLUG, + __( 'Testing Tool', 'hwp-previews' ), + 'Testing Tool', + 'hwp-previews-testing-tool', + $this->dir_path . 'templates/admin/settings-page-testing-tool.php' + ); + } + + /** + * Creates the tabbed settings object. + * + * @param array $post_types Post Types as a tabs. + */ + private function create_tabbed_settings( array $post_types ): Tabbed_Settings { + return new Tabbed_Settings( + self::SETTINGS_GROUP, + self::SETTINGS_KEY, + array_keys( $post_types ), + self::SETTINGS_FIELDS + ); + } + + /** + * Creates the settings section for a specific post type. + * + * @param string $post_type The post type slug. + * @param string $label The label for the post type. + */ + private function create_setting_section( string $post_type, string $label ): Settings_Section { + return new Settings_Section( + 'hwp_previews_section_' . $post_type, + '', + 'hwp-previews-' . $post_type, + $this->create_settings_fields( $post_type, $label, is_post_type_hierarchical( $post_type ) ) + ); + } + + /** + * Creates the settings fields for a specific post type. + * + * @param string $post_type The post type slug. + * @param string $label The label for the post type. + * @param bool $is_hierarchical Whether the post type is hierarchical. + * + * @return array<\HWP\Previews\Settings\Fields\Abstract_Settings_Field> + */ + private function create_settings_fields( string $post_type, string $label, bool $is_hierarchical ): array { + $fields = []; + + $fields[] = new Checkbox_Field( + 'enabled', + // translators: %s is the label of the post type. + sprintf( __( 'Enable HWP Previews for %s', 'hwp-previews' ), $label ) + ); + $fields[] = new Checkbox_Field( 'unique_post_slugs', __( 'Enable unique post slugs for all post statuses', 'hwp-previews' ) ); + + if ( $is_hierarchical ) { + $fields[] = new Checkbox_Field( 'post_statuses_as_parent', __( 'Allow all post statuses in parents option', 'hwp-previews' ) ); + } + + $fields[] = new Checkbox_Field( 'in_iframe', sprintf( __( 'Load previews in iframe', 'hwp-previews' ), $label ) ); + $fields[] = new Text_Input_Field( + 'preview_url', + // translators: %s is the label of the post type. + sprintf( __( 'Preview URL for %s', 'hwp-previews' ), $label ), + "https://localhost:3000/{$post_type}?preview=true&post_id={ID}&name={slug}", + 'large-text code hwp-previews-url' // The class is being used as a query for the JS. + ); + + return $fields; + } +} diff --git a/plugins/hwp-previews/src/Post/Data/Post_Data_Model.php b/plugins/hwp-previews/src/Post/Data/Post_Data_Model.php new file mode 100644 index 00000000..74c23418 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Data/Post_Data_Model.php @@ -0,0 +1,61 @@ + $data Array of data to hydrate the model. + * @param int $post_id Post ID. + */ + public function __construct( array $data, int $post_id = 0 ) { + $this->ID = (int) ( $data['ID'] ?? $post_id ); + $this->post_status = (string) ( $data['post_status'] ?? '' ); + $this->post_type = (string) ( $data['post_type'] ?? '' ); + $this->post_name = (string) ( $data['post_name'] ?? '' ); + $this->post_title = (string) ( $data['post_title'] ?? '' ); + } +} diff --git a/plugins/hwp-previews/src/Post/Parent/Contracts/Post_Parent_Manager_Interface.php b/plugins/hwp-previews/src/Post/Parent/Contracts/Post_Parent_Manager_Interface.php new file mode 100644 index 00000000..31557ee1 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Parent/Contracts/Post_Parent_Manager_Interface.php @@ -0,0 +1,16 @@ + + */ + public function get_post_statuses_as_parent( string $post_type ): array; +} diff --git a/plugins/hwp-previews/src/Post/Parent/Post_Parent_Manager.php b/plugins/hwp-previews/src/Post/Parent/Post_Parent_Manager.php new file mode 100644 index 00000000..93d95134 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Parent/Post_Parent_Manager.php @@ -0,0 +1,66 @@ + + */ + public const POST_STATUSES = [ 'publish', 'future', 'draft', 'pending', 'private' ]; + + /** + * Post types configuration. + * + * @var \HWP\Previews\Post\Type\Contracts\Post_Types_Config_Interface + */ + private Post_Types_Config_Interface $post_types; + + /** + * Post statuses configuration. + * + * @var \HWP\Previews\Post\Status\Contracts\Post_Statuses_Config_Interface + */ + private Post_Statuses_Config_Interface $post_statuses; + + /** + * Post_Parent_Manager constructor. + * + * @param \HWP\Previews\Post\Type\Contracts\Post_Types_Config_Interface $post_types Post types configuration. + * @param \HWP\Previews\Post\Status\Contracts\Post_Statuses_Config_Interface $post_statuses Post statuses configuration. + */ + public function __construct( Post_Types_Config_Interface $post_types, Post_Statuses_Config_Interface $post_statuses ) { + $this->post_types = $post_types; + $this->post_statuses = $post_statuses; + } + + /** + * Get the post statuses that can be used as parent for a given post type. + * + * @param string $post_type Post Type slug. + * + * @return array + */ + public function get_post_statuses_as_parent( string $post_type ): array { + if ( + ! $this->post_types->is_post_type_applicable( $post_type ) || + ! $this->post_types->is_hierarchical( $post_type ) + ) { + return []; + } + + return array_intersect( self::POST_STATUSES, $this->post_statuses->get_post_statuses() ); + } +} diff --git a/plugins/hwp-previews/src/Post/Slug/Contracts/Post_Slug_Manager_Interface.php b/plugins/hwp-previews/src/Post/Slug/Contracts/Post_Slug_Manager_Interface.php new file mode 100644 index 00000000..1d68602f --- /dev/null +++ b/plugins/hwp-previews/src/Post/Slug/Contracts/Post_Slug_Manager_Interface.php @@ -0,0 +1,29 @@ + $reserved_slugs Array of reserved slugs. + */ + public function generate_unique_slug( string $slug, string $post_type, int $post_id, array $reserved_slugs ): string; +} diff --git a/plugins/hwp-previews/src/Post/Slug/Contracts/Post_Slug_Repository_Interface.php b/plugins/hwp-previews/src/Post/Slug/Contracts/Post_Slug_Repository_Interface.php new file mode 100644 index 00000000..3c056635 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Slug/Contracts/Post_Slug_Repository_Interface.php @@ -0,0 +1,16 @@ +types = $types; + $this->statuses = $statuses; + $this->slug_repository = $slug_repository; + } + + /** + * Forces unique slug for a post. + * + * @param \WP_Post $post The post object. + * + * @return string The unique slug. + */ + public function force_unique_post_slug( WP_Post $post ): string { + if ( + ! (bool) $post->ID || + ! $this->types->is_post_type_applicable( $post->post_type ) || + ! $this->statuses->is_post_status_applicable( $post->post_status ) + ) { + return ''; + } + + global $wp_rewrite; + + $slug = empty( $post->post_name ) ? sanitize_title( $post->post_title, "$post->post_status-$post->ID" ) : $post->post_name; + $feeds = is_array( $wp_rewrite->feeds ) ? $wp_rewrite->feeds : []; + + return $this->generate_unique_slug( $slug, $post->post_type, $post->ID, array_merge( $feeds, [ 'embed' ] ) ); + } + + /** + * Generates a unique slug for a post. + * + * @see wp-includes/post.php + * + * @param string $slug . + * @param string $post_type . + * @param int $post_id . + * @param array $reserved_slugs . + */ + public function generate_unique_slug( string $slug, string $post_type, int $post_id, array $reserved_slugs ): string { + if ( empty( $slug ) ) { + $slug = 'undefined'; + } + + if ( ! $this->slug_repository->is_slug_taken( $slug, $post_type, $post_id ) && ! in_array( $slug, $reserved_slugs, true ) ) { + return $slug; + } + + $suffix = 2; + do { + $new_slug = _truncate_post_slug( $slug, 200 - ( strlen( (string) $suffix ) + 1 ) ) . "-$suffix"; + ++$suffix; + } while ( $this->slug_repository->is_slug_taken( $new_slug, $post_type, $post_id ) ); + + return $new_slug; + } +} diff --git a/plugins/hwp-previews/src/Post/Slug/Post_Slug_Repository.php b/plugins/hwp-previews/src/Post/Slug/Post_Slug_Repository.php new file mode 100644 index 00000000..9e20ad88 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Slug/Post_Slug_Repository.php @@ -0,0 +1,37 @@ +get_var( // phpcs:ignore WordPress.DB + $wpdb->prepare( + "SELECT post_name FROM {$wpdb->posts} WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1", + $slug, + $post_type, + $post_id + ) + ); + } +} diff --git a/plugins/hwp-previews/src/Post/Status/Contracts/Post_Statuses_Config_Interface.php b/plugins/hwp-previews/src/Post/Status/Contracts/Post_Statuses_Config_Interface.php new file mode 100644 index 00000000..1af9b622 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Status/Contracts/Post_Statuses_Config_Interface.php @@ -0,0 +1,28 @@ + $post_statuses The post statuses to set. + */ + public function set_post_statuses( array $post_statuses ): self; + + /** + * Get the post statuses that are applicable for the plugin. + * + * @return array + */ + public function get_post_statuses(): array; + + /** + * Check if a given post status is applicable for the plugin. + * + * @param string $post_status Post status slug. + */ + public function is_post_status_applicable( string $post_status ): bool; +} diff --git a/plugins/hwp-previews/src/Post/Status/Post_Statuses_Config.php b/plugins/hwp-previews/src/Post/Status/Post_Statuses_Config.php new file mode 100644 index 00000000..a5a25f58 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Status/Post_Statuses_Config.php @@ -0,0 +1,50 @@ + + */ + private array $post_statuses = []; + + /** + * Sets the post statuses that are applicable for the plugin. + * + * @param array $post_statuses Post statuses that are applicable for the plugin. + * + * @return $this + */ + public function set_post_statuses( array $post_statuses ): self { + $this->post_statuses = $post_statuses; + + return $this; + } + + /** + * Get the post statuses that are applicable for the plugin. + * + * @return array Post statuses. + */ + public function get_post_statuses(): array { + return $this->post_statuses; + } + + /** + * Verifies if the post status is applicable according to the configuration. + * + * @param string $post_status Post status to check. + */ + public function is_post_status_applicable( string $post_status ): bool { + return in_array( $post_status, $this->post_statuses, true ); + } +} diff --git a/plugins/hwp-previews/src/Post/Type/Contracts/Post_Type_Inspector_Interface.php b/plugins/hwp-previews/src/Post/Type/Contracts/Post_Type_Inspector_Interface.php new file mode 100644 index 00000000..eb21865e --- /dev/null +++ b/plugins/hwp-previews/src/Post/Type/Contracts/Post_Type_Inspector_Interface.php @@ -0,0 +1,23 @@ + $post_types The post type to check. + */ + public function set_post_types( array $post_types ): self; + + /** + * Get the post types that are applicable for previews. + * + * @return array Post types that are applicable for previews. + */ + public function get_post_types(): array; + + /** + * Check if a post type is applicable for previews. + * + * @param string $post_type The post type to check. + */ + public function is_post_type_applicable( string $post_type ): bool; + + /** + * Check if a post type is hierarchical. + * + * @param string $post_type The post type. + */ + public function is_hierarchical( string $post_type ): bool; + + /** + * Check if a post type supports Gutenberg. + * + * @param string $post_type Post Type slug. + */ + public function gutenberg_editor_enabled( string $post_type ): bool; + + /** + * Gets all publicly available post types as key value array, where key is a post type slug and value is a label. + * + * @return array + */ + public function get_public_post_types(): array; +} diff --git a/plugins/hwp-previews/src/Post/Type/Post_Type_Inspector.php b/plugins/hwp-previews/src/Post/Type/Post_Type_Inspector.php new file mode 100644 index 00000000..422210f7 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Type/Post_Type_Inspector.php @@ -0,0 +1,49 @@ +show_in_rest ) || + empty( $post_type->supports ) || + ! is_array( $post_type->supports ) || + ! in_array( 'editor', $post_type->supports, true ) + ) { + return false; + } + + return $post_type->show_in_rest; + } + + /** + * Checks if the post type is supported by Classic Editor. + * + * @param string $post_type Post Type slug. + */ + public function is_classic_editor_forced( string $post_type ): bool { + if ( + ! function_exists( 'is_plugin_active' ) || + ! is_plugin_active( 'classic-editor/classic-editor.php' ) + ) { + return false; + } + + // If this post type is listed in Classic Editor settings, Gutenberg is disabled. + $settings = (array) get_option( 'classic-editor-settings', [] ); + + return ! empty( $settings['post_types'] ) && + is_array( $settings['post_types'] ) && + in_array( $post_type, $settings['post_types'], true ); + } +} diff --git a/plugins/hwp-previews/src/Post/Type/Post_Types_Config.php b/plugins/hwp-previews/src/Post/Type/Post_Types_Config.php new file mode 100644 index 00000000..1022c759 --- /dev/null +++ b/plugins/hwp-previews/src/Post/Type/Post_Types_Config.php @@ -0,0 +1,108 @@ + + */ + private array $post_types = []; + + /** + * Post type inspector. + * + * @var \HWP\Previews\Post\Type\Contracts\Post_Type_Inspector_Interface + */ + private Post_Type_Inspector_Interface $inspector; + + /** + * Class constructor. + * + * @param \HWP\Previews\Post\Type\Contracts\Post_Type_Inspector_Interface $inspector Post Type inspector. + */ + public function __construct( Post_Type_Inspector_Interface $inspector ) { + $this->inspector = $inspector; + } + + /** + * Sets the post types that are applicable for preview links. + * + * @param array $post_types Post types that are applicable for preview links. + * + * @return $this + */ + public function set_post_types( array $post_types ): self { + $this->post_types = $post_types; + + return $this; + } + + /** + * Get the post types that are applicable for preview links. + * + * @return array + */ + public function get_post_types(): array { + return $this->post_types; + } + + /** + * Check if the post type is applicable for preview links. + * + * @param string $post_type Post Type slug. + */ + public function is_post_type_applicable( string $post_type ): bool { + return in_array( $post_type, $this->post_types, true ) && post_type_exists( $post_type ); + } + + /** + * Check if the post type is hierarchical. + * + * @param string $post_type Post Type slug. + */ + public function is_hierarchical( string $post_type ): bool { + return is_post_type_hierarchical( $post_type ); + } + + /** + * Check if the post type supports Gutenberg editor and if the classic editor is not being forced. + * + * @param string $post_type Post Type slug. + */ + public function gutenberg_editor_enabled( string $post_type ): bool { + $post_type_object = get_post_type_object( $post_type ); + if ( ! $post_type_object instanceof WP_Post_Type ) { + return false; + } + + return $this->inspector->is_gutenberg_supported( $post_type_object ) && + ! $this->inspector->is_classic_editor_forced( $post_type ); + } + + /** + * Gets all publicly available post types as key value array, where key is a post type slug and value is a label. + * + * @return array + */ + public function get_public_post_types(): array { + $post_types = get_post_types( [ 'public' => true ], 'objects' ); + $result = []; + + foreach ( $post_types as $post_type ) { + $result[ $post_type->name ] = $post_type->label; + } + + return $result; + } +} diff --git a/plugins/hwp-previews/src/Preview/Link/Preview_Link_Placeholder_Resolver.php b/plugins/hwp-previews/src/Preview/Link/Preview_Link_Placeholder_Resolver.php new file mode 100644 index 00000000..e8bd7195 --- /dev/null +++ b/plugins/hwp-previews/src/Preview/Link/Preview_Link_Placeholder_Resolver.php @@ -0,0 +1,70 @@ +registry = $registry; + } + + /** + * Replace all {PLACEHOLDER} tokens in template string with urlencoded string values from callbacks. + * + * @param string $template The string containing {KEY} placeholders. + * @param \WP_Post $post The post object to resolve the tokens against. + */ + public function resolve_placeholders(string $template, WP_Post $post ): string { + return (string) preg_replace_callback( + self::PLACEHOLDER_REGEX, + fn(array $matches): string => rawurlencode( $this->resolve_token( $matches[1], $post ) ), + $template + ); + } + + /** + * Resolve individual token by key. + * + * @param string $key The token key without braces. + * @param \WP_Post $post Post object to resolve the token against. + */ + private function resolve_token( string $key, WP_Post $post ): string { + $parameter = $this->registry->get( $key ); + if ( ! $parameter instanceof Preview_Parameter_Interface ) { + return self::PLACEHOLDER_NOT_FOUND; + } + + return $parameter->get_value( $post ); + } +} diff --git a/plugins/hwp-previews/src/Preview/Link/Preview_Link_Service.php b/plugins/hwp-previews/src/Preview/Link/Preview_Link_Service.php new file mode 100644 index 00000000..db1cbfd2 --- /dev/null +++ b/plugins/hwp-previews/src/Preview/Link/Preview_Link_Service.php @@ -0,0 +1,70 @@ +types = $types; + $this->statuses = $statuses; + $this->resolver = $resolver; + } + + /** + * Generate a preview post link. + * + * @param string $preview_url_template Preview URL template. + * @param \WP_Post $post The post object. + */ + public function generate_preview_post_link( string $preview_url_template, WP_Post $post ): string { + if ( + empty( $preview_url_template ) || + ! $this->types->is_post_type_applicable( $post->post_type ) || + ! $this->statuses->is_post_status_applicable( $post->post_status ) + ) { + return ''; + } + + return $this->resolver->resolve_placeholders( $preview_url_template, $post ); + } +} diff --git a/plugins/hwp-previews/src/Preview/Parameter/Contracts/Preview_Parameter_Builder_Interface.php b/plugins/hwp-previews/src/Preview/Parameter/Contracts/Preview_Parameter_Builder_Interface.php new file mode 100644 index 00000000..6cc37ccf --- /dev/null +++ b/plugins/hwp-previews/src/Preview/Parameter/Contracts/Preview_Parameter_Builder_Interface.php @@ -0,0 +1,25 @@ + + */ + public function build_preview_args( WP_Post $post, string $page_uri, string $token ): array; +} diff --git a/plugins/hwp-previews/src/Preview/Parameter/Contracts/Preview_Parameter_Interface.php b/plugins/hwp-previews/src/Preview/Parameter/Contracts/Preview_Parameter_Interface.php new file mode 100644 index 00000000..488f6ff3 --- /dev/null +++ b/plugins/hwp-previews/src/Preview/Parameter/Contracts/Preview_Parameter_Interface.php @@ -0,0 +1,33 @@ +name = $name; + $this->description = $description; + $this->callback = $callback; + } + + /** + * Get the name of the parameter. + * + * @inheritDoc + */ + public function get_name(): string { + return $this->name; + } + + /** + * Get the description of the parameter. + * + * @inheritDoc + */ + public function get_description(): string { + return $this->description; + } + + /** + * Get the value of the parameter for a given post. + * No need to URL-encode here. + * + * @param \WP_Post $post The post object. + */ + public function get_value( WP_Post $post ): string { + return call_user_func( $this->callback, $post ); + } +} diff --git a/plugins/hwp-previews/src/Preview/Parameter/Preview_Parameter_Registry.php b/plugins/hwp-previews/src/Preview/Parameter/Preview_Parameter_Registry.php new file mode 100644 index 00000000..bc84801b --- /dev/null +++ b/plugins/hwp-previews/src/Preview/Parameter/Preview_Parameter_Registry.php @@ -0,0 +1,77 @@ + + */ + private array $parameters = []; + + /** + * Register a parameter. + * + * @param \HWP\Previews\Preview\Parameter\Contracts\Preview_Parameter_Interface $parameter The parameter object. + */ + public function register( Preview_Parameter_Interface $parameter ): self { + $this->parameters[ $parameter->get_name() ] = $parameter; + + return $this; + } + + /** + * Unregister a parameter. + * + * @param string $name The parameter name. + */ + public function unregister( string $name ): self { + if ( isset( $this->parameters[ $name ] ) ) { + unset( $this->parameters[ $name ] ); + } + + return $this; + } + + /** + * Get all registered parameters. + * + * @return array + */ + public function get_all(): array { + return $this->parameters; + } + + /** + * Get all registered parameters as an array of their names and descriptions. + * + * @return array + */ + public function get_descriptions(): array { + $descriptions = []; + foreach ( $this->parameters as $parameter ) { + $descriptions[ $parameter->get_name() ] = $parameter->get_description(); + } + + return $descriptions; + } + + /** + * Get a specific parameter by name. Returns null if not found. + * + * @param string $name The parameter name. + */ + public function get( string $name ): ?Preview_Parameter_Interface { + return $this->parameters[ $name ] ?? null; + } +} diff --git a/plugins/hwp-previews/src/Preview/Template/Contracts/Preview_Template_Resolver_Interface.php b/plugins/hwp-previews/src/Preview/Template/Contracts/Preview_Template_Resolver_Interface.php new file mode 100644 index 00000000..24973aec --- /dev/null +++ b/plugins/hwp-previews/src/Preview/Template/Contracts/Preview_Template_Resolver_Interface.php @@ -0,0 +1,17 @@ +types = $types; + $this->statuses = $statuses; + } + + /** + * Resolves the template path for the preview. + * + * @param \WP_Post $post The post object. + * @param string $template_path The template path. + * + * @return string The resolved template path. + */ + public function resolve_template_path( WP_Post $post, string $template_path ): string { + if ( + empty( $template_path ) || + ! $this->types->is_post_type_applicable( $post->post_type ) || + ! $this->statuses->is_post_status_applicable( $post->post_status ) || + ! is_preview() + ) { + return ''; + } + + return file_exists( $template_path ) ? $template_path : ''; + } +} diff --git a/plugins/hwp-previews/src/Settings/Contracts/General_Settings_Interface.php b/plugins/hwp-previews/src/Settings/Contracts/General_Settings_Interface.php new file mode 100644 index 00000000..cb114560 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Contracts/General_Settings_Interface.php @@ -0,0 +1,17 @@ + $default_value Default post types. + * + * @return array + */ + public function post_types_enabled( array $default_value = [] ): array; + + /** + * Gets URL template for the given post type. + * + * @param string $post_type Post type slug. + * @param string $default_value Default URL template. + */ + public function url_template( string $post_type, string $default_value = '' ): string; + + /** + * If the post type post statuses should have unique slug for the post type. + * + * @param string $post_type Post type slug. + * @param bool $default_value Default value. + */ + public function unique_post_slugs( string $post_type, bool $default_value = false ): bool; + + /** + * It the specified post statuses should be allowed to be used as parent post statuses. + * + * @param string $post_type Post type slug. + * @param bool $default_value Default value. + */ + public function post_statuses_as_parent( string $post_type, bool $default_value = false ): bool; + + /** + * If the post type preview supposed to be opened in iframe on WP Admin side. + * + * @param string $post_type Post type slug. + * @param bool $default_value Default value. + */ + public function in_iframe( string $post_type, bool $default_value = false ): bool; +} diff --git a/plugins/hwp-previews/src/Settings/Fields/Abstract_Settings_Field.php b/plugins/hwp-previews/src/Settings/Fields/Abstract_Settings_Field.php new file mode 100644 index 00000000..c4133158 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Fields/Abstract_Settings_Field.php @@ -0,0 +1,144 @@ + $option_value Settings value. + * @param string $setting_key The settings key. + * @param string $post_type The post type. + */ + abstract protected function render_field( array $option_value, string $setting_key, string $post_type ): void; + + /** + * Constructor. + * + * @param string $id The settings field ID. + * @param string $title The settings field title. + * @param string $css_class The settings field class. + */ + public function __construct( + string $id, + string $title, + string $css_class = '' + ) { + $this->id = $id; + $this->title = $title; + $this->class = $css_class; + } + + /** + * Set the settings key. + * + * @param string $settings_key The settings key. + * + * @return $this + */ + public function set_settings_key( string $settings_key ): self { + $this->settings_key = $settings_key; + + return $this; + } + + /** + * Set the post type. + * + * @param string $post_type The post type. + * + * @return $this + */ + public function set_post_type( string $post_type ): self { + $this->post_type = $post_type; + + return $this; + } + + /** + * Register the settings field. + * + * @param string $section The settings section. + * @param string $page The settings page. + */ + public function register_settings_field( string $section, string $page ): void { + + add_settings_field( + $this->id, + $this->title, + [ $this, 'settings_field_callback' ], + $page, + $section + ); + } + + /** + * Callback for the settings field. + */ + public function settings_field_callback(): void { + $this->render_field( + $this->get_setting_value( $this->settings_key, $this->post_type ), + $this->settings_key, + $this->post_type + ); + } + + /** + * Get the settings value. + * + * @param string $settings_key The settings key. + * @param string $post_type The post type. + * + * @return array + */ + private function get_setting_value( string $settings_key, string $post_type ): array { + $value = get_option( $settings_key, [] ); + + if ( + empty( $value ) || + ! isset( $value[ $post_type ] ) || + ! is_array( $value[ $post_type ] ) + ) { + return []; + } + + return $value[ $post_type ]; + } +} diff --git a/plugins/hwp-previews/src/Settings/Fields/Checkbox_Field.php b/plugins/hwp-previews/src/Settings/Fields/Checkbox_Field.php new file mode 100644 index 00000000..7545b26f --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Fields/Checkbox_Field.php @@ -0,0 +1,50 @@ +default = $default_value; + } + + /** + * Render the checkbox settings field. + * + * @param array $option_value Settings value. + * @param string $setting_key The settings key. + * @param string $post_type The post type. + */ + protected function render_field( $option_value, $setting_key, $post_type ): void { + $enabled = isset( $option_value[ $this->id ] ) + ? (bool) $option_value[ $this->id ] + : $this->default; + + printf( + '', + esc_attr( $setting_key ), + esc_attr( $post_type ), + esc_attr( $this->id ), + checked( 1, $enabled, false ), + sanitize_html_class( $this->class ) + ); + } +} diff --git a/plugins/hwp-previews/src/Settings/Fields/Text_Input_Field.php b/plugins/hwp-previews/src/Settings/Fields/Text_Input_Field.php new file mode 100644 index 00000000..6b003a42 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Fields/Text_Input_Field.php @@ -0,0 +1,47 @@ +default = $default_value; + } + + /** + * Render the field. + * + * @param array $option_value The value of the field. + * @param string $setting_key The settings key. + * @param string $post_type The post type. + */ + protected function render_field( array $option_value, string $setting_key, string $post_type ): void { + printf( + '', + esc_attr( $setting_key ), + esc_attr( $post_type ), + esc_attr( $this->id ), + esc_attr( (string) ( $option_value[ $this->id ] ?? $this->default ) ), + esc_attr( $this->default ), + esc_attr( $this->class ) + ); + } +} diff --git a/plugins/hwp-previews/src/Settings/Menu/Menu_Page.php b/plugins/hwp-previews/src/Settings/Menu/Menu_Page.php new file mode 100644 index 00000000..8c00f647 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Menu/Menu_Page.php @@ -0,0 +1,119 @@ +> + */ + protected array $args; + + /** + * The name of a Dashicons helper class to use a font icon. + * + * @var string + */ + protected string $icon; + + /** + * Constructor. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $menu_slug The slug name to refer to this menu by. Should be unique for this menu and only include lowercase alphanumeric, dashes, and underscores characters to be compatible with sanitize_key(). + * @param string $template The template that will be included in the callback. + * @param array> $args The args array for the template. + * @param string $icon The name of a Dashicons helper class to use a font icon. + */ + public function __construct( + string $page_title, + string $menu_title, + string $menu_slug, + string $template, + array $args = [], + string $icon = 'dashicons-admin-generic' + ) { + $this->page_title = $page_title; + $this->menu_title = $menu_title; + $this->menu_slug = $menu_slug; + $this->template = $template; + $this->args = $args; + $this->icon = $icon; + } + + /** + * Registers the menu page in the WordPress admin. + */ + public function register_page(): void { + add_menu_page( + $this->page_title, + $this->menu_title, + 'manage_options', + $this->menu_slug, + [ $this, 'registration_callback' ], + $this->icon + ); + } + + /** + * Callback function to display the content of the menu page. + */ + public function registration_callback(): void { + if ( empty( $this->template ) || ! file_exists( $this->template ) ) { + printf( + '

%s

', + esc_html__( 'The HWP Previews Settings template does not exist.', 'hwp-previews' ) + ); + + return; + } + $this->set_query_vars(); + + // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable -- $this->template is validated and defined within the class + include_once $this->template; + } + + /** + * Sets the query vars for the template. + */ + protected function set_query_vars(): void { + foreach ( $this->args as $query_var => $args ) { + set_query_var( $query_var, $args ); + } + } +} diff --git a/plugins/hwp-previews/src/Settings/Menu/Submenu_Page.php b/plugins/hwp-previews/src/Settings/Menu/Submenu_Page.php new file mode 100644 index 00000000..27f7f244 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Menu/Submenu_Page.php @@ -0,0 +1,50 @@ + $args An array of arguments to be passed to the template. + */ + public function __construct( + string $parent_slug, + string $page_title, + string $menu_title, + string $menu_slug, + string $template, + array $args = [] + ) { + $this->parent_slug = $parent_slug; + parent::__construct( $page_title, $menu_title, $menu_slug, $template, $args ); + } + + /** + * Register the submenu page. Should be called on the 'admin_menu' action. + */ + public function register_page(): void { + add_submenu_page( + $this->parent_slug, + $this->page_title, + $this->menu_title, + 'manage_options', + $this->menu_slug, + [ $this, 'registration_callback' ] + ); + } +} diff --git a/plugins/hwp-previews/src/Settings/Preview_Settings.php b/plugins/hwp-previews/src/Settings/Preview_Settings.php new file mode 100644 index 00000000..535094e6 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Preview_Settings.php @@ -0,0 +1,81 @@ +group = $group; + } + + /** + * Get all post types that are enabled in the settings. + * + * @param array $default_value Default post types to return if none are enabled. + * + * @return array + */ + public function post_types_enabled( array $default_value = [] ): array { + $value = $this->group->get_cache_settings(); + + $post_types = array_filter( $value, static fn( $item ) => isset( $item[ Plugin::ENABLED_FIELD ] ) && true === $item[ Plugin::ENABLED_FIELD ] ); + + return ! empty( $post_types ) ? array_keys( $post_types ) : $default_value; + } + + /** + * Get Unique Post Slugs setting value for the given post type. + * + * @param string $post_type The post type to get the setting for. + * @param bool $default_value The default value to return if the setting is not set. + */ + public function unique_post_slugs( string $post_type, bool $default_value = false ): bool { + return $this->group->get_bool( Plugin::UNIQUE_POST_SLUGS_FIELD, $post_type, $default_value ); + } + + /** + * Get Post Statuses as Parent setting value for the given post type. + * + * @param string $post_type The post type to get the setting for. + * @param bool $default_value The default value to return if the setting is not set. + */ + public function post_statuses_as_parent( string $post_type, bool $default_value = false ): bool { + return $this->group->get_bool( Plugin::POST_STATUSES_AS_PARENT_FIELD, $post_type, $default_value ); + } + + /** + * Show In iframe value for the given post type. + * + * @param string $post_type The post type to get the setting for. + * @param bool $default_value The default value to return if the setting is not set. + */ + public function in_iframe( string $post_type, bool $default_value = false ): bool { + return $this->group->get_bool( Plugin::IN_IFRAME_FIELD, $post_type, $default_value ); + } + + /** + * URL template setting value for the given post type. + * + * @param string $post_type The post type to get the setting for. + * @param string $default_value The default value to return if the setting is not set. + */ + public function url_template( string $post_type, string $default_value = '' ): string { + return $this->group->get_string( Plugin::PREVIEW_URL_FIELD, $post_type, $default_value ); + } +} diff --git a/plugins/hwp-previews/src/Settings/Settings_Cache_Group.php b/plugins/hwp-previews/src/Settings/Settings_Cache_Group.php new file mode 100644 index 00000000..8ec754b4 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Settings_Cache_Group.php @@ -0,0 +1,105 @@ + + */ + private array $settings_config; + + /** + * Constructor. + * Adds a settings group to the list of non-persistent groups. + * + * @param string $option Option name. + * @param string $group Group name. + * @param array $settings_config Array of settings config where keys are allowed options and values are types. + */ + public function __construct( string $option, string $group, array $settings_config ) { + $this->option = $option; + $this->group = $group; + $this->settings_config = $settings_config; + + wp_cache_add_non_persistent_groups( [ $this->group ] ); + } + + /** + * Gets settings from the cache or database. + * + * @return array + */ + public function get_cache_settings(): array { + + $value = wp_cache_get( $this->option, $this->group ); + + if ( false === $value ) { + $value = (array) get_option( $this->option, [] ); + wp_cache_set( $this->option, $value, $this->group ); + } + + return $value; + } + + /** + * Gets a setting value from the cache or database. + * + * @param string $name The name of a bool setting. + * @param string $post_type The post type slug. + * @param bool $default_value The default value to return if the setting is not found. + */ + public function get_bool( string $name, string $post_type, bool $default_value = false ): bool { + $value = $this->get_cache_settings(); + + if ( ! $this->is_setting_of_type( $name, 'bool' ) || empty( $value[ $post_type ][ $name ] ) ) { + return $default_value; + } + + return (bool) $value[ $post_type ][ $name ]; + } + + /** + * Gets a setting value from the cache or database. + * + * @param string $name The name of a string setting. + * @param string $post_type The post type slug. + * @param string $default_value The default value to return if the setting is not found. + */ + public function get_string( string $name, string $post_type, string $default_value = '' ): string { + $value = $this->get_cache_settings(); + + if ( ! $this->is_setting_of_type( $name, 'string' ) || empty( $value[ $post_type ][ $name ] ) ) { + return $default_value; + } + + return (string) $value[ $post_type ][ $name ]; + } + + /** + * Verifies if a setting allowed in the settings config and compares the type is correct. + * + * @param string $name The name of a setting. + * @param string $type The type of the setting. + */ + private function is_setting_of_type( string $name, string $type ): bool { + return array_key_exists( $name, $this->settings_config ) && $this->settings_config[ $name ] === $type; + } +} diff --git a/plugins/hwp-previews/src/Settings/Settings_Section.php b/plugins/hwp-previews/src/Settings/Settings_Section.php new file mode 100644 index 00000000..964cb6d6 --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Settings_Section.php @@ -0,0 +1,78 @@ + + */ + private array $fields; + + /** + * Constructor. + * + * @param string $id Page slug. + * @param string $title Settings section title. + * @param string $page The slug of the settings page. + * @param array<\HWP\Previews\Settings\Fields\Abstract_Settings_Field> $fields Array of fields to be registered in the section. + */ + public function __construct( + string $id, + string $title, + string $page, + array $fields + ) { + $this->id = $id; + $this->title = $title; + $this->page = $page; + $this->fields = $fields; + } + + /** + * Register the settings section. + * + * @param string $settings_key The settings key. + * @param string $post_type The post type. + * @param string $page The page slug. + */ + public function register_section( string $settings_key, string $post_type, string $page ): void { + add_settings_section( + $this->id, + $this->title, + static fn() => null, + $this->page + ); + + foreach ( $this->fields as $field ) { + $field->set_settings_key( $settings_key ); + $field->set_post_type( $post_type ); + + $field->register_settings_field( $this->id, $page ); + } + } +} diff --git a/plugins/hwp-previews/src/Settings/Tabbed_Settings.php b/plugins/hwp-previews/src/Settings/Tabbed_Settings.php new file mode 100644 index 00000000..0c8a3d5e --- /dev/null +++ b/plugins/hwp-previews/src/Settings/Tabbed_Settings.php @@ -0,0 +1,131 @@ + + */ + private array $tabs; + + /** + * Array of sanitization options where keys area options and values are types. + * + * @var array + */ + private array $sanitization_options; + + /** + * Constructor. + * + * @param string $option_group Settings option group. + * @param string $option_name Settings option name. + * @param array $tabs Tabs array as items allowed in the settings. + * @param array $sanitization_options Array of sanitization options where keys are options and values are types. + */ + public function __construct( + string $option_group, + string $option_name, + array $tabs, + array $sanitization_options + ) { + $this->option_group = $option_group; + $this->option_name = $option_name; + $this->tabs = $tabs; + $this->sanitization_options = $sanitization_options; + } + + /** + * Register settings. + */ + public function register_settings(): void { + register_setting( + $this->option_group, + $this->option_name, + [ + 'sanitize_callback' => [ $this, 'sanitize_settings' ], + 'type' => 'array', + 'default' => [], + ] + ); + } + + /** + * Sanitize and merge new settings per-tab, pruning unknown fields. + * + * @param array $new_input New settings input for the specific tab that comes from the form for the sanitization. + * + * @return array + */ + public function sanitize_settings( array $new_input ): array { + $old_input = (array) get_option( $this->option_name, [] ); + + // Remove redundant tabs. + $old_input = array_intersect_key( $old_input, array_flip( $this->tabs ) ); + + $tab = array_keys( $new_input ); + if ( ! isset( $tab[0] ) ) { + return $old_input; // Wrong settings structure. + } + + $tab_to_sanitize = (string) $tab[0]; + if ( ! is_array( $new_input[ $tab_to_sanitize ] ) ) { + return $old_input; // Wrong settings structure. + } + + // Sanitize the fields in the tab. + $sanitized_fields = []; + foreach ( $new_input[ $tab_to_sanitize ] as $key => $value ) { + if ( ! isset( $this->sanitization_options[ (string) $key ] ) ) { + continue; + } + + $sanitized_fields[ $key ] = $this->sanitize_field( (string) $key, $value ); + } + + // Merge the sanitized fields with the old input. + $old_input[ $tab_to_sanitize ] = $sanitized_fields; + + return $old_input; + } + + /** + * Sanitize a single field value by type. + * + * @param string $key Field key. + * @param mixed $value Raw value. + * + * @return bool|int|string + */ + private function sanitize_field( string $key, $value ) { + $type = $this->sanitization_options[ $key ]; + + switch ( $type ) { + case 'bool': + return ! empty( $value ); + case 'int': + return intval( $value ); + case 'text': + default: + return sanitize_text_field( (string) $value ); + } + } +} diff --git a/plugins/hwp-previews/src/Shared/Abstract_Model.php b/plugins/hwp-previews/src/Shared/Abstract_Model.php new file mode 100644 index 00000000..13e6c55c --- /dev/null +++ b/plugins/hwp-previews/src/Shared/Abstract_Model.php @@ -0,0 +1,24 @@ +|object|null $value The value to set. + * + * @throws \Exception When attempting to modify a readonly property. + */ + public function __set( string $name, $value ): void { + throw new Exception( 'Cannot modify readonly property: ' . esc_html( $name ) ); + } +} diff --git a/plugins/hwp-previews/templates/admin/settings-page-main.php b/plugins/hwp-previews/templates/admin/settings-page-main.php new file mode 100644 index 00000000..f722d4b7 --- /dev/null +++ b/plugins/hwp-previews/templates/admin/settings-page-main.php @@ -0,0 +1,85 @@ + + +
+

+
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+

+
+
+ $hwp_previews_param_desc ) : ?> + + + + +
+
+
+
+
+
+
+
+
+ +
diff --git a/plugins/hwp-previews/templates/admin/settings-page-testing.php b/plugins/hwp-previews/templates/admin/settings-page-testing.php new file mode 100644 index 00000000..4a606efd --- /dev/null +++ b/plugins/hwp-previews/templates/admin/settings-page-testing.php @@ -0,0 +1,9 @@ + + +
+

Testing Tool for HWP Previews

+
diff --git a/plugins/hwp-previews/templates/hwp-preview.php b/plugins/hwp-previews/templates/hwp-preview.php new file mode 100644 index 00000000..874402be --- /dev/null +++ b/plugins/hwp-previews/templates/hwp-preview.php @@ -0,0 +1,40 @@ + + + +> + + + + + + + +
+ +
+ + + +