From 2bf569cc65f03e1dee9187982d36ba6685396535 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 13:02:29 -0300 Subject: [PATCH 01/17] Fix the inserter layout, #1025 --- assets/js/workflowEditor.js | 160 +++++++----------- .../components/layout/layout.jsx | 2 +- .../inserter-listbox/group.jsx | 2 +- .../inserter-listbox/index.jsx | 19 +-- .../inserter-listbox/item.jsx | 53 +++--- .../inserter-listbox/row.jsx | 23 +-- .../inserter-search-results.jsx | 2 +- .../{inserter.jsx => inserter-sidebar.jsx} | 7 +- .../components/secondary-sidebar/menu.jsx | 2 +- assets/jsx/workflow-editor/css/inserter.css | 5 +- 10 files changed, 104 insertions(+), 171 deletions(-) rename assets/jsx/workflow-editor/components/secondary-sidebar/{inserter.jsx => inserter-sidebar.jsx} (85%) diff --git a/assets/js/workflowEditor.js b/assets/js/workflowEditor.js index 46498b934..c09a469f6 100644 --- a/assets/js/workflowEditor.js +++ b/assets/js/workflowEditor.js @@ -16683,7 +16683,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var reactflow__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! reactflow */ "./node_modules/@reactflow/core/dist/esm/index.mjs"); /* harmony import */ var _keyboard_shortcuts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../keyboard-shortcuts */ "./assets/jsx/workflow-editor/components/keyboard-shortcuts/index.jsx"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../constants */ "./assets/jsx/workflow-editor/constants.jsx"); -/* harmony import */ var _secondary_sidebar_inserter__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../secondary-sidebar/inserter */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter.jsx"); +/* harmony import */ var _secondary_sidebar_inserter_sidebar__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../secondary-sidebar/inserter-sidebar */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-sidebar.jsx"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @wordpress/components */ "@wordpress/components"); @@ -16731,7 +16731,7 @@ function WorkflowEditorLayout() { }, []); var secondarySidebar = function secondarySidebar() { if (isInserterOpened) { - return /*#__PURE__*/React.createElement(_secondary_sidebar_inserter__WEBPACK_IMPORTED_MODULE_9__.InserterSidebar, null); + return /*#__PURE__*/React.createElement(_secondary_sidebar_inserter_sidebar__WEBPACK_IMPORTED_MODULE_9__.InserterSidebar, null); } return null; }; @@ -19177,28 +19177,6 @@ function InserterListItem(_ref) { /***/ }), -/***/ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/context.jsx": -/*!**********************************************************************************************!*\ - !*** ./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/context.jsx ***! - \**********************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); -/** - * WordPress dependencies - */ - -var InserterListboxContext = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createContext)(); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InserterListboxContext); - -/***/ }), - /***/ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx": /*!********************************************************************************************!*\ !*** ./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx ***! @@ -19235,7 +19213,7 @@ function InserterListboxGroup(props, ref) { setShouldSpeak = _useState2[1]; (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { if (shouldSpeak) { - (0,_wordpress_a11y__WEBPACK_IMPORTED_MODULE_2__.speak)((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Use left and right arrow keys to move through blocks', 'post-expirator')); + (0,_wordpress_a11y__WEBPACK_IMPORTED_MODULE_2__.speak)((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Use left and right arrow keys to move through steps', 'post-expirator')); } }, [shouldSpeak]); return /*#__PURE__*/React.createElement("div", _extends({ @@ -19267,39 +19245,31 @@ function InserterListboxGroup(props, ref) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ InserterListbox: () => (/* binding */ InserterListbox), -/* harmony export */ InserterListboxGroup: () => (/* reexport safe */ _group__WEBPACK_IMPORTED_MODULE_2__["default"]), -/* harmony export */ InserterListboxItem: () => (/* reexport safe */ _item__WEBPACK_IMPORTED_MODULE_4__["default"]), -/* harmony export */ InserterListboxRow: () => (/* reexport safe */ _row__WEBPACK_IMPORTED_MODULE_3__["default"]), +/* harmony export */ InserterListboxGroup: () => (/* reexport safe */ _group__WEBPACK_IMPORTED_MODULE_1__["default"]), +/* harmony export */ InserterListboxItem: () => (/* reexport safe */ _item__WEBPACK_IMPORTED_MODULE_3__["default"]), +/* harmony export */ InserterListboxRow: () => (/* reexport safe */ _row__WEBPACK_IMPORTED_MODULE_2__["default"]), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/components */ "@wordpress/components"); /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/context.jsx"); -/* harmony import */ var _group__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./group */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx"); -/* harmony import */ var _row__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./row */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/row.jsx"); -/* harmony import */ var _item__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./item */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/item.jsx"); +/* harmony import */ var _group__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./group */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx"); +/* harmony import */ var _row__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./row */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/row.jsx"); +/* harmony import */ var _item__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./item */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/item.jsx"); /** * WordPress dependencies */ -/** - * Internal dependencies - */ - - -function InserterListbox(_ref) { +var InserterListbox = function InserterListbox(_ref) { var children = _ref.children; - var compositeState = (0,_wordpress_components__WEBPACK_IMPORTED_MODULE_0__.__unstableUseCompositeState)({ - shift: true, - wrap: 'horizontal' - }); - return /*#__PURE__*/React.createElement(_context__WEBPACK_IMPORTED_MODULE_1__["default"].Provider, { - value: compositeState + return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_0__.Composite, { + focusShift: true, + focusWrap: "horizontal", + render: /*#__PURE__*/React.createElement(React.Fragment, null) }, children); -} +}; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InserterListbox); /***/ }), @@ -19319,7 +19289,6 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/context.jsx"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var _excluded = ["isFirst", "as", "children"]; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } @@ -19335,38 +19304,35 @@ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = */ - -/** - * Internal dependencies - */ - function InserterListboxItem(_ref, ref) { var isFirst = _ref.isFirst, Component = _ref.as, children = _ref.children, props = _objectWithoutProperties(_ref, _excluded); - var state = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useContext)(_context__WEBPACK_IMPORTED_MODULE_2__["default"]); - return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_0__.__unstableCompositeItem, _extends({ + return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_0__.Composite.Item, _extends({ ref: ref, - state: state, role: "option" - // Use the CompositeItem `focusable` prop over Button's - // isFocusable. The latter was shown to cause an issue - // with tab order in the inserter list. + // Use the Composite.Item `accessibleWhenDisabled` prop + // over Button's `isFocusable`. The latter was shown to + // cause an issue with tab order in the inserter list. , - focusable: true - }, props), function (htmlProps) { - var propsWithTabIndex = _objectSpread(_objectSpread({}, htmlProps), {}, { - tabIndex: isFirst ? 0 : htmlProps.tabIndex - }); - if (Component) { - return /*#__PURE__*/React.createElement(Component, propsWithTabIndex, children); - } - if (typeof children === 'function') { - return children(propsWithTabIndex); + accessibleWhenDisabled: true + }, props, { + render: function render(htmlProps) { + var propsWithTabIndex = _objectSpread(_objectSpread({}, htmlProps), {}, { + tabIndex: isFirst ? 0 : htmlProps.tabIndex + }); + if (Component) { + return /*#__PURE__*/React.createElement(Component, propsWithTabIndex, children); + } + if (typeof children === 'function') { + return children(propsWithTabIndex); + } + return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_0__.Button, _extends({ + __next40pxDefaultSize: true + }, propsWithTabIndex), children); } - return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_0__.Button, propsWithTabIndex, children); - }); + })); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(InserterListboxItem)); @@ -19387,22 +19353,14 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/components */ "@wordpress/components"); /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/context.jsx"); function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /** * WordPress dependencies */ - -/** - * Internal dependencies - */ - function InserterListboxRow(props, ref) { - var state = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context__WEBPACK_IMPORTED_MODULE_2__["default"]); - return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__.__unstableCompositeGroup, _extends({ - state: state, + return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__.Composite.Group, _extends({ role: "presentation", ref: ref }, props)); @@ -19501,9 +19459,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_types_list__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./node-types-list */ "./assets/jsx/workflow-editor/components/secondary-sidebar/node-types-list.jsx"); /* harmony import */ var _panel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./panel */ "./assets/jsx/workflow-editor/components/secondary-sidebar/panel.jsx"); /* harmony import */ var _search_items__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./search-items */ "./assets/jsx/workflow-editor/components/secondary-sidebar/search-items.jsx"); -/* harmony import */ var _inserter_listbox__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./inserter-listbox */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/index.jsx"); -/* harmony import */ var _inserter_no_results__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./inserter-no-results */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-no-results.jsx"); -/* harmony import */ var _editor_store__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../editor-store */ "./assets/jsx/workflow-editor/components/editor-store/index.jsx"); +/* harmony import */ var _inserter_no_results__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./inserter-no-results */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-no-results.jsx"); +/* harmony import */ var _editor_store__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../editor-store */ "./assets/jsx/workflow-editor/components/editor-store/index.jsx"); +/* harmony import */ var _inserter_listbox__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./inserter-listbox */ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/index.jsx"); function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -19545,12 +19503,12 @@ var InserterSearchResults = function InserterSearchResults(_ref) { filterTypes = _ref.filterTypes; var debouncedSpeak = (0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_13__["default"])(_wordpress_a11y__WEBPACK_IMPORTED_MODULE_5__.speak, 500); var _useSelect = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_6__.useSelect)(function (select) { - var actionNodes = select(_editor_store__WEBPACK_IMPORTED_MODULE_12__.store).getActionNodes(); - var actionCategories = select(_editor_store__WEBPACK_IMPORTED_MODULE_12__.store).getActionCategories(); - var triggerNodes = select(_editor_store__WEBPACK_IMPORTED_MODULE_12__.store).getTriggerNodes(); - var triggerCategories = select(_editor_store__WEBPACK_IMPORTED_MODULE_12__.store).getTriggerCategories(); - var advancedNodes = select(_editor_store__WEBPACK_IMPORTED_MODULE_12__.store).getAdvancedNodes(); - var advancedCategories = select(_editor_store__WEBPACK_IMPORTED_MODULE_12__.store).getAdvancedCategories(); + var actionNodes = select(_editor_store__WEBPACK_IMPORTED_MODULE_11__.store).getActionNodes(); + var actionCategories = select(_editor_store__WEBPACK_IMPORTED_MODULE_11__.store).getActionCategories(); + var triggerNodes = select(_editor_store__WEBPACK_IMPORTED_MODULE_11__.store).getTriggerNodes(); + var triggerCategories = select(_editor_store__WEBPACK_IMPORTED_MODULE_11__.store).getTriggerCategories(); + var advancedNodes = select(_editor_store__WEBPACK_IMPORTED_MODULE_11__.store).getAdvancedNodes(); + var advancedCategories = select(_editor_store__WEBPACK_IMPORTED_MODULE_11__.store).getAdvancedCategories(); var nodeTypes = []; if (filterTypes && filterTypes.length) { nodeTypes = [].concat(_toConsumableArray(actionNodes.filter(function (node) { @@ -19587,7 +19545,7 @@ var InserterSearchResults = function InserterSearchResults(_ref) { debouncedSpeak(resultsFoundMessage); }, [filterValue, debouncedSpeak, filteredNodeTypes]); var hasItems = !lodash_isEmpty__WEBPACK_IMPORTED_MODULE_1___default()(filteredNodeTypes); - return /*#__PURE__*/React.createElement(_inserter_listbox__WEBPACK_IMPORTED_MODULE_10__.InserterListbox, null, !hasItems && /*#__PURE__*/React.createElement(_inserter_no_results__WEBPACK_IMPORTED_MODULE_11__.InserterNoResults, null), !!hasItems && /*#__PURE__*/React.createElement(_panel__WEBPACK_IMPORTED_MODULE_8__["default"], { + return /*#__PURE__*/React.createElement(_inserter_listbox__WEBPACK_IMPORTED_MODULE_12__["default"], null, !hasItems && /*#__PURE__*/React.createElement(_inserter_no_results__WEBPACK_IMPORTED_MODULE_10__.InserterNoResults, null), !!hasItems && /*#__PURE__*/React.createElement(_panel__WEBPACK_IMPORTED_MODULE_8__["default"], { title: /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_4__.VisuallyHidden, null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Nodes', 'post-expirator')) }, /*#__PURE__*/React.createElement(_node_types_list__WEBPACK_IMPORTED_MODULE_7__["default"], { items: filteredNodeTypes, @@ -19601,10 +19559,10 @@ var InserterSearchResults = function InserterSearchResults(_ref) { /***/ }), -/***/ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter.jsx": -/*!******************************************************************************!*\ - !*** ./assets/jsx/workflow-editor/components/secondary-sidebar/inserter.jsx ***! - \******************************************************************************/ +/***/ "./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-sidebar.jsx": +/*!**************************************************************************************!*\ + !*** ./assets/jsx/workflow-editor/components/secondary-sidebar/inserter-sidebar.jsx ***! + \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; @@ -19667,16 +19625,17 @@ function InserterSidebar() { return /*#__PURE__*/React.createElement("div", _extends({ ref: inserterDialogRef }, inserterDialogProps, { - className: "edit-post-editor__inserter-panel" + className: "editor-inserter-sidebar" }), /*#__PURE__*/React.createElement("div", { - className: "edit-post-editor__inserter-panel-header" + className: "editor-inserter-sidebar__header" }, /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__.Button, { icon: _wordpress_icons__WEBPACK_IMPORTED_MODULE_7__["default"], onClick: function onClick() { return closeInserter(); - } + }, + className: "block-editor-tabbed-sidebar__close-button is-small" })), /*#__PURE__*/React.createElement("div", { - className: "edit-post-editor__inserter-panel-content" + className: "editor-inserter-sidebar__content" }, /*#__PURE__*/React.createElement(_library__WEBPACK_IMPORTED_MODULE_4__.InserterLibrary, { showMostUsedNodes: showMostUsedNodes, showInserterHelpPanel: true, @@ -19876,7 +19835,7 @@ function InserterMenu(_ref) { }, /*#__PURE__*/React.createElement("div", { className: "block-editor-inserter__main-area show-as-tabs" }, /*#__PURE__*/React.createElement("div", { - className: "block-editor-inserter__content" + className: "block-editor-tabbed-sidebar" }, /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_2__.SearchControl, { className: "block-editor-inserter__search", onChange: function onChange(value) { @@ -24202,8 +24161,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `.edit-post-editor__inserter-panel-head justify-content: flex-end; } -@media (min-width: 600px) { - .edit-post-editor__inserter-panel-header { +@media (min-width: 782px) { + .editor-inserter-sidebar__header { display: none; } } @@ -24211,7 +24170,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `.edit-post-editor__inserter-panel-head .edit-post-header-toolbar .editor-document-tools__left > .edit-post-header-toolbar__inserter-toggle.is-pressed svg { transform: rotate(45deg); } -`, "",{"version":3,"sources":["webpack://./assets/jsx/workflow-editor/css/inserter.css"],"names":[],"mappings":"AAAA;IACI,aAAa;CAChB,yBAAyB;AAC1B;;AAEA;IACI;QACI,aAAa;IACjB;AACJ;;AAEA;IACI,wBAAwB;AAC5B","sourcesContent":[".edit-post-editor__inserter-panel-header {\n display: flex;\n\tjustify-content: flex-end;\n}\n\n@media (min-width: 600px) {\n .edit-post-editor__inserter-panel-header {\n display: none;\n }\n}\n\n.edit-post-header-toolbar .editor-document-tools__left > .edit-post-header-toolbar__inserter-toggle.is-pressed svg {\n transform: rotate(45deg);\n}\n"],"sourceRoot":""}]); + +`, "",{"version":3,"sources":["webpack://./assets/jsx/workflow-editor/css/inserter.css"],"names":[],"mappings":"AAAA;IACI,aAAa;CAChB,yBAAyB;AAC1B;;AAEA;IACI;QACI,aAAa;IACjB;AACJ;;AAEA;IACI,wBAAwB;AAC5B","sourcesContent":[".edit-post-editor__inserter-panel-header {\n display: flex;\n\tjustify-content: flex-end;\n}\n\n@media (min-width: 782px) {\n .editor-inserter-sidebar__header {\n display: none;\n }\n}\n\n.edit-post-header-toolbar .editor-document-tools__left > .edit-post-header-toolbar__inserter-toggle.is-pressed svg {\n transform: rotate(45deg);\n}\n\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); diff --git a/assets/jsx/workflow-editor/components/layout/layout.jsx b/assets/jsx/workflow-editor/components/layout/layout.jsx index 627d3d709..432b8469c 100644 --- a/assets/jsx/workflow-editor/components/layout/layout.jsx +++ b/assets/jsx/workflow-editor/components/layout/layout.jsx @@ -12,7 +12,7 @@ import { FEATURE_INSERTER, FEATURE_WELCOME_GUIDE } from "../../constants"; -import { InserterSidebar } from "../secondary-sidebar/inserter"; +import { InserterSidebar } from "../secondary-sidebar/inserter-sidebar"; import classnames from 'classnames'; import { SlotFillProvider } from "@wordpress/components"; import { SettingsSidebar } from "../settings-sidebar/settings-sidebar"; diff --git a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx index 4ad670356..4bfd35a0a 100644 --- a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx +++ b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/group.jsx @@ -11,7 +11,7 @@ function InserterListboxGroup(props, ref) { useEffect(() => { if (shouldSpeak) { speak( - __('Use left and right arrow keys to move through blocks', 'post-expirator') + __('Use left and right arrow keys to move through steps', 'post-expirator') ); } }, [shouldSpeak]); diff --git a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/index.jsx b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/index.jsx index e7242b476..3aa29902d 100644 --- a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/index.jsx +++ b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/index.jsx @@ -1,26 +1,17 @@ /** * WordPress dependencies */ -import { __unstableUseCompositeState as useCompositeState } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import InserterListboxContext from './context'; +import { Composite } from '@wordpress/components'; export { default as InserterListboxGroup } from './group'; export { default as InserterListboxRow } from './row'; export { default as InserterListboxItem } from './item'; -export function InserterListbox({ children }) { - const compositeState = useCompositeState({ - shift: true, - wrap: 'horizontal', - }); +export const InserterListbox = ({ children }) => { return ( - - {children} - + }> + { children } + ); } diff --git a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/item.jsx b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/item.jsx index a2be1c30b..06c266d79 100644 --- a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/item.jsx +++ b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/item.jsx @@ -1,52 +1,45 @@ /** * WordPress dependencies */ -import { - Button, - __unstableCompositeItem as CompositeItem, -} from '@wordpress/components'; -import { forwardRef, useContext } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import InserterListboxContext from './context'; +import { Button, Composite } from '@wordpress/components'; +import { forwardRef } from '@wordpress/element'; function InserterListboxItem( { isFirst, as: Component, children, ...props }, ref ) { - const state = useContext(InserterListboxContext); return ( - - {(htmlProps) => { + // Use the Composite.Item `accessibleWhenDisabled` prop + // over Button's `isFocusable`. The latter was shown to + // cause an issue with tab order in the inserter list. + accessibleWhenDisabled + { ...props } + render={ ( htmlProps ) => { const propsWithTabIndex = { ...htmlProps, tabIndex: isFirst ? 0 : htmlProps.tabIndex, }; - if (Component) { + if ( Component ) { return ( - - {children} + + { children } ); } - if (typeof children === 'function') { - return children(propsWithTabIndex); + if ( typeof children === 'function' ) { + return children( propsWithTabIndex ); } - return ; - }} - + return ( + + ); + } } + /> ); } -export default forwardRef(InserterListboxItem); +export default forwardRef( InserterListboxItem ); diff --git a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/row.jsx b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/row.jsx index 9f2b2e749..bafdbf8f5 100644 --- a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/row.jsx +++ b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-listbox/row.jsx @@ -1,24 +1,11 @@ /** * WordPress dependencies */ -import { forwardRef, useContext } from '@wordpress/element'; -import { __unstableCompositeGroup as CompositeGroup } from '@wordpress/components'; +import { forwardRef } from '@wordpress/element'; +import { Composite } from '@wordpress/components'; -/** - * Internal dependencies - */ -import InserterListboxContext from './context'; - -function InserterListboxRow(props, ref) { - const state = useContext(InserterListboxContext); - return ( - - ); +function InserterListboxRow( props, ref ) { + return ; } -export default forwardRef(InserterListboxRow); +export default forwardRef( InserterListboxRow ); diff --git a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-search-results.jsx b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-search-results.jsx index 33d94f6b4..a9b8d1667 100644 --- a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-search-results.jsx +++ b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-search-results.jsx @@ -20,9 +20,9 @@ import { useSelect } from '@wordpress/data'; import NodeTypesList from './node-types-list'; import InserterPanel from './panel'; import { searchNodeItems } from './search-items'; -import { InserterListbox } from './inserter-listbox'; import { InserterNoResults } from './inserter-no-results'; import { store as editorStore } from '../editor-store'; +import InserterListbox from './inserter-listbox'; export const InserterSearchResults = ({ filterValue, diff --git a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter.jsx b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-sidebar.jsx similarity index 85% rename from assets/jsx/workflow-editor/components/secondary-sidebar/inserter.jsx rename to assets/jsx/workflow-editor/components/secondary-sidebar/inserter-sidebar.jsx index 6da9fd93d..5be1c667f 100644 --- a/assets/jsx/workflow-editor/components/secondary-sidebar/inserter.jsx +++ b/assets/jsx/workflow-editor/components/secondary-sidebar/inserter-sidebar.jsx @@ -38,15 +38,16 @@ export function InserterSidebar() {
-
+
-
+
{ /* the following div is necessary to fix the sticky position of the search form */} -
+
{ diff --git a/assets/jsx/workflow-editor/css/inserter.css b/assets/jsx/workflow-editor/css/inserter.css index 04fac661a..200074b0b 100644 --- a/assets/jsx/workflow-editor/css/inserter.css +++ b/assets/jsx/workflow-editor/css/inserter.css @@ -3,8 +3,8 @@ justify-content: flex-end; } -@media (min-width: 600px) { - .edit-post-editor__inserter-panel-header { +@media (min-width: 782px) { + .editor-inserter-sidebar__header { display: none; } } @@ -12,3 +12,4 @@ .edit-post-header-toolbar .editor-document-tools__left > .edit-post-header-toolbar__inserter-toggle.is-pressed svg { transform: rotate(45deg); } + From 32959c3e093c1034bf0782ac1a3c4f5d0d878d95 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 13:05:45 -0300 Subject: [PATCH 02/17] Update min. requirements for WP 6.7 --- composer.json | 2 +- readme.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 632786a0d..283430414 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "prefer-stable": true, "minimum-stability": "stable", "require": { - "php": ">=7.2.5", + "php": ">=7.4", "ext-json": "*" }, "require-dev": { diff --git a/readme.txt b/readme.txt index 050f3ba33..f187cb21c 100644 --- a/readme.txt +++ b/readme.txt @@ -3,9 +3,9 @@ Contributors: publishpress, kevinB, stevejburge, andergmartins Author: publishpress Author URI: https://publishpress.com Tags: unpublish posts, update posts, schedule changes, automatic changes, workflows -Requires at least: 6.1 -Requires PHP: 7.2.5 -Tested up to: 6.6 +Requires at least: 6.7 +Requires PHP: 7.4 +Tested up to: 6.7 License: GPLv2 or later Stable tag: 4.1.0 From bf23df65241c10bf99f0b275d0c8ace61f54df25 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 13:14:42 -0300 Subject: [PATCH 03/17] Fix the top toolbar, #1028 --- assets/js/workflowEditor.js | 3 ++- .../jsx/workflow-editor/components/fullscreen-mode-close.jsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/assets/js/workflowEditor.js b/assets/js/workflowEditor.js index c09a469f6..f77eb1f38 100644 --- a/assets/js/workflowEditor.js +++ b/assets/js/workflowEditor.js @@ -15215,7 +15215,8 @@ function FullscreenModeClose(_ref) { icon: _wordpress_icons__WEBPACK_IMPORTED_MODULE_7__["default"] }); return /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__.__unstableMotion.div, { - whileHover: "expand" + whileHover: "expand", + className: "editor-header__back-button" }, /*#__PURE__*/React.createElement(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__.Button, { className: "edit-post-fullscreen-mode-close", href: (0,_wordpress_url__WEBPACK_IMPORTED_MODULE_3__.addQueryArgs)('edit.php', { diff --git a/assets/jsx/workflow-editor/components/fullscreen-mode-close.jsx b/assets/jsx/workflow-editor/components/fullscreen-mode-close.jsx index 1872af8dc..f0a6ff7a5 100644 --- a/assets/jsx/workflow-editor/components/fullscreen-mode-close.jsx +++ b/assets/jsx/workflow-editor/components/fullscreen-mode-close.jsx @@ -32,7 +32,7 @@ export function FullscreenModeClose({ showTooltip }) { let buttonIcon = ; return ( - +

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, 02 Nov 2024 15: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: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:93:\"WPTavern: Automattic and Matt Mullenweg Push for Dismissal of Key Claims in WP Engine Lawsuit\";s: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:30:\"https://wptavern.com/?p=178749\";s: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:104:\"https://wptavern.com/automattic-and-matt-mullenweg-push-for-dismissal-of-key-claims-in-wp-engine-lawsuit\";s: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:13466:\"

Automattic and Matt Mullenweg have filed a response asking the court to dismiss counts 1-6 and 9-11 of  WP Engine’s lawsuit. WP Engine had filed a motion on October 18, 2024 for a preliminary injunction in a Northern California court, seeking restored access to WordPress.org and a reversion to conditions as of September 20, 2024. 

\n\n\n\n

In response, Automattic has filed three key documents: a Motion to Dismiss WP Engine’s Complaint, a Motion to Strike, and the Opposition to WP Engine’s Preliminary Injunction.

\n\n\n\n

Automattic also tweeted, “Today, in order to protect the community from the threat posed by @WPEngine’s conduct, we have filed three documents with the court. These documents respond to WP Engine’s cherry-picked versions of events with critical context not found in their legal filings.”

\n\n\n\n

Let’s take a look at the main points in the documents.

\n\n\n\n

Motion to Dismiss WP Engine’s Complaint 

\n\n\n\n

The Motion to Dismiss begins with the introduction, “Contrary to the allegations in WP Engine’s Complaint, the perpetrator responsible for the harms against the WordPress community is not Automattic or Matt Mullenweg (“Matt”). It is WP Engine itself. Despite its own (mis)conduct, WP Engine’s Complaint now asks this Court to compel Matt to provide various resources and support to private equity-backed WP Engine for free, in the absence of any contract, agreement, or promise to do so. The Complaint also seeks to restrict Matt’s ability to express openly his perspective that WP Engine’s practices negatively impact the WordPress software platform and community—a platform and community that has been his life’s work. There is no legal or factual basis for the Court to compel such access or restrict such speech.”

\n\n\n\n

The motion argues that “WP Engine’s complaint is full of sound and fury, but WP Engine’s allegations ultimately signify nothing. Beneath the Complaint’s tone of indignation lies an utter absence of any factual allegations that do or could plausibly state a claim for relief. The Complaint strains mightily and misleadingly to conflate the WordPress software with Matt’s Website and with the WordPress trademarks, but it is devoid of any facts establishing that Matt has any obligation to provide the resources on the Website to WP Engine.”

\n\n\n\n

It states that “WP Engine’s misleadingly curated Complaint focuses solely on the events of the last two months, but this story actually begins over two decades ago, when Matt created a new way to build websites.”

\n\n\n\n

“Contrary to the allegations of the Complaint, Automattic, founded by Matt in 2005, does not own the WordPress software but rather offers three managed WordPress hosting services, WordPress.com for everyday users; Pressable, for agencies and developers; and WordPress VIP, for high-end enterprise sites including WhiteHouse.gov, NASA, Salesforce, and CNN. The WordPress ecosystem is also supported by the WordPress Foundation (“Foundation”)—a 501(c)(3) public benefit corporation dedicated to educating the public about WordPress and open source software. The role of the Foundation is charitable, educational, and scientific.”

\n\n\n\n

The motion details the significant time and resources that Matt and Automattic contribute to WordPress.org. “Matt is the owner of the WordPress.org domain name. Matt created the Website to support the WordPress community and software. Over time, the content the Website provides has become more robust. It takes significant resources from Matt and others to maintain the Website. For example, Matt and other employees of Automattic contribute over 3,500 hours weekly to support and maintain the Website, including the core software and other features offered through the Website.”

\n\n\n\n

The motion accuses WP Engine of leveraging WordPress resources for profit while failing to contribute meaningfully back to the community and profiting off the goodwill of the WordPress and WooCommerce trademarks. It alleges that WP Engine’s shift in practices began in 2018 when private equity firm Silver Lake took majority control, leading to intensified trademark use and an increased profit-driven focus. 

\n\n\n\n

Alleging trademark violations since 2021, the motion claims that WP Engine and Silver Lake have attempted to profit from WordPress’s reputation without bearing a share of the responsibilities. Matt had requested that WP Engine either license the WordPress trademarks or dedicate eight percent of its revenue to the further development of the open source WordPress software, but WP Engine declined.

\n\n\n\n

When it became abundantly clear to Matt that WP Engine had no interest in giving back, Matt was left with two choices: (i) continue to allow WP Engine to unfairly exploit the free resources of the Website, use the WordPress and WooCommerce trademarks without authorization, which would also threaten the very existence of those trademarks, and remain silent on the negative impact of its behavior or (ii) refuse to allow WP Engine to do that and demand publicly that WP Engine do more to support the community.

\n\n\n\n

The motion also states, “The mere fact that WP Engine made the risky decision to base its growing business on a site to which it has no rights or guarantee of access, without making backup plans, is not enough for it to conjure a claim out of legal thin air. Similarly, WP Engine’s business decision to rely on Matt’s Website does not provide any legal or factual basis for muzzling Matt and preventing him from criticizing WP Engine for acts that he believes are damaging the WordPress community.” 

\n\n\n\n

It continues, “The real unlawful activity here is WP Engine’s infringement of the WordPress and WooCommerce trademarks. This infringement was so egregious that in the days prior to filing this lawsuit, WP Engine scurried to delete various unauthorized uses of the WordPress and WooCommerce trademarks from its website—a tacit acknowledgement of their infringing nature.”

\n\n\n\n

In short, WP Engine’s complaint fails to state claims concerning intentional interference with contractual relations, tortious interference with prospective economic advantage, Computer Fraud and Abuse Act violations, attempted extortion, and unfair competition under California Business and Professions Code § 17200.

\n\n\n\n

Motion to Strike 

\n\n\n\n

Automattic and Matt Mullenweg have moved to strike parts of WP Engine’s complaint, citing California’s anti-SLAPP law. They argue that WP Engine’s  “claims fail as a matter of law and must be struck under California’s anti-SLAPP law because they improperly seek to impose liability for commentary and debate on an issue of public interest—namely, WP Engine’s commitment (or lack thereof) to the WordPress community – without any valid basis. WP Engine’s attempt to stifle public discussion of those issues via these claims violates California law and should be stopped here.”

\n\n\n\n

The motion also asserts,  “Matt was speaking and writing in his individual capacity as WordPress’s co-founder, and not as CEO of Automattic. There is no basis to impute his statements to the company. For these and other reasons, WP Engine’s ninth, tenth, and eleventh causes of action should be stricken.”

\n\n\n\n

WP Engine’s defamation claims are based on statements Mullenweg made on public platforms, which his attorneys argue are protected by the First Amendment and California law. 

\n\n\n\n

Mullenweg’s comments about WP Engine’s “parasitic” behavior were part of a broader conversation on the tragedy-of-the-commons theory, explaining the critical importance of meaningful, sustained contributions to the WordPress community through the Five for the Future initiative. Besides, WP Engine does not challenge any of Matt’s statements. 

\n\n\n\n

WP Engine’s trade libel claim fails to plausibly allege another required element: WP Engine has not identified any specific third party who was deterred from conducting business with WP Engine as a result of Matt’s Statements. 

\n\n\n\n

Opposition to WP Engine’s Preliminary Injunction

\n\n\n\n

Automattic and Matt have requested the denial of WP Engine’s motion, arguing that “WP Engine conflates the open source WordPress software with a website located at wordpress.org (“Website”) that is provided by Matt. The Website is distinct from the WordPress open source software platform and both are distinct from Automattic and the WordPress Foundation, a nonprofit public benefit corporation that was organized exclusively for charitable, scientific and educational purposes, not commercial endeavors. WP Engine’s CEO Heather Brunner feigns ignorance and reliance on a false understanding that an educational foundation was responsible for the Website that provides resources for commercial endeavors.”

\n\n\n\n

WP Engine has always had unrestricted access to the open-source WordPress software and plugins, which do not require login credentials. The only resources it cannot access are certain developer tools on WordPress.org, previously used to manage plugin versions. WP Engine quickly restored its lost functionality by hosting its plugins independently on its own website.

\n\n\n\n

WP Engine also seeks to limit competition by asking the Court to prevent Matt from criticizing its actions and to restrict Automattic from offering promotional incentives to consumers. Automattic contends that WP Engine’s purported damages, such as customer losses, result from WP Engine’s service quality rather than any actions by the defendants.

\n\n\n\n

Also “Matt does not and never has had any contracts, agreements, or obligations to provide WP Engine access to the Website. Nor did WP Engine pay any operating costs towards the Website or to access the Website for this convenience.”

\n\n\n\n

After losing access, WP Engine implemented a solution restoring its workflow by linking its plugins to its own servers. This setup has been operational for over a month, making any claimed harm from access denial either nonexistent or resolved.

\n\n\n\n

Since ACF plugin has over two million active installs, so any security vulnerability within ACF would threaten a substantial portion of the WordPress community, the WordPress security team forked that plugin, and named that fork SCF. The public was also notified of the developments.

\n\n\n\n

“WP Engine experienced a loss of income or capital in that intervening period, these losses are the result of its decision to freeride off the Website and Matt’s extensive efforts to support and maintain the Website, all the while knowing it had no contractual agreement entitling it to the continued receipt of those resources. WP Engine gambled, for the sake of profit, on Matt’s continued maintenance and provision of the Website for free. Having lost that bet, it cannot now come to the Court complaining of the consequences.”

\n\n\n\n

If an injunction is considered, the defendants argue that it should only cover access to WordPress software and plugins. WP Engine should also be required to post a bond compensating Matt for any services he might be compelled to provide, as well as Automattic for any lost revenue due to restricted competition. Maintaining WordPress.org involves annual administrative and operational costs estimated at $800,000. If WP Engine is granted ongoing access, a bond of at least $1.6 million should be posted to cover these services for the case’s expected two-year duration.

\n\n\n\n

Automattic has also issued the following public statement through its blog:

\n\n\n\n

“After engaging in conduct that undermines the WordPress community, WP Engine and its private equity owner, Silver Lake, have resorted to making unfounded allegations against the founder and vanguard of the open source software.”

\n\n\n\n

“WordPress open source software remains freely available to all. But WP Engine is not entitled, either legally or morally, to have unfettered access to WordPress.org—a website Matt Mullenweg built for the benefit of a robust community.”

\n\n\n\n

“Preserving and maintaining the resources made available on WordPress.org requires considerable effort, investment, and a shared sense of mission that the plaintiff does not embrace. WP Engine and Silver Lake should not expect to profit off the back of others without carrying some of the weight, and that is all that Matt is asking.”

\n\n\n\n

The court will next hold a hearing on November 26, 2024 and WP Engine has until November 4 to respond to Automattic and Mullenweg’s filings.

\";s: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, 02 Nov 2024 03:32: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:7:\"Jyolsna\";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:23:\"Matt: Disrupt Interview\";s: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=129595\";s: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/2024/11/disrupt-interview/\";s: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:517:\"

On Wednesday I had a great chat with Connie Loizos, the editor in chief of TechCrunch, you can view the video here:

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

Then yesterday Automattic filed its legal responses to the spurious lawfare from WP Engine, Silver Lake, and Quinn Emanuel. It’s a bit long, but if you have time give it a read, it’s the first time we’ve been able to put out our full story.

\";s: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, 02 Nov 2024 00:12: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: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:23:\"Matt: GPL Clarification\";s: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=128866\";s: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/2024/11/gpl-clarification/\";s: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:915:\"

A quick followup on my prior conversation with Theo.

\n\n\n\n

During that chat, I talked briefly about a trademark infringer that was also distributing nulled plugins. I said “Not illegal. Legal under the GPL. But they weren’t changing the names. They were selling their customers Pro Plugins with the licensing stuff nulled out.”

\n\n\n\n

I want to be clear that my reference to legality and GPL was solely focused on the copying and modifying of the code. That is one of the key freedoms of open source and GPL: the right to copy and modify GPL code.

\n\n\n\n

I was not speaking about their right to charge money for nulled plugins. GPLv2 prohibits that because they aren’t providing physical copies or support. This is very different from reputable web hosts, who provide hosting and support for websites and e-commerce stores.

\";s: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, 01 Nov 2024 17:00: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: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: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:90:\"Do The Woo Community: Friday Shares: This Week’s Must-Reads and Community Highlights, v2\";s: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=86475\";s: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:86:\"https://dothewoo.io/blog/friday-shares-this-weeks-must-reads-and-community-highlights/\";s: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:170:\"The content highlights recent updates, events, and resources within the WordPress and WooCommerce communities, emphasizing community engagement and upcoming developments.\";s: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, 01 Nov 2024 10:30:43 +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:5:\"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:\"\";}}}}}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:65:\"Gravatar: Introducing Native Integrations for Gravatar Mobile SDK\";s: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=2343\";s: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:93:\"https://blog.gravatar.com/2024/10/30/introducing-native-integrations-for-gravatar-mobile-sdk/\";s: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:4250:\"

We’re excited to announce the release of native integrations for the Gravatar Mobile SDK, now available for both iOS and Android. These SDKs make it easier than ever to integrate Gravatar’s powerful avatar and profile management features into your mobile applications.

\n\n\n\n

What’s New?

\n\n\n\n

Our platform-specific SDKs leverage native UI frameworks – Compose for Android and Swift UI for iOS – to provide seamless integration with your existing mobile applications. Each SDK is carefully crafted to follow platform-specific best practices while maintaining consistent functionality across ecosystems.

\n\n\n\n

One of the more exciting additions is our new native Avatar Change Flow – a complete, ready-to-use UI component that can be embedded directly into your app. This feature eliminates the need to build your own avatar management system, saving you valuable development time. Users can easily update their Gravatar image through a polished, platform-native interface that handles all the complexity of image selection, cropping, and uploading.

\n\n\n\n

Key Features

\n\n\n\n\"\"Gravatar SDK in Pocket Casts\n\n\n\n
    \n
  • Ready-to-Use UI Components: Display profile views and avatars with pre-built components
  • \n\n\n\n
  • Efficient Avatar Management: Calculate and download avatar URLs based on email addresses
  • \n\n\n\n
  • Built-in Image Caching: Optimize performance with automatic image caching
  • \n\n\n\n
  • Profile Integration: Fetch and display Gravatar profiles directly within your app
  • \n\n\n\n
  • Avatar Upload Support: Enable users to update their Gravatar images from your app
  • \n
\n\n\n\n

Platform-Specific Benefits

\n\n\n\n

Android SDK

\n\n\n\n
    \n
  • Built with Kotlin and Jetpack Compose, with easy compatibility with the old view system
  • \n\n\n\n
  • Seamless integration with modern Android development workflows
  • \n\n\n\n
  • Android-specific optimizations for performance
  • \n
\n\n\n\n

iOS SDK

\n\n\n\n
    \n
  • Written in Swift with native iOS UI frameworks
  • \n\n\n\n
  • Available via CocoaPods and Swift Package Manager
  • \n\n\n\n
  • iOS-specific extensions including UIImageView integration
  • \n
\n\n\n\n

Getting Started

\n\n\n\n

Visit our GitHub repositories to start integrating Gravatar into your mobile apps:

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

For implementation guides and detailed documentation, visit our developer site.

\n\n\n\n

Security and Privacy

\n\n\n\n

Your users’ privacy and security are our top priority. The SDK implements secure data handling via oAuth and gives users full control over their profile visibility.

\n\n\n\n

Visit our privacy pledge here.

\n\n\n\n

Coming Soon

\n\n\n\n

We’re actively working on expanding the SDK’s capabilities with full profile editing support. This upcoming feature will allow users to manage additional profile fields and user information directly within your app, making it even easier to provide a comprehensive Gravatar integration experience.

\n\n\n\n

We’re committed to improving the developer experience and would love to hear your feedback. Try out the new SDKs and let us know what you think!

\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:\"Wed, 30 Oct 2024 15:39:43 +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: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:116:\"WPTavern: #143 – Aaron Reimann and Keith Osburn on How WordPress Is Transforming Georgia’s Educational Landscape\";s: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=178438\";s: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:127:\"https://wptavern.com/podcast/143-aaron-reimann-and-keith-osburn-on-how-wordpress-is-transforming-georgias-educational-landscape\";s: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:49613:\"Transcript
\n

[00:00:00] 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, how education and WordPress can work hand in hand.

\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 Aaron Reimann and Keith Osburn.

\n\n\n\n

Keith is the chief information officer and Deputy Superintendent for Tech Services at the Georgia Department of Education. With a rich background in both education and technology, he’s been instrumental in driving tech innovation within the state’s education system.

\n\n\n\n

Aaron runs ClockworkWP, a WordPress agency, and boasts extensive experience in web development dating back to 1996.

\n\n\n\n

Together, they’ve been leveraging WordPress to tackle some of Georgia’s most pressing educational needs.

\n\n\n\n

We start off by discussing the financial advantages of using WordPress to achieve cost efficiencies compared to pricier alternatives. Keith shares his insights into how Georgia has successfully rolled out community focused sites and specialized platforms for the state’s educational staff.

\n\n\n\n

The conversation moves on to their collaboration with other states, advocating for open source solutions to solve enterprise level problems.

\n\n\n\n

We get into the infrastructure choices, including dedicated Azure servers for individual WordPress instances, ensuring better control and scalability.

\n\n\n\n

We also touch on their strategic approach to resource discoverability and user engagement. Highlighting significant traffic and potential for growth through grants and professional learning events.

\n\n\n\n

Aaron and Keith elaborate on the importance of accessibility, GDPR compliance, and the role of collaboration in addressing security and legal concerns.

\n\n\n\n

One standout part of this episode features the culinary sites they created, aimed at helping Georgia schools manage cafeteria recipes and nutritional information. Streamlining a previously manual task, and saving significant time for school staff.

\n\n\n\n

Towards the end, we discuss the cultural shift towards open source platforms, emphasizing the flexibility, cost-effectiveness, and community driven spirit of WordPress in education.

\n\n\n\n

If you’re curious to learn about how technology can enhance educational systems and promote global collaboration, 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 Aaron Reimann and Keith Osburn.

\n\n\n\n

I am joined on the podcast today by Aaron Reimann and Keith Osburn. How are you both doing?

\n\n\n\n

[00:03:47] Aaron Reimann: I am doing well, thank you.

\n\n\n\n

[00:03:49] Nathan Wrigley: You’re welcome.

\n\n\n\n

[00:03:50] Keith Osburn: Nathan, thank you so much for having us today. Really excited to be with you today. Doing very, very well.

\n\n\n\n

[00:03:55] Nathan Wrigley: Thank you so much. We’re here at WordCamp US. We’re in Portland, Oregon. We’re going to be talking today about education in the state of Georgia in particular, and how WordPress is being used to, well, hopefully make the job of teaching, the profession of teaching, a little bit more straightforward with the benefit of technology.

\n\n\n\n

Before we begin that, I wonder if you would both in turn like to give us your little bio, because I know you have very different roles in life. So maybe if we start with you, Keith, just a short bio about who you are and what you do.

\n\n\n\n

[00:04:22] Keith Osburn: Absolutely. So thank you so much Nathan. So, again, my name is Keith Osburn. I serve as the Chief Information Officer and the Deputy Superintendent for Tech Services for the Georgia Department of Education. And so my team is both responsible for the technology that the department uses, but also helping ensure that educational technology has a purpose, a meaningful purpose, if you will, in the school systems throughout Georgia.

\n\n\n\n

[00:04:45] Nathan Wrigley: Is your background then more in tech, or more in education, or a bit of both?

\n\n\n\n

[00:04:49] Keith Osburn: It’s actually a bit of both. So I was a classroom teacher for a number of years. I taught chemistry and physics at the high school level. Again, I’ve been in education for 35 years, and so I was there long enough to see really the first introductions of technology into the classroom, and just became really fascinated with that, and began to ultimately merge into that, and became a technology specialist, and a Chief Information Technology Director, and then ultimately moved to the State Department.

\n\n\n\n

[00:05:14] Nathan Wrigley: Thank you so much. So I guess we’ll hand the mic to Aaron and, yeah, tell us a little bit about yourself.

\n\n\n\n

[00:05:19] Aaron Reimann: So my name’s Aaron Reimann and I run an agency called ClockworkWP, and we specialise in pretty much anything WordPress. We’ve grown a lot in the past year and a half or so, and we’re about, depending on how you count everybody, we’re about 14, 15 people or so. And I’ve been doing WordPress since 2008, and been doing web development since 96. So I have got a lot of gray hair because I’ve been doing it for a long time.

\n\n\n\n

[00:05:44] Nathan Wrigley: How did you two hook up, if you don’t mind me asking? Do you both have some sort of hobby that crosses, or did you go out looking?

\n\n\n\n

[00:05:51] Keith Osburn: That’s an interesting, love that question, and it’s a great story that we love to tell. So I do have an interest in both the open source community, and certainly WordPress in addition to that. But actually there’s a unique event that happened. We had an event, a WordPress meetup that happened to be virtual, and one Aaron Riemann happened to be speaking that night. And as it turns out, I had a situation that had arisen within Georgia, and it was during the time of the pandemic, where obviously as you well know, we as a society completely socially distanced.

\n\n\n\n

But training needed to happen. And specifically our bus drivers throughout the state of Georgia needed annual security training, safety training. And we were trying to think, how do we train them? But at the same time, we can’t get them together. And so obviously technology became an opportunity for us. And so my team and I, we built a small WordPress instance. We used a plugin called Learn Dash. I’m sure you’re probably familiar with that.

\n\n\n\n

What happened was nothing less than just stellar growth that happened. You know, we had 50 people one day, we had 500 people in the next couple of days. And then it just really became quite asymptotic. As it turns out, you know, I just was in the event just because of my interest there, and as I listened to Aaron talk, and he began to talk about hosting some types of things, it just really formatted my mind that he and I needed to talk. So I said, Aaron, will you remain on the call after you’re done, please. You and I need to talk. And that formed a lasting bond, and a great public private partnership, if you will, of which all the stuff that we’ll probably talk about today has materialised from. So, great event.

\n\n\n\n

[00:07:21] Nathan Wrigley: Nice. That’s really great. Is there anything you want to add?

\n\n\n\n

[00:07:25] Aaron Reimann: I would just say, I lead the Atlanta WordPress meetup, and that to me is just a big plug. If you’re trying to get into a WordPress community, you can get good clients by doing that. So I love the WordPress community. So doing a little plug there.

\n\n\n\n

[00:07:37] Nathan Wrigley: Well that’s great. Thank you so much. Now, in the UK, which is the only educational format, for want of a better word, the only educational locale that I can talk about, I don’t know if it in any way resembles how it is in the US, but my impression of the US is that it’s atomised by state. So the things that you do in Georgia may well be different from how they’re done here in Oregon, and Portland, and all over the place.

\n\n\n\n

But in the UK, I don’t know, probably about 20 years ago, the technological area of education was kind of flooded by proprietary, paid for services. You know, Microsoft stepped in and dominated the kind of desktop space, and a whole bunch of other things. But then there was a move much more recently to free and open source software. I think there was a thought that in the future we want to be educating our children in how to do open sourcey things, and we had this lovely thing called a Raspberry Pi which came along, which really kind of opened the technology of the hardware up to children.

\n\n\n\n

But I just wondered if we could get into the open source nature, and whether or not that’s an important part of the Georgia landscape, free, open source software? Or do you find yourself being compelled by state legislation to use proprietary, paid for software?

\n\n\n\n

[00:08:46] Keith Osburn: Wow, great question. And you’re right, it could very well vary by state. Every state has something that’s probably unique about them, and in regards to education that could be driven by legislation law, or policy procedures, those types of things. In this particular case, and certainly, you know, an enterprise organisation as large as we are, Georgia’s population as a whole is about 10.8 million people. We have 2 million students. 230 plus districts. 2,500 schools. Each one of those, by the way, have some degree of local control. And so, we as a state, our job is to provide service and support.

\n\n\n\n

I think what started this conversation for me as a state chief was really beginning to notice a change in the landscape, especially as it relates to technology. And you’re right, the big enterprise organisations still have a footprint, and a necessary footprint in there. However, I think the conversation gets interesting because, around the time of the pandemic, I think the mentality about the purposes of software and software solutions changed. And I say in yesteryear, oftentimes there were solutions that were built, and then people begin to look for, hey, how do we apply this? Where’s a problem? Let’s find a problem.

\n\n\n\n

Today there are problems already, and so we build towards that. Which means that really what we need to do is look for opportunities to be much more agile and responsive, because we’ve identified a need. This is what’s strong within the open source community, and certainly whenever you think about the culture of WordPress, this is what makes them such a strong, and what I consider to be a viable opportunity and solution for us.

\n\n\n\n

And so I specifically went because I appreciated that that culture was going to give me what I needed. That really agile opportunity for me to be responsive to solutions that were already needed, and thus the community could customise, highly customise, I should say, solutions for exactly what the problem happened to be.

\n\n\n\n

[00:10:35] Nathan Wrigley: It’s interesting, in the UK about 15 years ago, children were being taught how to use Microsoft products. That was the curriculum. How do you create a Word document? How do you use a spreadsheet? Now it’s more, how do you program? How do you learn fundamentals of programming? How can you use Python? How can you use PHP and things like that? So there’s a real shift. And whilst it may not be pointing the finger directly at WordPress, it’s definitely moved in that kind of direction. And obviously the more open source things that you can put into the institutions, the more value for money you’re going to get out because you don’t have to pay these giant software licenses.

\n\n\n\n

But getting to the topic at hand today, and I should just point out that both Aaron and Keith have done a presentation at WordCamp US, and I’ll link to that in the show notes, that kind of will outline the conversation that we’re having. But what was the problem in Georgia that you wanted to solve, that you needed WordPress for? So I’m just going to leave it as open as that. What were you trying to fix with WordPress?

\n\n\n\n

[00:11:28] Keith Osburn: Yeah, yeah, absolutely. It goes back to that first story I told that as, you know, education in and of itself is a communication based, people driven thing, right? And so as our teachers, the 300,000 teachers and staff across Georgia became socially distanced, they still had at their primary need to educate children. In order to do that, communication has to happen.

\n\n\n\n

And you can imagine that natural communication between you and I sitting across the table is quite easy. When you put technology, or you need to put technology in there, there need to be some guardrails, there need to be some opportunities to allow for that growth that doesn’t necessarily kind of stymie what needs to happen.

\n\n\n\n

We begin to kind of conceptualise on this idea of saying, hey, we’ve got now 300,000 staff members that are dispersed, socially distanced from one another, but they still need to communicate.

\n\n\n\n

And so we concocted this idea that now has become what we call our community project, where we found a specific WordPress solution, coupled with some plugins that we used, that enabled us to really facilitate both synchronous now, and asynchronous conversations, that were content and topic specific. So that we could link together math teachers, or we could link together science teachers regardless of their location, geography, and enable that conversation to still happen.

\n\n\n\n

So that site, literally again, we had no idea that it would grow the way that it did. We were probably anticipating that we would have literally linear year growth, but it became quite asymptotic. To this day we now have a WordPress instance of a community that has 88,000 viable ongoing conversations inside of that with about 500 people adding to that each week. 240 unique groups that exist inside of this platform. So it is truly this new technical society, if you will, that supports the communication needs of teachers across the totality of the state.

\n\n\n\n

[00:13:18] Nathan Wrigley: Given that this all was promoted by the pandemic, or at least that’s the takeaway that I got, was this a case of suddenly scrambling around for a solution that had to be implemented yesterday, more or less? And I’m curious because in the UK at the moment, and this has nothing to do with education, a lot of those solutions are now beyond their sell by date, if you know what I mean. You know, things were cobbled together ever so quickly, they worked for a period of time, they were sort of hanging together, and then it’s turned out that actually, probably with hindsight, if we’d have had six months lead time on this, we probably would’ve done something different.

\n\n\n\n

But it sounds like what you have has stayed the test of time, has managed to keep going, and it wasn’t a cobbled together solution. It worked exactly as you’d expected, or has it been an iteration and an evolution?

\n\n\n\n

[00:13:59] Keith Osburn: And that’s absolutely where interstates left Aaron, because the initial iterations of that were right. My team at the time didn’t necessarily have say WordPress engineers, or experts in that. I probably was the one, and I already had a day job being a CIO. And so we quickly outgrew what the initial iteration of that was, and began to recognise. That’s that serendipitous event where Aaron just happened to be doing a WordPress meetup, and I happened to be on that, and I recognised, just listening to him, I was like, I need that guy, and I need his team.

\n\n\n\n

And so thus begin that union. And I remember our first conversations were like, listen, we’ve built something and we’ve outgrown it almost overnight. We need some real help, and we really need to begin to kind of strategise and strategically plan on this thing because, again, it’s not growing linear, it’s growing asymptotically, and so we need to plan for that.

\n\n\n\n

And that’s I think really important point to be going back to that first question that we had about this idea of public private partnerships now, are critically important, because you see that expertise in a particular area who can listen to somebody whose expertise happens to be in this case education and saying, here’s where our problems at, here’s our soft spots. And he says, okay, this is what me and my team do, this is the way that we’re going to collaborate to build a solution that will meet the needs today, but ongoing with that in the future as well.

\n\n\n\n

[00:15:15] Nathan Wrigley: So maybe this question is going now to Aaron. We know that it’s got something to do with WordPress, we know it’s got to do with Georgia, and we know it’s got to do with education, but beyond that, what are the specific things that you’ve had to build? Is this like a portal for children? Is it a portal for the teachers to get together and communicate lesson plans? What have you had to build?

\n\n\n\n

[00:15:33] Aaron Reimann: There’s been I think a total of nine projects that we’ve done. The first project was the community project where they basically had a WordPress install on a server that just couldn’t handle the traffic, it grew overnight. We split that up into two different servers where MySQL’s on its own little thing, and nginx is on its own. That was just a quick little fix to split it up. We’ve moved it into the Azure framework since then.

\n\n\n\n

We’ve done some marketing sites to, I guess the PHP list is an application that we are using that we’ve internally converted, basically they have a LISTSERV. There’s an old school LISTSERV that the state was using and has nothing to do with WordPress, but I was like, well, we probably can help in that situation.

\n\n\n\n

I picked this open source project, PHP list, and then realised later that it doesn’t have everything that we needed built in. So my team has built that application out. So that’s not necessarily WordPress, but I mean it’s open source and PHP. But we’ve done marketing sites to the culinary site.

\n\n\n\n

[00:16:36] Nathan Wrigley: That’s interesting, culinary.

\n\n\n\n

[00:16:37] Aaron Reimann: So basically we have built, there was a need for the schools, how many cafeterias are there in Georgia?

\n\n\n\n

[00:16:45] Keith Osburn: Well, there’s 230 districts, there’s about 2,500 schools, so you can imagine. We’ll go with that number because every one of those schools is going to have a cafeteria. And that’s a nutrition program.

\n\n\n\n

[00:16:54] Aaron Reimann: Okay. So they don’t have, up until recently, they didn’t have a way to share recipes. And now there’s an application where anybody in the school can go in and set up a five day schedule with all the recipes that has all of the nutritional information about each vegetable, and meat, and all that. And so they can basically print that out, and say that, and use that for the school. And there was nothing like that out there. It’s not super complex what was built, but I mean, we’re using WordPress with custom post types, and WordPress gives us a lot of flexibility to build those things out.

\n\n\n\n

[00:17:30] Nathan Wrigley: So it sounds like it’s mainly for staff. It’s not forward facing for children to access content. It’s like a CMS for bits and pieces that educators and people, I don’t know, it sounds like people working in the kitchens and things like that might need to use. So it’s not directly forward facing to the children, but it’s all of the minutiae of how to manage a school, and how to get teachers communicating with each other, that kind of thing.

\n\n\n\n

[00:17:54] Keith Osburn: Absolutely. And I think probably a value add is to say that we strongly believe, and I think all of us probably here do that the power is in the teacher. The power is in the school staff. They’re the ones that are doing the work. Our jobs are to provide services and support, certainly at a state agency as well. That’s probably a primary role for us.

\n\n\n\n

And so specifically we were targeting solutions specifically for teachers, for the wraparound staff so that they could do the great work that they do. In this case, one of the things that was mission critical to us was trying to find out that we could use technology as a way to ultimately save them time.

\n\n\n\n

There are a lot of mundane things that happen, a lot of reiterations of things that really technology, if we’re innovative, can take that time, and do that task, and give that back to either the teacher, or the staff member, or whatnot.

\n\n\n\n

Again, here’s an opportunity where nutrition staff we’re probably laboriously sitting down spending countless hours looking at products that says, what are their nutritional values, and how do we pair that with this over here? And now what we’ve done is we’ve implemented a technological solution that literally does what normally would’ve required hours. We’re doing that in now mere minutes and seconds. That’s a win-win. That’s a huge win-win.

\n\n\n\n

[00:19:03] Nathan Wrigley: So it’s reducing the amount of paperwork. It sounds like you’re moving away from a paper-based system into a more technologically, everything is data basically. And WordPress’ motto if you like is democratising publishing, but this feels like democratising information, democratising education. And I can barely think of a better use of WordPress than education. It just ticks every single box, doesn’t it? It’s perfect.

\n\n\n\n

[00:19:28] Keith Osburn: We totally agree in that. And you know, again, that goes back to the very start of our conversation where it’s like, what was it about free and open source software? It was like, again, the opportunity for us to, from my world as a CIO in an education vertical, say, I see this problem, and then say, how do I with experts in this case, Aaron and team say, here’s my problem. I can pretty much verbalise that. And he says, okay, I understand that, I can wrap a solution around that, and we can do this working together in a very responsive fashion. That’s the win-win, I think from this.

\n\n\n\n

And now for us, we’ve seen so many wins immediately, I don’t think that we’ve had any where we’re saying, oh, it was a good try, but no, that’s not going to work. It’s every one has been something that we’ve built on the previous one. And every one of those solutions has been incredibly effective.

\n\n\n\n

You heard Aaron talk about the fact that we’ve got several projects. We’re in the midst now of taking our state website, and we’re going to bifurcate that because there’s information that’s destined for public stakeholders. There’s also information that’s really pertinent to our school districts and whatnot.

\n\n\n\n

And so we’re, one more time we’re using WordPress in this instance to build a website that is unique and able to deliver for our public stakeholders the information that they find viable, and that they need.

\n\n\n\n

It doesn’t have to be all so complex with other information that’s really destined for school leaders, or school district personnel, or teachers in this case instead. Now, through a bifurcated process, we’re able to deliver information that is necessary for the time for that specific individual. So this highly customised solution, suddenly WordPress has helped us achieve.

\n\n\n\n

[00:21:00] Nathan Wrigley: Yeah, I know that there’ll be instances where WordPress will not be the best fit because there’ll be proprietary software, which is just superior. And there’ll probably be data protection concerns and things like that for, I don’t know, salaries, and payroll, and all sorts of things that I can imagine.

\n\n\n\n

But would your intention be to get WordPress’s foot in the door for many more things in Georgia, or are you happy with where you’ve got to so far? Or would the idea be to keep going back to Aaron and say, actually, here’s another area where we might be able to squeeze WordPress into the mix.

\n\n\n\n

[00:21:27] Keith Osburn: I’ll answer that by saying, a few years back when we began to kind of realise that, in the world of education, I say that technology changed from a gee whiz bank state to become mission critical. We recognised that that was a pertinent question to ask ourselves.

\n\n\n\n

And so we created a team called Knowledge and Resource Management, and that’s all that they do. Their job is to think about digital and data that’s constructed as a result of these technological processes. And think about, how does this enable us to better understand what we’re doing today, but also begin to think about what’s our innovation schedule as we kind of move forward?

\n\n\n\n

And so that’s what they do is really sit down in advance. We as a leadership team, we sit down and we begin to kind of strategically plan. Obviously the student and the teacher, if you will, is at the center of our planning. Our job is to think about, how do we customise solutions that will help them better.

\n\n\n\n

And at this point in time, it’s not ever that free and open source is just a, I’ve run out of tricks, let me go see if this thing can do it. It’s a vital part of the conversation during the strategic planning process. And if that’s the solution, that’s the solution. And it’s just like, we look at that on the same level and the same ground as we do, various other enterprise solutions.

\n\n\n\n

The one thing that I believe that’s really important to note that we’ve proven here is that there could have been this perception of many that say, WordPress can’t obviously meet up to this enterprise need. Actually, we’ve kind of blown that out the water. We literally have staggering numbers. 88,000 and hundreds of thousands of people that hit the website, and those types of things. And we’re showing WordPress is absolutely capable of working in the enterprise. And so it needs to be considered a viable part of strategic plan if it’s the one that fits that need.

\n\n\n\n

[00:23:05] Nathan Wrigley: One of the best things about WordPress is the fact that somebody’s very often built the very thing that you need. There’s a plugin that fits the bill. And I’m just wondering if that was the case in this scenario Aaron. Were you able to take pre-built things and thereby save the state a bunch of money because actually somebody’s already built the CMS, or the plugin that would handle the recipe side of things, or was this a ton of custom code right from the ground up?

\n\n\n\n

[00:23:28] Aaron Reimann: We used a lot of plugins at the beginning to get, I guess I can promote, we use Gravity Forms all the time. It gives us so much flexibility and it’s so easy to integrate. Hook into filters, and send information out.

\n\n\n\n

So we’ll use a lot of plugins at the beginning, and then we have to, not always, but most of the time we have to tweak it a little bit. We need to add, oh, we need it to do this thing so we might write a plugin to hook in and modify the way Gravity Forms works. Or it might be a totally, this doesn’t exist, and we have to build it. But I mean, we always will vet plugins, make sure that they’re going to be safe, and secure, and give us the stability we need. And if it doesn’t, we’ll write it.

\n\n\n\n

I would say every site that we build, we do use basic, common plugins. I mean, Yoast and things like that. I mean, just plugins that everyone uses. And then most of the time we have to do a little customisation.

\n\n\n\n

[00:24:22] Nathan Wrigley: Have you been talked to by the Georgia authorities in terms of, well, we use the term GDPR because that’s just the one that we’ve got, but it’s this overarching privacy legislation, which really gets its teeth into more or less everything that you do with websites. Is there anything like that that you’ve had to, I don’t know, you’ve had to build something custom because the plugin doesn’t seem to satisfy this privacy thing, or it doesn’t do this particular thing?

\n\n\n\n

So in the UK the GDPR and things like that really do compel you to look really hard, especially when it’s public sector stuff. You’ve got to look really hard at the code and make sure, okay, it definitely isn’t keeping data. It definitely isn’t sending data somewhere else. I can a hundred percent vouch for it. It’s not a case of, yeah, I’ve used Gravity Forms before, that’s fine.

\n\n\n\n

[00:25:05] Aaron Reimann: I’ll just say GDPR. I know all of that stuff is coming, and more and more states are requiring it. I mean, one of the things I think about is accessibility. That’s becoming super important, and we always want to make sure when we build a site, specifically for the state, that we go through and we hit whatever level. There’s multiple levels of accessibility that we try to meet. And that, I would say that’s probably more important for us now than any type of GDPR stuff. But I know that’s coming probably in every state.

\n\n\n\n

[00:25:34] Nathan Wrigley: Yeah, so the accessibility piece. Well, you can’t build any of these things unless there is accessibility. And I don’t know what the WCAG standard is that you have to adhere to, but I’m guessing you have to be pretty mindful of the accessibility piece.

\n\n\n\n

[00:25:47] Aaron Reimann: Absolutely.

\n\n\n\n

[00:25:48] Keith Osburn: Yeah, and if I go back to that, it’s so important, and you heard me mention our Knowledge and Resource Management Team. Whenever the project for rebuilding the website happened. I’ll tell you that, we planned for more than a year before we ever even began to kind of think about code, because of that.

\n\n\n\n

One of the things that’s really important for us today is, number one, again, you heard me say earlier, we’re producing digital data far more than we ever have in past. And as a result of that, you’re right, the game’s changed. We have to think about that. Think about where that’s going to reside.

\n\n\n\n

Who were those data generated as a result of? If it’s a student, obviously we take great concerns because we’re considered to be the stewards of their data, right?

\n\n\n\n

All that happened during project planning. And I remember us specifically, part of Aaron’s team sitting down with my team in that respect and saying, okay, we’re going to talk about this, we’re going to talk about the fabric that we’re going to build this on top of. We’re going to talk about any kind of security concerns, accessibility, those things. That’s part of the culture now. And I think that’s really a great question that you ask because I think that is of paramount importance.

\n\n\n\n

Now, to Aaron’s point. Before a project ever starts, we should know all that in advance, right? We’re all going to sit down. And while there are unique needs per state, by and far, I think we’re all moving towards the same area. And that is that accessibility should be always covered. That’s just a non question, it’s got to be done.

\n\n\n\n

The other’s really data privacy, those types of things. It’s going to be taken care of beforehand. And then at that point in time, now Aaron knows that we’ve taken care of that, so now as he begins to kinda look at the various plugins, he now has a little opportunity to begin to kinda look into the T’s and C’s of those plugins and say, hey, if there’s something unique about this, he’ll bring that question back.

\n\n\n\n

I have a data privacy officer and say, hey, what’s going on with this? Is this something that’s in congruence with state law in Georgia, or is this something that we need to look at from that? So prior planning has enabled us to really be able to make sure that whenever we begin to write code, that we’re very aggressive, very responsive, and we’ve kind of already taken care of the hiccups if you will.

\n\n\n\n

[00:27:41] Nathan Wrigley: Financially, does free and open source software like WordPress, does that impress the bean counters, the accountants on your side of things? Is it a fairly compelling argument to go to them and say, look, we could pay hundreds of thousands of dollars for this thing over here, but look, we’ve got this WordPress thing and the software itself is completely free, there’s a bunch of plugins that are a few hundred dollars? I’m guessing there’s some fairly compelling argument.

\n\n\n\n

[00:28:03] Keith Osburn: Yeah, that’s a great question. I’d say that’s probably a growing question. I don’t know that it’s gotten to the point now where like all the accountants come to me and say specifically this versus that. But I will say that, as a state chief, I’m ethically and from an advocacy standpoint, responsible for ensuring the good stewardship of tax dollars because that’s what I’m spending.

\n\n\n\n

That is factored into every conversation that we have to say, is this a good spend, and are we going to get the solution based on the strategic initiative that we needed to address? And so that really is a part of my team. When we begin to sit down and strategically plan, we have identified that there’s a need. And then we begin to say, what’s the best way for us to get there?

\n\n\n\n

It’s just now, as I said earlier, WordPress isn’t one of those things that we consider whenever we’ve run out of options. Now, it’s really a part of the ongoing conversation to say, we’ve proven that this could be a viable solution. If this is the viable solution, this is the path that we’re going to take. And by the way, we found out that this is a very cost efficient way for us to do something and still get efficacy when we’re done with that.

\n\n\n\n

[00:29:05] Nathan Wrigley: And do you speak to people who have the equivalent job to you in the other states?

\n\n\n\n

[00:29:10] Keith Osburn: Absolutely.

\n\n\n\n

[00:29:11] Nathan Wrigley: And they found this conversation to be of interest, and have they looked favorably on what you are doing in Georgia?

\n\n\n\n

[00:29:16] Keith Osburn: Yeah, I will say that there’s a couple of states that we now have really begun to kind of work as a group to really showcase the opportunity for us to kind of expand our own vision and say, don’t think that the big box, aisle seven, row three solution is just the only way to go. But instead, maybe Chief Information Officer should also be considered to be Chief Innovation Officer now.

\n\n\n\n

And we should just begin to kind of look and say, our job is to figure out the best way to solve that problem, or provide that solution, not look for an opportunity to buy something that maybe fits that. Maybe, or maybe not, or maybe 70%. But instead say, no, let’s figure out the way to solve that problem over there. Open source, free open source solutions could very well be a very viable, and we’ve proven that it could solve enterprise level problems.

\n\n\n\n

[00:30:05] Nathan Wrigley: I’m just going to a quote something from the blurb of the presentation that you’ve both been involved in at WordCamp US, and it says the following. In the past three years, Georgia established a community focused site for statewide education staff using a strategic set of plugins and custom modifications within WordPress to produce the functionality needed. And I think we’ve covered that.

\n\n\n\n

Once that site was launched, it opened the door for multiple additional WordPress sites under the GADOE, which I’m presuming is the Georgia Department of Education umbrella. Including continuing education events for staff across the state, a better menu builder with state approved recipes for cafeteria staff, and rebuilding the main GADOE site using a headless WordPress setup with Next.js.

\n\n\n\n

So the bit that I want to focus on there is the words multiple additional WordPress sites. And this is probably squarely aimed at Aaron. How are you tying these multiple sites together? Is this like a, we’ve got a WordPress site over here, and another one over here, and another one over here. Or are we dealing with multi-site? Is it all connected in some way? Have you got single sign on so that the teachers can get in with one set of user credentials? How’s it all hanging together?

\n\n\n\n

[00:31:11] Aaron Reimann: So right now we have multiple websites that are WordPress, they’re not multi-site. It’s not multi-tenancy or anything like that. We have individual WordPress instances on individual virtual servers on Azure.

\n\n\n\n

That gives us a little control to be able to scale it up and down. I’ve had environments before where we’ve had multiple WordPress sites, and the way the infrastructure is built, it is, if you only need to scale up one, it has to scale up everything. And I like the fact that we have it split up individually, allows us to scale up and down.

\n\n\n\n

There isn’t anything that is unique, except for the headless WordPress site. That infrastructure is going to be different than all of the kind of more like marketing WordPress sites.

\n\n\n\n

[00:31:59] Keith Osburn: Maybe the one thing I’ll add is that, one of the things that we’re certainly, we don’t expect anybody to understand the technology behind that. What we were looking for early days, and again, what Aaron’s team have been helping us build is this idea to purposely, if you will, almost bottleneck the way that people get access to resources that we find.

\n\n\n\n

We could probably all agree on is that if you build the best resource on planet Earth, it’s still valueless if nobody can find it. And that’s been a challenge for us in the past is that we’re a large organisation, you can tell we have these siloed teams within the department, and they all produce resources. But unless you know, you didn’t necessarily know where to find those. You didn’t know how to go about that.

\n\n\n\n

We began to say, this is an opportunity again for technology to help us save time of that individual. So we begin to say, we’ve got a very successful event, the community project. We have 80,000 people that are visiting that. That’s slightly more than 50% of our teachers, but we still got some room to grow.

\n\n\n\n

And, hey, there’s these other things like strategic grants that we provide, or maybe policy and guidance. Maybe there’s some professional learning events, and if people don’t know that we do all these things, they’re for nought.

\n\n\n\n

So we said, why don’t we figure out ways to hone that together and we begin to use, for instance, the communities, dare I say storefront, as a way to provision those, so that those are immediately visible. So now somebody that could be a public stakeholder, or a practitioner, educational practitioner comes to the site to log in, but they say, oh, I see that there are new things up here, let me click on those. And now it’s just simply the convenience of us reusing something that they’re vastly familiar with already, as a way for us to share more resources with them.

\n\n\n\n

So the technology behind the scenes, obviously we’re working to make sure that those work tandem. And you talk about SSO and those types of things, those are strategically part of what we’re doing. But ultimately, right now, the whole idea continues to be, how do we get critically important information rapidly to that stakeholder that needs that? And that’s the reason why they came to visit that site, right? And so that’s, again, what we’re driving towards.

\n\n\n\n

[00:33:58] Nathan Wrigley: I know that I said this earlier, but I can barely think of a better example where technology, WordPress, meets humanity, education. It’s just this perfect, perfect relationship. And it just encapsulates everything which is wonderful about, well, open source software, but in this case, we’re at a WordPress event and we nerd out on WordPress. So it just seems like the perfect way to use that technology.

\n\n\n\n

And think that’s all of the questions that I’ve got. I just applaud you for what you’ve been doing. And obviously the fact that you’re here talking about it at an enormous WordPress event means that you must both be pretty proud of what you’ve done as well. So congratulations.

\n\n\n\n

[00:34:35] Keith Osburn: Well, thank you. Aaron and I both will tell you that I think one of the other attributes, one of the strong features of the open source community is that we recognise that we’re a culture and we need to share. And if you have successes, you’re right, there are a lot of children outside of Georgia that need to be educated. And if we found a solution and it works, we should talk about that. And here’s an opportunity to say to another state, or another organisation that’s in this business to say, here’s a great opportunity that has been very successful for us. Look and study the partnership that’s happened from private to public from that instance.

\n\n\n\n

And we don’t mind talking about that. We’re certainly proud that we’ve done something that is a viable solution. But at the same time, I think we also have that responsibility to share what’s been working. And if there have been pitfalls that we hit along the way, or soft spots that we needed to iterate around, we should be willing to talk about that.

\n\n\n\n

[00:35:24] Nathan Wrigley: Yeah, I know we’ve talked about the technology a lot in this podcast episode, but underlying the whole thing feels like there’s morals. There’s just like a real moral basis to what you’re doing. That just feels really nice.

\n\n\n\n

And also you mentioned state boundaries, and it feels like this conversation goes beyond that even. You know, there’s no reason why what you are doing couldn’t be applicable in Canada, or the UK, or Poland, or Australia, or any other place you mentioned. So it’s a big conversation for sure.

\n\n\n\n

[00:35:48] Keith Osburn: I would love to see this conversation become global because, again, I think that any educator is in the business. They trained to do that thing of educate children, not educate children in this specific spot, but just say to educate children.

\n\n\n\n

We as technologists have had a responsibility to figure out ways, in this case, for me, because of that’s my vertical, to figure out technological solutions that will support them.

\n\n\n\n

Well, my technologist peers, irregardless of location, I know that they desire to do the same thing. So I want to share with them. And I know that they’ll do the same thing with me, and we do. We have a very collaborative, non-competitive partnership that exists. And you’re right, it’s not bound by state, it’s not bound by nation, but instead, it’s like all of us saying, let’s link together, let’s figure out how we solve this problem if one exists, because we all desire to do the same thing. Ensure that every kid, irregardless of location, gets an opportunity to be successful.

\n\n\n\n

[00:36:42] Nathan Wrigley: Technologically important stuff that kind of gets out of the teacher’s way. Yeah, that’s perfect. Thank you Aaron, and thank you Keith for chatting to me today.

\n\n\n\n

[00:36:50] Keith Osburn: Absolutely. Thank you, Nathan.

\n\n\n\n

[00:36:51] Nathan Wrigley: Appreciate it.

\n\n\n\n

[00:36:51] Aaron Reimann: Yeah, thank you very much.

\n
\n\n\n\n

On the podcast today we have Aaron Reimann & Keith Osburn.

\n\n\n\n

Keith is the Chief Information Officer and Deputy Superintendent for Tech Services at the Georgia Department of Education. With a rich background in both education and technology, he’s been instrumental in driving tech innovation within the state’s education system. Aaron runs Clockwork WP, a WordPress agency, and boasts extensive experience in web development dating back to 1996. Together, they’ve been leveraging WordPress to tackle some of Georgia’s most pressing educational needs.

\n\n\n\n

We start off by discussing the financial advantages of using WordPress to achieve cost efficiencies compared to pricier alternatives. Keith shares his insights into how Georgia has successfully rolled out community-focused sites and specialised platforms for the state’s educational staff.

\n\n\n\n

The conversation moves on to their collaboration with other states, advocating for open-source solutions to solve enterprise-level problems. We get into the infrastructure choices, including dedicated Azure servers for individual WordPress instances, ensuring better control and scalability.

\n\n\n\n

We also touch on their strategic approach to resource discoverability and user engagement, highlighting significant traffic and potential for growth through grants and professional learning events. Aaron and Keith elaborate on the importance of accessibility, GDPR compliance, and the role of collaboration in addressing security and legal concerns.

\n\n\n\n

One standout part of this episode features the culinary site they created, aimed at helping Georgia schools manage cafeteria recipes and nutritional information, streamlining a previously manual task and saving significant time for school staff.

\n\n\n\n

Towards the end we discuss the cultural shift towards open-source platforms, emphasising the flexibility, cost-effectiveness, and community-driven spirit of WordPress in education. 

\n\n\n\n

If you’re curious to learn more about how technology can enhance educational systems and promote global collaboration, this episode is for you.

\n\n\n\n

Useful links

\n\n\n\n

ClockworkWP

\n\n\n\n

LearnDash

\n\n\n\n

Custom WordPress Solutions for Educational Initiatives‘ – WordCamp US presentation

\n\n\n\n

LISTSERV

\n\n\n\n

Gravity Forms

\n\n\n\n

Yoast

\n\n\n\n

WCAG

\";s: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 Oct 2024 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: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:57:\"Do The Woo Community: The New Woo Logo Set for Early 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:43:\"https://dothewoo.io/?post_type=blog&p=86454\";s: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:61:\"https://dothewoo.io/blog/the-new-woo-logo-set-for-early-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:141:\"Woo unveiled a new logo for 2025 at the State of the Woo. This is what Tamara Niesen from Woo and our hosts Jonathan and Courtney had to say.\";s: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 Oct 2024 10:24:16 +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:5:\"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:\"\";}}}}}i:30;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:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"HeroPress: WordCamp Romania is in 2 weeks!\";s: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:29:\"https://heropress.com/?p=7602\";s: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:127:\"https://heropress.com/wordcamp-romania-is-in-2-weeks/#utm_source=rss&utm_medium=rss&utm_campaign=wordcamp-romania-is-in-2-weeks\";s: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:8116:\"\"WordCamp

I wanted to go to this one, I really did, but it didn’t work out. Part of the reason I was looking forward to it is that I’d have to take the train for the last leg, check out where camp is:

\n\n\n\n\n
function kb_google_map7602_57de17c1() { let center = { lat: 37.8201, lng: -122.4781}; let map = new google.maps.Map(document.getElementById(\"kb-google-map7602_57de17c1\"), {\n zoom: 7,\n center: center,});let marker = new google.maps.Marker({ position: { lat: 37.8201, lng: -122.4781}, map: map, });}
\n\n\n

Bucharest is where almost all international flights end, and then we take the train north.

\n\n\n\n

Not only is there the train ride, but one of the suggested places to stay is The House of Dracula Hotel.

\n\n\n\n\"House\n\n\n\n

Who doesn’t want to stay there?

\n\n\n\n

The Speakers!

\n\n\n\n

As tradition suggests, the speaker lineup is excellent. Here are just a few examples.

\n\n\n
\n\n
\n\"Alexandra\n
\n\n\n\n
\n

Alexandra Bădiță

\n\n\n\n

Turning Stories into Brands: A Blueprint for Women Entrepreneurs on WordPress

\n\n\n\n

Alexandra Bădiță, a storytelling and journaling expert, encourages women entrepreneurs to leverage the art of storytelling for brand-building. With over eight years in digital marketing and a Master’s in Journalism and Advertising, she empowers women to transform their narratives into impactful brands.

\n
\n\n
\n\n
\n\n
\n\"Horia\n
\n\n\n\n
\n

Horia Neagu

\n\n\n\n

Turning the Age-Old WP Civil War Into a Win-Win

\n\n\n\n

For as long as we can remember, developers and SEOs have been locked in a seemingly endless tug-of-war. From conflicting priorities to communication gaps, the tension between these two crucial roles has been referred to as the “WP Civil War.” But what if there was a way to turn this age-old rivalry into a powerful partnership?

\n
\n\n
\n\n
\n\n
\n\"Madalin\n
\n\n\n\n
\n

Madalin Milea

\n\n\n\n

Managing Stress for a Healthier Work Experience

\n\n\n\n

Madalin is all about helping you find that sweet spot between work and life. In his session, he’ll dive deep into how you can maintain a work-life balance, identify your stress levels at work, and discover tools to help manage and improve your well-being. Here’s a sneak peek at what he’ll be talking about:

\n\n\n\n
    \n
  1. Work-Life Balance: Finding the Right Mix
  2. \n\n\n\n
  3. Identifying Stress Levels at Work
  4. \n\n\n\n
  5. Tools for Improvement: Surveys and Focus Groups
  6. \n\n\n\n
  7. Productivity Tips for Remote Workers
  8. \n
\n
\n\n
\n\n\n

The Venue

\n\n\n\n

The Poiana Brasov Leisure & Entertainment Center is a delightful place full of fun things, including a video arcade, pool tables, hiking and biking areas and most importantly, session rooms!

\n\n\n\n\"Poiana\n\n\n\n

Talk to me!

\n\n\n\n

If you go to WordCamp Romania I’d love to talk with you about it. We can do a text chat, or a video chat and we can talk all about it. You can email topher at this site’s domain, or leave a comment!

\n\n\n\n

\n

The post WordCamp Romania is in 2 weeks! appeared first on HeroPress.

\";s: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 Oct 2024 17:46: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:\"\";}}}}}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:53:\"WordPress.org blog: WordPress 6.7 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:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18043\";s: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/2024/10/wordpress-6-7-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:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8697:\"

The second release candidate (RC2) for WordPress 6.7 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.7 is the best it can be.

\n\n\n\n

You can test WordPress 6.7 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.7-RC2
WordPress PlaygroundUse the 6.7 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.
You can test the RC2 version in four ways.\n\n\n\n

The current target for the WordPress 6.7 release is November 12, 2024. Get an overview of the 6.7 release cycle, and check the Make WordPress Core blog for 6.7-related posts in the coming weeks for further details.

\n\n\n\n

What’s in WordPress 6.7 RC2?

\n\n\n\n

Get a recap of WordPress 6.7’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

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.7. 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.7 (scheduled for November 12, 2024), 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.7 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.7.

\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

Release the haiku

\n\n\n\n

Six point seven’s dawn,
RC2 sweeps bugs away,
Sites stand firm and strong.

\n\n\n\n

Thank you to the following contributors for collaborating on this post: @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:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 29 Oct 2024 17:08:31 +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:\"David Baumwald\";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:46:\"Do The Woo Community: Taking a Break This Week\";s: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=86423\";s: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/taking-a-break-this-week/\";s: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:151:\"The last few weeks have been crazy for me, but not just in the way you might be thinking. So I need a little break this week from posting any episodes.\";s: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 Oct 2024 13: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:5:\"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:\"\";}}}}}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:37:\"Matt: Kindness and Techcrunch Disrupt\";s: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=129406\";s: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://ma.tt/2024/10/kindness-techcrunch/\";s: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:1290:\"

Back in June I recorded an episode with Jaclyn Lindsey on the Why Kindness podcast, for their awesome non-profit kindness.org. You can listen to it through Pocket Casts here:

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

This is kind of funny because I’m obviously in the midst of the big battle with Silver Lake and WP Engine. I am a huge proponent of kindness, but sometimes you have to stand up for what’s right if someone is taking advantage of you.

\n\n\n\n

I’m continuing to do some select press, and will be appearing in a conversation with Techcrunch’s Editor-in-Chief, Connie Loizos, at 10:30AM on Wednesday in San Francisco at their Disrupt conference. It’s an amazing conference! Over 10k people from all over the world, just started today. I’m glad they were able to work me into the schedule, I think it will be a timely conversation. We may even have an announcement to make. \"🙂\"

\";s: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 Oct 2024 04:06: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: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: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:71:\"WPTavern: WP Engine Files Injunction, Hearing Set for November 26, 2024\";s: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:30:\"https://wptavern.com/?p=178456\";s: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:80:\"https://wptavern.com/wp-engine-files-injunction-hearing-set-for-november-26-2024\";s: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:5462:\"

WP Engine filed a motion on October 18, 2024 for a preliminary injunction in a Northern California court, seeking restored access to WordPress.org and a reversion to conditions as of September 20, 2024. The hearing is set for November 26, 2024.

\n\n\n\n

The Injunction filed claims that Matt and Automattic have “engaged in a self-proclaimed “nuclear” war aimed at destroying WPE’s business because WPE dared to stand up and speak out against Defendants’ extortionate demand for tens of millions of dollars annually for a purported “license” WPE does not even need.” 

\n\n\n\n

It went on to say that Matt and Automattic’s action included “blocking WPE’s access to business resources including those used to service its customers, blocking WPE’s customers from accessing important security updates, making a litany of false and disparaging statements, and even expropriating one of WPE’s most popular software products as its own. Facing this onslaught of retaliatory actions, WPE had no choice but to file suit to protect its business, its employees, its customers, and the entire community in which it operates.”

\n\n\n\n

The injunction also mentions that WP Engine has suffered losses as  “the data show a 14% increase in cancellation requests, 333 fewer new contracts than expected from the “sales-assisted” channel, and a 29% drop in new customers from the “self-service” channel.”

\n\n\n\n

In response, Automattic and Mullenweg stated, “This case is not about Plaintiff’s access to WordPress… this case instead is about WordPress.org – a website owned and run by Defendant Matt Mullenweg individually, for the benefit of the community he loves. WordPress.org is not WordPress. WordPress.org is not Automattic or the WordPress Foundation, and is not controlled by either. To the contrary, as Plaintiff itself acknowledges, WordPress.org is Mr. Mullenweg’s responsibility.”

\n\n\n\n

It continues, “Mr. Mullenweg has no contracts, agreements, or obligation to provide WP Engine access to the network and resources of WordPress.org. WP Engine points to no terms, conditions, or permissions that entitle them to such access. Nevertheless, WP Engine, a private equity-backed company, made the unilateral decision, at its own risk, to build a multi-billion dollar business around Mr. Mullenweg’s website. In doing so, WP Engine gambled for the sake of profit that Mr.Mullenweg would continue to maintain open access to his website for free. That was their choice.”

\n\n\n\n

On his blog, Matt published this about WP Engine, “They say this is about community or some nonsense, but if you look at the core, what they’re trying to do is ask a judge to curtail my First Amendment rights.” he also said, “I will refrain from personally commenting on the WP Engine case until a judge rules on the injunction. I will continue to exercise my First Amendment rights to promote others’ speech.”

\n\n\n\n

This has drawn much concern from the WordPress community. Jeff Chandler (WP Tavern founder) tweeted,  “The words in this document can not be over emphasized enough to current and future WordPress builders. These statements generate shock waves to the core of what has been built and maintained over the last 21 years. Honestly, I don’t see Matt doing these things to any other plugin or business in the future. But the fact that he has done it at all means it’s a risk that has to be accounted for.”

\n\n\n\n

AspirePress published If WordPress.org is not for the community, then we will be while web developer Brian Coords tweeted, “WordPress/.org is not WordPress” is a good reminder that only the code is open source. When you build something online, you should treat all platforms and distribution channels as someone else’s sandbox and plan accordingly.” 

\n\n\n\n

Andrew Palmer (entrepreneur and co-founder of Bertha AI) shared another point of view in his tweet, “Do you really want someone else running WordPress? If so, be careful what you wish for. Have a look at the open source projects that are no longer Open Source and let me know. https://en.wikipedia.org/wiki/List_of_formerly_open-source_or_free_software”.

\n\n\n\n

Katie Keith (CEO of BARN2 Plugins) tweeted about the injunction, “I hope it brings some stability to the WordPress ecosystem, as people won’t be constantly wondering what will happen next \"🤞\".”

\n\n\n\n

The dispute has now attracted broader media attention, with coverage from outlets including BBC 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:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 28 Oct 2024 03:14: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:7:\"Jyolsna\";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:148:\"Gutenberg Times: Gutenberg Changelog #110 – Gutenberg 19.5, WordPress 6.7, Create Block Theme Plugin and a Thousand Block Themes at the Repository\";s: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=30629\";s: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:114:\"https://gutenbergtimes.com/podcast/gutenberg-changelog-110-gutenberg-19-5-wordpress-6-7-create-block-theme-plugin/\";s: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:54725:\"

In this episode, Birgit Pauli-Haack and Joni Halabi discuss Gutenberg 19.5, WordPress 6.7, Create Block Theme Plugin and a Thousand Block Themes at the Repository

\n\n\n\n

Show Notes / Transcript

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

Show Notes

\n\n\n\n

Special guest: Joni Halabi

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

Announcements

\n\n\n\n

Snippet: Conditionally unregister patterns

\n\n\n\n

1000 Block Themes

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

What’s released

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

What’s in the works

\n\n\n\n

WordPress 6.7 Source of Truth

\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 110th episode of the Gutenberg Changelog podcast. In today’s episode we will talk about Gutenberg 19.5, WordPress 6.7, Create Block Theme plugin, and thousand block themes at the repository. Yay! I’m your host, Birgit Pauli-Haack, curator at the Gutenberg Times and full-time core contributor for the WordPress Open Source project sponsored by Automattic.

\n\n\n\n

Today’s special guest has been on the show before and I’m thrilled to have her again, it’s the wonderfully smart Joni Halabi from Georgetown University in D.C. She was a guest on episodes 97 and 91. And she’s also the author of the article Static vs. Dynamic Blocks: What’s the difference? on the WordPress Developer blog. Welcome back, Joni. How are you today?

\n\n\n\n

Joni Halabi: Oh, thank you so much for having me. I’m doing great.

\n\n\n\n

Birgit Pauli-Haack: Awesome. Awesome. So for our new listeners, maybe you can briefly introduce yourself and your connection to WordPress. And I know you changed responsibilities at Georgetown, so what are you working on now?

\n\n\n\n

Joni Halabi: Yeah, so hi everybody. My name is Joni Halabi. I have been working at Georgetown University for the past eight and a half years. I started at Georgetown as a senior web developer with our web services group. And most of my responsibility was developing custom blocks and other post editor customizations in WordPress for our now over 500 sites that we support, which is super exciting.

\n\n\n\n

I recently, as of about three and a half weeks ago, just switched roles and I am now the senior web manager for the office of the president. So I’ve gone from development to content. My primary role right now is to basically update the content for our president’s website and make sure that it has all of the information people need in terms of our university initiatives and other things that are important to our office.

\n\n\n\n

Birgit Pauli-Haack: Awesome.

\n\n\n\n

Joni Halabi: I’m so happy to be here. Thank you for having me.

\n\n\n\n

Birgit Pauli-Haack: Oh, no, absolutely. Always great to have you on the show, Joni. So 500 websites, that’s one number that I’m in awe of. Then going from custom block development to using as a content creator is probably a total different challenge because you can look back on so and so, “Oh, did we do this right?” kind of thing, yeah? And so bug reports.

\n\n\n\n

Joni Halabi: Yeah, I think my old team is not going to be very happy with me because it is such a different perspective. As the developer, I never really got that 1,000 foot view of our websites in terms of how a content editor really sees these blocks. And to be on the other side of that and to be using these blocks and thinking about, “Okay, this is the story that I want to tell. How can I use these blocks,” it is such a different perspective. It’s an exciting perspective, but I already have ideas for new blocks that I want to exist.

\n\n\n\n

Birgit Pauli-Haack: Ok.

\n\n\n\n

Joni Halabi: Sorry, services.

\n\n\n\n

Birgit Pauli-Haack: Yeah. So I’m not drilling down into that, but there’s certainly something to unpack for the next time you’re on the show. But it’s so great that you actually can change the perspective and kind of feel, “All right, now I get a 360 view on the whole WordPress content creation experience and block development.” So the next hurdle would be to tap your toes into block themes and kind of see how that works for your organization, for the web team, yeah?

\n\n\n\n

Joni Halabi: I would love to. I did some experimentation with block themes while I was there, and I could speak for the next 40 minutes about this, but the high level overview was I did an experiment where I created a block theme but connected it to our external patterns for different blocks in different parts of our pages because we were using KSS node for that to create a pattern library. And I’ve actually given a couple of talks on this topic. I did one at WP Campus last year. They’re all linked to you for my website, but yeah, it was a fascinating experiment. It’s complicated and not complicated. Like I said, I could talk for 40 minutes.

\n\n\n\n

Birgit Pauli-Haack: Yeah. We’ll share the links in the show notes for our listeners to have a different perspective on things, so that’s really good. So you did get a 360 view on WordPress with all the experience that you have. Excellent, yeah.

\n\n\n\n

Announcements                                                       

\n\n\n\n

And for the show, we have a few announcements today for you, dear listeners. One is the developer blog or the contributors at the developer blog, we are starting something new, and that’s kind of a snippet library. We have one snippet online, that’s the first one because we need to iterate on the layout as well as on the editorial process for that. But it’s conditionally unregistered patterns. And Justin Tadlock put that up and he has a few use cases. One of them is, okay, you build your own custom blocks on the theme and use patterns for that, but if that block is not available on your site, you need to unregister the pattern too. So it’s not going to come in with, “Oh, this block is not available kind of thing.” So I think a lot of people who curate the editor experience for the clients can definitely use that as well to unregister some patterns from my block theme or so they haven’t built themselves. Yeah.

\n\n\n\n

So if you have ideas about that, you can comment on that either on the Gutenberg Times on the podcast show or on Storify, where our podcast also landed and has a few listeners. So there is a little comment button on your mobile app where you can comment what other ideas you would need for snippets. I know that Nick Diego and Justin and myself and Ryan, we will probably brainstorm the first hundred snippets for that relatively fast.

\n\n\n\n

Community Contributions – 1,000 Block Themes

\n\n\n\n

And then as from the intro, we have the announcement, a thousand block themes are now in the WordPress theme directory, yes. And it’s really amazing how fast. It took a little while. The first hundred took, I don’t know, a year, the second hundred another year, but then it kind of sped up until now. And we have three people who actually covered that this week. One is Ganga Kafle, he’s the co-team rep for the theme team, and he had statistics and that is that the first theme was done by Carolina Nymark early on. And then Automattic has 116 block themes in the repository. That’s about less than 10. Well, a little bit over 10%. And then there are other theme shops that have 20, 28, 30. Really the first 10 theme producers I think come up with about 400 or so. I haven’t ended up, maybe it might be 500. And then the rest is divided up by other people from the community. So yeah, bring your blog theme to the repository too.

\n\n\n\n

Joni Halabi: Yeah, this is amazing to me because these only count the block themes that are in their repository. And I’m sure that there are so many authors and companies and organizations out there that have their own custom theme just for them that is probably a block theme. They’re just not in the theme repository. And it is so impressive that the adoption of block themes has happened this fast because it feels… I know it’s been a few years, but it feels like it’s only yesterday when block themes were introduced.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And I think they’re only kind of viable now with the theme parts and the site editor where you can edit the templates. And then have the query loop has really emerged as a power tool for theme developers.

\n\n\n\n

Joni Halabi: Oh, yeah.

\n\n\n\n

Birgit Pauli-Haack: And there’s a lot of designers who don’t have to touch code to build themes and they use the site editor. So it’s just really amazing.

\n\n\n\n

Joni Halabi: Yeah, it’s fabulous. I mean, you can start with the Twenty Twenty Four theme. I did this recently with the site. You can start with the Twenty Twenty Four theme, use that site editor and then copy. If you want to save all of your customizations, you can do everything that you want to in the site editor and then copy the HTML for your new templates, your new template parts, and paste it into a theme. And you have that saved if you need it. And it is so powerful. You don’t need the code. Somebody like me, I need the code. But somebody who’s not familiar with HTML or CSS or is intimidated by it, you don’t need to know it anymore. And it’s game changing.

\n\n\n\n

What’s Released – Create Block Theme Plugin 2.6

\n\n\n\n

Birgit Pauli-Haack: Absolutely. And the global styles and design tools that come with it, you can really say change the default look of blocks and it’s going to be saved. So the next thing that I wanted to point out here on this show is, and we talked about it before, but it seems that we talked, Joni, that you haven’t really used the Create Block Theme plugin yet. And that really helps theme developers to use the site editor to have everything that’s stored in the database, then exported into the theme files. And that is the most powerful thing that I’ve seen, that you can create a child theme, you can create or clone an existing theme on the site, or you start with a very bare bone skeleton, but then you can use the site editor to style your blocks, your sections, create patterns, and it all kind of comes together with saving the theme, exporting the theme, and have it outside.

\n\n\n\n

Because the layer of having core styles then having theme styles, and then the user styles can only all come together in one theme if you want to reuse it. And that’s kind of the gap that the plugin really closes for that.

\n\n\n\n

Joni Halabi: Yeah, that sounds amazing. I don’t know if you would know the answer to this, but has there been any talk about bringing that plugin into core because that feels like eventual core functionality?

\n\n\n\n

Birgit Pauli-Haack: Yeah, there is talk about it. And that plugin is pretty much like the Gutenberg plugin, kind of the beta version of what might come into core. I think it’s more the explanation while everything in core that touches the theme and the styles and the section styles and variations, those are still in active development. So the plugin is kind of following along in core and even goes a little bit further in core with the patterns, for instance, saving the patterns. But yeah, it would definitely be something that the developers kind of looking at, maybe bringing some of the features into core that are a little bit more mature once the features are kind of set in their ways, because some of that data views and some of the global styles that’s still so active in development that I think otherwise you couldn’t test the concepts if you put it in core because then it would be released and then it would be backwards compatible, and you don’t want to kind of be tied down to backwards compatibility.

\n\n\n\n

Joni Halabi: Yeah, that’s a lot of work. But I do. That’s great to hear. And I also do love this pattern of actively developing and testing something in a separate plugin with an eventual goal or a thought of bringing it to core. And it’s something that I always thought was unique to the Gutenberg plugin, but it’s nice to see that it’s also happening with other pieces, like larger pieces of functionality.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Yeah. That happens actually also with improvements for the media library. The performance team has actually published, or Pascal from the performance team has some media experiments on his repo that are in the plugin. They’re not officially kind of WordPress. The Create Block Theme is on the WordPress organization, separate repo. But yeah, some of the contributors have done that with their own experimentation. So it’s really good to see.

\n\n\n\n

Dave Smith has a plugin. He’s a core contributor, and he just released a plugin for the responsive navigation that’s not in core yet, but it’s kind of testing it out outside of the Gutenberg repo to get faster to feedback. And so I will share the links and also in the show notes, so you can explore those too dear listeners. But yeah, use the Create Block theme plugin to create your theme for the repository. You can then, I think there’s even some instructions on how to get it then into the repository, but that’s kind of with the SVN version control, it kind of is a different level of complexity, I would think. So having it rather than GitHub.

\n\n\n\n

We also had a… And that might be interesting for you too. We had a hallway hangout with the designer of the Twenty Twenty Five theme, and she also works on some of the automatic themes. They have a process that uses Playground, the Create Block plugin and GitHub, to push changes to a theme from the site editor to a pull request on GitHub. And that’s just amazing. That process really amazed me and how that’s even possible, but there are magicians behind it, but it works.

\n\n\n\n

Joni Halabi: That sounds amazing. When is that hallway hangout?

\n\n\n\n

Birgit Pauli-Haack: It was actually.

\n\n\n\n

Joni Halabi: Oh, was?

\n\n\n\n

Birgit Pauli-Haack: Yeah, yeah. I will share that in the show notes. And there’s a little video also with were Beatriz Fialho, who designed Twenty Twenty Four as well as Twenty Twenty Five, shows the process. It has one single little change, and then kind of from playground to GitHub, how that also works. Yeah, it’s really, really great to see.

\n\n\n\n

Joni Halabi: Oh, I will definitely be checking out that hangout. That sounds amazing. Yeah.

\n\n\n\n

Birgit Pauli-Haack: So yeah, block themes. Yeah, go.

\n\n\n\n

Joni Halabi: Yes.

\n\n\n\n

Birgit Pauli-Haack: So when I kept a close watch on the numbers throughout the last three years, and I always looked at some and also on the Gutenberg Times on the weekend edition, I sometimes said, “Okay, there are six new block themes. Who developed that?” So I looked at them. Some of them I really tried out. Carolina Nymark was one of the first theme developers. Who really embraced the process was Anders Noren from Norway. These a very successful theme developer, and he had a few quite interesting designs. But what I have noticed is that many, many block themes not only have some interesting style variations. And you can see them in the repository. You can see how the theme changes also has some of them have 30 patterns in there. It’s just amazing what creativity can do to the block themes now. So you don’t need to put one block at a time into your canvas. You can kind of take five patterns and your page is done. So it’s really good.

\n\n\n\n

Joni Halabi: Yeah. I keep using the word game changer, but I mean, it’s-

\n\n\n\n

Birgit Pauli-Haack: Yeah, it is.

\n\n\n\n

Joni Halabi: … facilitates so much creativity. I love everything about it.

\n\n\n\n

Birgit Pauli-Haack: Yeah. I see many, many themes that are actually focused on certain verticals. So there are restaurant themes, there are for certain shops, there are for digital pieces for recipes. It’s very focused on the use case. And those make the patterns as well as the imagery that comes with it and the look and feel so much more focused to get a person from zero to hero on their own website. It’s really a great phenomenon.

\n\n\n\n

Joni Halabi: Yeah, for sure.

\n\n\n\n

Birgit Pauli-Haack: You and I, we can talk more than 40 minutes about block themes.

\n\n\n\n

Joni Halabi: I think we could. But this is not just the block theme show, we promise.

\n\n\n\n

Birgit Pauli-Haack: So well, two more things. The Create Block Theme plugin is in a new version, 2.6 came out this week. And it fixes two bugs, important bugs, that fix the image URL localization when you make a child theme so that the images come over from the patterns into the child theme. And the URL is the right one. The other one was that if you had in your blocks, HTML, it would escape. So when you use that pattern, you had all the HTML code in there and not the rendering from the browser, and that was fixed as well. So that was kind of an interesting bug to fix.

\n\n\n\n

Joni Halabi: Yeah, those are always tricky, the encoding, encoding bugs. Yeah.

\n\n\n\n

Birgit Pauli-Haack: Yeah, though that’s the smallest release of this week. 

\n\n\n\n

WordPress 6.7

\n\n\n\n

We had a bigger release that was the WordPress 6.7 Release Candidate came out. And with it, also the field guide. So if you haven’t tested 6.7 yet, now is the time you only have three weeks to test it against whatever product you have, your themes, your plugins, your maintenance processes, or just the sites that you have. And with playground, you can actually do a staging site, but there’s also InstaWP to kind of have a staging site.

\n\n\n\n

And if you want to know the highlights from WordPress 6.7, there will be a YouTube live stream on November 5th at 18:00 UTC, and it’s with Jamie Marsland, Nick Diego and Rich Tabor kind of walk you through all the different things. We will talk a little bit later about them, the highlights that I see for 6.7 after we cover the Gutenberg 19.5 release.

\n\n\n\n

Joni Halabi: Sounds good. Yeah, I’m excited for 6.7. Like you said, it’s coming November… Looks like November 12th.

\n\n\n\n

Birgit Pauli-Haack: Yes.

\n\n\n\n

Joni Halabi: And I know especially for my previous team, it’s so important to start that testing now, especially if you have a lot of custom code on your sites. This is something that has burned our team in the past. Sometimes custom code is not backwards compatible with changes that are happening in core, like our own custom code that we write.

\n\n\n\n

Birgit Pauli-Haack: Right. It’s the future compatible.

\n\n\n\n

Joni Halabi: Yeah, we’ve needed to make a few changes, and it’s just important to get all that testing in.

\n\n\n\n

Birgit Pauli-Haack: Definitely the dev notes will help you. They’re in the field guide. And there are quite a few changes, not breaking changes, but additional feature in there for developers where APIs are expanded, like the block bindings API and the interactivity API, block books, some performance tweaks as well. So definitely look at the field guide. And the links will be in the show notes. And I also will link all the block editor relevant dev notes individually in the show notes. We have space on our show notes. Anyway, yeah, well, let’s go into the Gutenberg 19.5 plugin release.

\n\n\n\n

Joni Halabi: Yes.

\n\n\n\n

Gutenberg 19.5

\n\n\n\n

Birgit Pauli-Haack: So release-lead Hector Prieto wrote in his release post, “This release focuses on stabilizing existing features, but also brings some improvements to the general UI and the zooming, editing experience with 116 PRs from 47 contributors.”

\n\n\n\n

So yeah, let’s get going. General interface changes. One is the right design tool. Now you can persist your user preference through the preference option on the plugin, in the plugin editor. So that’s good.

\n\n\n\n

Joni Halabi: Yeah. That one I have been waiting for because I often switch between the visual editor and the code editor, and I don’t always remember that I do that. So if I go into a page and I switch into the code editor and then I have to edit another page, I expect to go into the visual editor. Sometimes I’m surprised when I am somehow in the code editor because I just forget that, “Oh yeah, right. The last page I was in, I was in the code editor.” But I always found it interesting that WordPress made the assumption that because I went into the code editor last, that is something I will continue to do. So I love that this is a setting now.

\n\n\n\n

Enhancements

\n\n\n\n

Birgit Pauli-Haack: Yeah. And I’m not quite sure it is actually the setting that you’re thinking about because the editor has now on top of the toolbar, there’s also a write and design tool. There was previously the select and edit tool where you can switch, especially for those who are traveling with a keyboard instead of the mouse, there was a difference between getting into a block to work in the block or to travel from one block to the next. So that was the select was the traveling from one block to the next. And then the writing part or the editing part was actually the block part where you can use the toolbar or you added content to a particular block.

\n\n\n\n

Joni Halabi: I think I interpreted the Git, the pull request wrong then. Interesting.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And there is also a change in how those two modes behave when you are in the zoom out mode.

\n\n\n\n

Joni Halabi: Wow. Yeah.

\n\n\n\n

Birgit Pauli-Haack: 6.7 brings us the zoom out mode, but not the editing of design switches to it, only for the pattern. So that is the next thing on our list, is that the zoom out mode in 6.7 is just with a toggle button. With a new Gutenberg release, if you have that, it will also automatically zoom out when you use the pattern tab in the inserter when you want to drag and drop a pattern over to your site and you need a little bit better of a bird’s eye view on your page instead of just having that one kind of block in front of you. It’s a much better way to add. So you can now kind of drag and drop patterns over and move them up and down without having to deal with all the blocks around it or in it.

\n\n\n\n

Joni Halabi: Yeah, yeah, no, there’s a great animation of this in the pull request that it’s nice to be able… Because when you’re talking about a pattern, you are talking about more than one block that can stand a good chunk of your page depending on the pattern. So it is nice to be able to see that in context, to see your entire page as it stands. Now if you’re trying to add another pattern and it just helps you think about, “Okay, well where can this new pattern go?” with respect to the entire page.

\n\n\n\n

Birgit Pauli-Haack: Exactly.

\n\n\n\n

Joni Halabi: That is definitely one of the important ones. There are a number of changes to that zoom out functionality in this release, but that when you select the pattern tab, but that’s definitely one of the biggies.

\n\n\n\n

The next, I guess, really two sets of changes have to do with the component storybook. So there are a couple of changes to note. One, adding type tokens to storybook. And the other one is just stubbing out documentation on existing colors in a theme. And I think these are so fundamental because storybook talks about design in terms of the components in the UI. And I guess it just surprised me that it wasn’t there before, but color and photography are so basic to any design for anything that it is. I think it’s a wonderful change that these both are being added into storybook now. You can see basically the colors that exist in the base styles now, and then having the type tokens, you can see all of the register of typography. So you can see semantic tokens, like what are your different heading levels, for example. What does body text look like? And these are just fundamental design elements that I’m glad they’re there now.

\n\n\n\n

Birgit Pauli-Haack: Yeah. You have been part of our live Q&A and design systems. Now the WordPress design team is actually building out their design system through that storybook because the admin design now needs also the funds. And not only just the data views, how they’re in the site editor, but when you go to the next level and have the admin move over to the new design, you need to have standardized colors and standardized funds and all that. And that’s where the storybook comes in to have a unified system and standard for all the contributors that are either back end or front end or plugin developers to kind of figure out. So none of the developers have to make all the design decisions. Again, it speeds up the plugin development or the core development quite a bit when there is a design system there, yeah.

\n\n\n\n

Joni Halabi: Yeah. That’s fabulous.

\n\n\n\n

Birgit Pauli-Haack: For the global styles, contributors improved the navigation logic for the revision screen. That had quite a change in a few of the plugin releases before and how do you get to the revisions of your styles. It’s a great change to see how you can see the revisions for your styles that are a little compressed and much easier to navigate in the animation. So it talks about the global styles are in the right-hand sidebar, and that’s also where you find the revisions of your changes. I’m so happy that we have those revisions because after playing around with a theme or with a site for, I don’t know, 30 minutes, I don’t know, I reversed some of my decisions because, “Oh, that looked nice 20 minutes ago, but now I don’t like it anymore.” So reversing that through the revisions panel is really cool. The team is working on, it’s really cool.

\n\n\n\n

Joni Halabi: Yeah, no, no, no. I love that they’re working on that because I feel like a lot of our content editors don’t realize that revisions exist and it is such a powerful tool. So to be able to make improvements to the UI and maybe make it a little more obvious about how to use revisions, I think, will help our editors a lot.

\n\n\n\n

Birgit Pauli-Haack: And it’s not only… Well, they still have to work on the content revisions for posts and pages.

\n\n\n\n

Joni Halabi: That’s it.

\n\n\n\n

Birgit Pauli-Haack: They still don’t know what to do with blocks, but yeah.

\n\n\n\n

Joni Halabi: I mean, that does help you then.

\n\n\n\n

Birgit Pauli-Haack: But that’s coming.

\n\n\n\n

Joni Halabi: Yeah. I mean, revisions, being able to work on the UI for revisions at any part of the styles or the… The styles, I feel like, is step one. So this is a great updates.

\n\n\n\n

Birgit Pauli-Haack: They’re already there, yeah.

\n\n\n\n

Joni Halabi: Yeah. So in black bindings, we’ve now added the ability to register binding sources in the widget screen. So block bindings, for anyone who’s not familiar with, it’s when the content of a block is tied to some sort of external data source. So you could have a paragraph that is tied to some RSS feed maybe or anything.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Or meta fields, a custom field.

\n\n\n\n

Joni Halabi: Right. Or meta field, yeah. So this particular change makes sure that a block, like a paragraph, inside a widget can also be bound to some sort of custom source, like a meta field.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And we haven’t heard about the widget screens for a long time, so I’m really happy that there are some people still thinking, “Okay, there’s another block editor that has been neglected for a bit.” But I think the unification efforts between post editor and site editor, they’re done now. And I think looking at the widget screen is one of the next steps. And having the binding sources there definitely helps because that’s what you want to put in additional information there.

\n\n\n\n

The cover block experience, they refactor of the settings panel. It streamlined all the different features for a cover block and has some pull out. Up until now in the plugin, you had all the settings for the cover block in one sidebar. From top to bottom, you had to scroll. But now there is a three-dot menu there where you can switch off some of the features so you don’t have to scroll to them all of the time. So it’s similar to the typography settings as well as the dimension settings. Now, it’s just adopted the same philosophy there that not all the features are shown at the first time or by default.

\n\n\n\n

Joni Halabi: Yeah, this is nice to see because the cover block has gotten complex for a reason. There’s a lot going on in terms of settings with the cover block, so it’s nice to see improvements there in that UI.

\n\n\n\n

Birgit Pauli-Haack: Yeah, absolutely. 

\n\n\n\n

Bug Fixes

\n\n\n\n

So that kind of covers all the enhancements that we had, but there are a few bug fixes we wanted to talk to you about. The code block now has a left-to-right direction for right-to-left languages. Can you explain that to me?

\n\n\n\n

Joni Halabi: Yes. So it’s tricky to read, right? So right-to-left languages, so think Hebrew, think Arabic. When you write, the paragraphs and the headings that you write go from your right hand to your left hand. But when you’re writing code, if you’re a native speaker, if you’re writing prose in a right-to-left language, but you’re writing code, your code is still left-to-right. So this is making sure that, let’s say that you have a page, let’s say that you’re blogging in Arabic and you’re blogging about this really cool feature that you just wrote and you write your paragraph and it’s in Arabic and it’s from right to left, but you want to feature a code snippet. This is to make sure that the code on your page is still displayed left-to-right, because that is still how we write code regardless of what spoken language we are writing or reading or speaking.

\n\n\n\n

Birgit Pauli-Haack: That makes so much more sense now. Thank you.

\n\n\n\n

Joni Halabi: It is. I mean, it’s a lot of letters in that headline, so I understand why.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And for someone who never knows where left and right is, it’s going to, “What?”

\n\n\n\n

Joni Halabi: I still have to do the hand trick where I make my index and my thumb form basically be at right angles of each other. And the one that makes the L is my left hand. And I still do this, so I understand.

\n\n\n\n

Birgit Pauli-Haack: Yeah, well that’s when my husband says, “The other left” when I go wrong.

\n\n\n\n

Joni Halabi: Yeah, it’s always fun.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And now… Go ahead.

\n\n\n\n

Joni Halabi: Yeah, no, so another fix is do not… I’m just going to read this title, don’t render image when the source attribute is empty, which feels very obvious. But this was a bug fix where if you had an image, an image tag, but an empty source, that image tag was still getting rendered. And there’s no point in rendering an image tag if there’s no source. So this fixes that bug.

\n\n\n\n

Birgit Pauli-Haack: It sounds like a rookie bug, but sometimes they just sneak in.

\n\n\n\n

Joni Halabi: Yep.

\n\n\n\n

Birgit Pauli-Haack: Yeah, I have done a lot of dumb things like that. And then one is PR is in terms of extensibility, it kind of renames the register block template from W_register_block_templatetoregister_block_template. So the WP prefix is kind of taken away because it seems to be obvious and it follows other register block kind of function. But if you have been testing things with the new register block template for the plugins, you might want to look at your code and kind of remove the prefix kind of thing. I think that was back ordered to 6.7, so it’s in the 6.7. But if you have done it up until beta 3, I think with WP you can remove it now.

\n\n\n\n

Joni Halabi: Yeah. And I think you have to, because if I’m reading that PR correctly, there is no backwards compatibility for the WP prefixed version of this function, which it didn’t seem like it was supposed to be in anyone’s code anyway like in a custom developer’s code. But please double check your code.

\n\n\n\n

Birgit Pauli-Haack: Yeah, well, it’s a new feature for 6.7.

\n\n\n\n

Joni Halabi: Oh, okay.

\n\n\n\n

Birgit Pauli-Haack: So it wasn’t backwards compatible, it just kind of wasn’t a kind of discussion now through co-op contributors. So this comes as a new function, “Can we make it uniform with the other register block kind of functions and remove the WP?” And so there is no backwards compatibility because it hasn’t been in the future, but it was in WordPress 6.7 alpha up until beta 2 or beta 3, and only for the release candidate, they take the WP out. So if somebody wrote a plugin template already to come out in 6.7, when 6.7 comes out, that’s the code to check again. Does it make sense?

\n\n\n\n

Joni Halabi: That does make sense. Thank you, yeah. I didn’t realize that was that new. That’s awesome.

\n\n\n\n

Birgit Pauli-Haack: Yeah, it’s part of the… So now plugins can register templates for the site editor. So when you have a plugin that does a business directory or something like that, you can now register a template that then a user can modify in the site editor, which was before not possible or was a really hacky way to get it into that. And then you can, as a plugin developer, also document that. So the theme developer can also modify that template or build pattern for the template or something, yeah.

\n\n\n\n

Joni Halabi: Nice.

\n\n\n\n

Documentation

\n\n\n\n

Birgit Pauli-Haack: Yeah, that’s nice. I like it. And I wanted to point out a couple documentation changes. There was in a previous version of the plugin and for 6.7 a method to curate the heading level through level options. And that is now documented in the block editor handbook. So you can say, “Okay, if your content editor uses the heading block, you don’t want a heading one, you don’t want a heading four or five and six. There are only two heading levels that they can use. And that’s heading two and heading three.” You can do it now and have also your patterns, follow that through a block attribute. And you can also use it for your custom blocks. It’s in the site title, post title. And for where you ever use headings, you can change that there as well. And it’s in from the toolbar, so it’s documented now.

\n\n\n\n

Joni Halabi: Excellent. Yes, and I love this feature and I love that it’s now documented just from an accessibility perspective because making sure that your heading levels are in order and makes sense is part of your site accessibility. So for example, having an H1 followed by an H4 doesn’t make much sense. You want these headings to go in order. So this feature helps us enforce that. And this new addition to the documentation helps people use the feature.

\n\n\n\n

Birgit Pauli-Haack: Yeah, absolutely. So on the second documentation was just to announce that the components packages now produce the readme file with the documentation through an auto generator. So they’re at least standardized. And developers can, through their code, also control the documentation, but it doesn’t have to be an afterthought anymore and it’s standardized. So that’s kind of the first step to have some standardized component readmes because there are hit-and-miss to be honest. And this is kind of a part to rectify downtown.

\n\n\n\n

Joni Halabi: Nice.

\n\n\n\n

Birgit Pauli-Haack: And that’s it, dear listeners. That’s Gutenberg’s 19.5 for you. 

\n\n\n\n

What’s in Active Development or Discussed – WordPress 6.7

\n\n\n\n

So I promise you we’re going to talk about WordPress 6.7 a bit. So there are a few high level things. There are tons of changes in there, smaller ones and big ones. Anne McCarthy publishes for the last 10 releases, I think, a Source of Truth, which is mostly for writers who want to write about the new release to get in-depth information, to also get assets that they can use in their writing. But that is now published on the Gutenberg Times. So I will link through the show notes to that. So you can also follow up on some of the details there.

\n\n\n\n

I like to point out, well, we all know Twenty Twenty Five is the new default theme, and I have had a lot of fun with it. It was really good. I prepared a talk for German WordCamp where I was almost using up all my time with the Twenty Twenty Five standard theme, which wasn’t particularly well organized, but that’s a different story. But my excitement kind of spilled over that I got on a tangent. And so I really, really like that it has about, I think, 50 patterns for all kind of different things because it wants to be a starter theme for a personal blogger or for a photo blogger or for a magazine style site and has templates for all of them, and also different ways for the different templates. So you can have a query loop template with different ways how the post comes in. I think there are about 10 or so different ways to organize that. Then there are services, price tables, testimonials, not only in one pattern, but maybe two or three patterns of that. So that’s really cool.

\n\n\n\n

And what the crown of it is, that there are also four different… So there were color variations for the full theme. And then there are style variations for the full theme that changes the look and feel, but it also has separate color variations. So you could just leave the style like it is, but only change the color combination. Or you can say, “Okay, I want it like it is, but I just want to change the font.” So there are font variations as well.

\n\n\n\n

And then there are section styles. So when you have a group pricing header or a pricing section or a group block with a call to action, you can actually use four or five different styles. So when you add them to your page, you actually can change the color of each of them, but still be in a full theme variation. But it makes it much livelier to scroll through a page that has several sections that also changed the colors, but it’s really well done and they have been all tested. So it’s a really good theme. Kudos to Carolina Nymark and Juan Aldazoro. Oh, I’m butchering his name. Sorry, hang on.

\n\n\n\n

Joni Halabi: I was just going to say while you’re looking that up, you talked quite a bit about the colors and a bit about the fonts, I love that these font variations include font combinations. So the font variation has these combinations of a header. They’re a set of a header and body fonts. And that is one of the most challenging things I have experienced trying to design a site, just trying to find a really good combination of a header font and text font. And this gives you eight different options that I can see that are really solid options. If you’re a bit shy about design and playing with typography, you can choose one of these eight and there are no bad choices here.

\n\n\n\n

Birgit Pauli-Haack: Yeah, yeah, no, the developers and designers that build out the theme, so the design comes from Beatriz Fialho, but Juan Aldazoro is his name, Juan Aldazoro and Carolina Nymark are the lead developers on the Twenty Twenty Five default theme, and they did a marvelous job also. But there are also about, I don’t know, 30 to 50 additional contributors that delivered patterns. So it’s actually a larger group of people who built this theme, and it’s really fabulous. So try it out and look at that.

\n\n\n\n

The query loop, so that was part of it that I tried out the new features for the query loop. It is now optimized and streamlined. So you have all kinds of filter settings. You can filter by author, date, or you can say, “Okay, I want to have a post loop just for a custom post type with custom fields.” And all of that is now possible for any template you can use. Or you can just use them on the post and say, “Okay, I want from the same category or the post from there, except this one.” So you can also include post and offset post. All the features are now available. Some of them were in the toolbar and now then the sidebar complete with all the new ones. That is a really great quality of life kind of change.

\n\n\n\n

Joni Halabi: Oh yeah, for sure.

\n\n\n\n

Birgit Pauli-Haack: We talked about the zoom out for the template handling. The page views and the site editor, that’s more the data views kind of how in the admin section how you can view the pages. There are some previews. There’s a list view where you have a three pane window. On the left-hand side, you have the block site editor navigation with the published kind of status. And then in the middle you have all the list, all the pages. And then when you click on them, the third pane is a preview of the page. So you don’t have to go back and forth when you just want to look at, “Okay, what’s in the page here? How does it look?” So you can also have it right there. So it’s a really improvement in navigating your pages.

\n\n\n\n

Yeah, I wish that was available for posts, but the developers are working on it. There’s an experiment. If you use 19.5 Gutenberg plugin and there’s an experiment menu item there and you enable the post data views, then you can see how that also works for posts. But it’s a little harder to make it for posts because there are so many customizations and things to look at. So right now it’s an experiment, but always welcome for feedback. Do you have any questions about things?

\n\n\n\n

Joni Halabi: No, no. I was just going to say, as somebody who’s now less on the development side of things and more on the content side of things, I appreciate something that will make editing easier and being able to see those changes easier. Because like you were saying, having to flip between different screens, it’s not ideal. So seeing improvements, even if it’s not on posts yet, it’s coming to posts, that is something I’m looking forward to.

\n\n\n\n

Birgit Pauli-Haack: Yeah, they’re also experimenting with a quick edit part. So yeah, in the current admin you have the quick edit section where you change categories and rename things.

\n\n\n\n

Joni Halabi: Yeah, love it.

\n\n\n\n

Birgit Pauli-Haack: So that also is coming to the data view section, so you can have that part as well if you missed it until now.

\n\n\n\n

A lot of designers are really excited about having background images not only for blocks like the cover block, but now you can also do it for group block. And you can have it site wide. So there is in the global styles, in the first list of typography and layout and styles, and there’s now one for background image. So you can have your clouds there or your tiles or whatever you need from your site. And sometimes I feel we could go back to GeoCities sites.

\n\n\n\n

Joni Halabi: I was just thinking GeoCities. And in my head I was wondering like, “Should I bring it up? This is still very retro ’90s.” Can I just make a shout-out? Please do not put in an animated background. It’ll make everybody who works in accessibility cry.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Yeah. I think it only… It doesn’t do animated GIFs.

\n\n\n\n

Joni Halabi: Oh, good.

\n\n\n\n

Birgit Pauli-Haack: I think it’s just Gs or JPEGs. Yeah, but you’re right. Yeah, that would be really cool. Hilarious, yeah. But I’m thinking that there are some designs that can be quite unique with that. I remember one of my first backgrounds was really bright red and bright blue, and then I had white fonts on it, and you couldn’t read what you were writing or what I was writing for it, so.

\n\n\n\n

Joni Halabi: Oh, yeah. I remember when we were talking about Web 2.0 in the late ’90s, and I was in an electronic arts curriculum at that point, and we were making web pages with hidden links. So you had to explore the page just by moving your mouse around to see if you happen to stumble upon a link. This will literally make everybody sad now. We know better, but this was experimentation in the late ’90s.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Unless it’s a game or something like that, but yeah.

\n\n\n\n

Joni Halabi: Yeah, yeah. Exactly.

\n\n\n\n

Birgit Pauli-Haack: Yeah. So yeah, apart from the developer API changes that are there, so these are kind of my highlights for WordPress 6.7. And there are improved blocks. Most blocks now have border support that we are missing for… Only six or seven blocks at border support. And now almost every block has a border support with 6.7. So again, I will share the Source of Truth post from the Gutenberg Times, and also a link to the November 5th highlight live stream on YouTube for those who want to hear and see things beyond a podcast, which is really hard to demo things, but yeah.

\n\n\n\n

Well, is there anything else that you want to talk about, about block themes, block editor, WordPress or your life?

\n\n\n\n

Joni Halabi: Oh, I could go on about so many of those things, but I think we’ve covered the basics. I think we’ve covered all the important things.

\n\n\n\n

Birgit Pauli-Haack: So let me ask you this. If you now do a lot of content, are you going to go back to some block writing or coding in your spare time, kind of rest your brain from the content editing and just do some coding?

\n\n\n\n

Joni Halabi: I might. My challenge is finding spare time. My life is very filled with just research and writing, and then also my child and raising a six-year-old, like I will have spare time in about 12 years.

\n\n\n\n

Birgit Pauli-Haack: Okay. We’ll talk about it. What is that? WordPress 15.6 or something like that?

\n\n\n\n

Joni Halabi: Oh, probably. Yeah.

\n\n\n\n

Birgit Pauli-Haack: Well, this was lovely. Thank you so much for taking the time to be on the show. And we will hear from you sooner than in 12 years.

\n\n\n\n

Joni Halabi: Yes, I certainly hope so.

\n\n\n\n

Birgit Pauli-Haack: … when you come back to show. Yeah. Well, it was great that we had you again and you walked with me through all the announcements and stuff there.

\n\n\n\n

I will share some links for Joni Halabi if you want to get in contact with her. I mentioned the Static versus Dynamic Blocks article on the developer blog. Joni also wrote a book, Sweet Little You, and that’s available. And then I’ll have the LinkedIn link as well as the WordPress profile link for you if you want to get in contact with Joni.

\n\n\n\n

As always, the show notes will be published on Gutenbergtimes.com/podcast. This is show 110. And if you have questions or suggestions or news you want us to include, send them to changelog@Gutenbergtimes.com. That’s changelog@Gutenbergtimes.com. And this is it. Thank you for listening. And if you want to comment on… What is it? It’s not Storify, it’s not Shopify, it’s Spotify.

\n\n\n\n

Joni Halabi: Spotify.

\n\n\n\n

Birgit Pauli-Haack: Spotify. When you listen on the Comcast there, send in a comment. If you listen on Apple, do a review. If you listen on Pocket Casts also, feel free to review our show so more people can join us for the next time. Thanks for listening and goodbye. 

\n\n\n\n

Goodbye, Joni. Thank you.

\n\n\n\n

Joni Halabi: Goodbye. Thank you so much.

\";s: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 Oct 2024 08:17:38 +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: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:106:\"Gutenberg Times: Over 1000 Block Themes, Gutenberg 19.5, Fieldguide WordPress 6.7 — Weekend edition #309\";s: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=30554\";s: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/over-1000-block-themes-gutenberg-19-5-fieldguide-wordpress-6-7-weekend-edition-309/\";s: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:18532:\"

Howdy,

\n\n\n\n

How are you today? It’s getting cold again in Munich. This year, I am hopefully better prepared for the Winter than last year.

\n\n\n\n

After a few days struggling to figure out the problem, Gutenberg Nightly is now available again via Playground or from the page Need a zip from Gutenberg trunk branch? Huge Thank You to Jon Surrell for fixing the repo and the build process.

\n\n\n\n

I hope you’ll have a restful weekend.

\n\n\n\n

Yours, 💕
Birgit

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

Developing Gutenberg and WordPress

\n\n\n\n

ICYMI Here are the block editor related Dev Notes from the WordPress 6.7 RC1 release and the Fieldguide for WordPress 6.7

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

Seizing the moment, David McCan published a tutorial on How to Use the WordPress Beta Tester Plugin. It’s a great tool that allows you to test pre-release edition of the next WordPress version. “There are a lot of reasons why people want to test a pre-release. Maybe you’re a theme or a plugin developer, and you want to make sure that your theme or plugin is going to work with the next version of WordPress. Or maybe you’ve got some critical sites, and you want to make sure there aren’t going to be any surprises with the next version of WordPress. Or maybe you’re curious about the upcoming changes and features that will be in the next version.” he wrote.

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

Save the date! November 5th, 2024 at 17:00 UTC with a live stream on WordPress 6.7 Highlights a Q & A with Jamie Marsland, Rich Tabor and Nick Diego

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

Gutenberg 19.5 was released and Hector Prieto wrote in his release post What’s new in Gutenberg 19.5? (23 October), that the release mostly focused on stabilizing existing features but also brings some improvements to the general UI and the zooming editing experience.

\n\n\n\n

He highlighted:

\n\n\n\n
    \n
  1. Smoother Zoom in/out experience
  2. \n\n\n\n
  3. Other notable changes
  4. \n
\n\n\n\n\"\"\n\n\n\n

It was a great pleasure to have Joni Halabi, Georgetown University, on the show again and to geek out over the block editor. We discussed, Gutenberg 19.5, Create Block theme plugin and marvel at the fact there are now 1000 Block Themes available in the WordPress repo. The episode 110 arrive at your favorite podcast app over the weekend. If you listen to the podcast on Spotify, you can now leave a comment from your phone. I would love to get connected with more listeners.

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

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

\n\n\n\n

Elliot Richmond demos a Mobile Fix for Complex Layouts in the WordPress Block Editor (No Theme Files Needed), You’ll learn how to write custom CSS using the browser inspector and style editor, then paste it into the block editor for a no-code-friendly mobile solution.

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

Md Noruzzaman just added the Geomap Block to the plugin repository that allows you to add a basic Google map to your post or pages without handline API keys.

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

Wes Theron recorded a new video for Learn.WordPress on how to create a portfolio site with a block theme and patterns using a up-and-coming Twenty Twenty-Five WordPress default theme which has an extensive pattern library. This will show you how to leverage these patterns to save time and build your site from a solid foundation.

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

Over at the CSS Tricks, Geoff Graham shared Justin Tadlock’s article on the Developer blog, and ruminated in Mastering theme.json: You might not need CSS about writing CSS in style sheets vs. CSS in JS and WordPress way. “Regardless of all that, I’m linking this up because Justin does bang-up work (no surprise, really) explaining and illustrating the ways of CSS-in-WordPress.” Graham wrote.

\n\n\n\n

1,000 Block Themes in the WordPress theme directory!

\n\n\n\n

Theme team rep, Ganga Kafle, invites you to Celebrate 1,000 Block Themes in the themes repository!

\n\n\n\n

Anne McCarthy also published on WordPress News: WordPress Community Creates 1,000 Block Themes in 1,000 Days

\n\n\n\n

Jyolsna J E also covered this major milestone for the WPTavern: WordPress Themes Repository Now Houses 1000 Block Themes

\n\n\n\n\"1,000\n\n\n\n

 “Keeping up with Gutenberg – Index 2024” 
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

\n\n\n\n

Building Blocks and Tools for the Block editor.

\n\n\n\n

Have you ever run into a situation where you needed to unregister a block pattern in your theme? Justin Tadlock has the right snippet for you. Snippet: Conditionally unregister patterns. This post also starts a new section on the Developer Blog of short code snippets that any developer could use for a specific use case. For now, we still need to get some kinks out of theme and editorial process, but soon we start publishing more code snippets in CSS, PHP, JavaScript, or JSON

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

In his latest video tutorial, Add custom CSS and JavaScript to any WordPress block, Brian Coords, walks you through the process of modifying any block.json with simple PHP to load your own custom CSS and JavaScript. The post also holds the full transcript of the video for those of us who want to read along.

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

In this week’s live stream, Ryan Welcher showed how to turbocharge Your WordPress with Custom Blocks in WordPress 6.7, disseminating the information from the Dev Note New block type registration APIs to improve performance in WordPress 6.7

\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

\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, 26 Oct 2024 02:21: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:\"\";}}}}}i:37;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:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"HeroPress: Building For Their Future\";s: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:29:\"https://heropress.com/?p=7578\";s: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:117:\"https://heropress.com/building-for-their-future/#utm_source=rss&utm_medium=rss&utm_campaign=building-for-their-future\";s: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:2423:\"\"Child

HeroPress was inspired by a photo.

\n\n\n\n

Dave (who bootstrapped the project) gave me one mandate: “I’m very open to whatever you make, but whatever it is, in some way I want it to help this child”. And he sent the following photo.

\n\n\n\n\"Child\n\n\n\n

Now that’s a stock photo, you can find it all over the web. We’ll never know who that specific kid is, but the point was that there are millions of kids like that in India, and Dave wanted to give a boost to as many of them as we could. Ever since then, HeroPress has been deeply tied to India.

\n\n\n\n

Recently I was telling this story to Nathan Wrigley on the WPBuilds Podcast. I was talking about my concern for the WordPress community in these days of difficulty. Many many Indians have gotten their start in computing in their early teens, on their own computer, or a borrowed one, or even on just a phone.

\n\n\n\n

While we were talking I realized, if this kid were about 3-5 years old when the photo was taken, approximately 10 years ago when HeroPress started, it’s entirely possible he’s 13-15 years old now, and could very well be learning about WordPress. And it’s entirely possible HeroPress has helped him.

\n\n\n\n

We’ll never know of course, but can say for a certainty that HeroPress has helped people LIKE him.

\n\n\n\n

Mission accomplished Dave.

\n\n\n\n

If you’d like to help HeroPress continue to help people of all ages, everywhere in the world, leave a donation.

\n

The post Building For Their Future appeared first on HeroPress.

\";s: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 Oct 2024 16:39: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:\"\";}}}}}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:66:\"Do The Woo Community: Do the Woo Friday Shares, Starting Today, v1\";s: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=86303\";s: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:65:\"https://dothewoo.io/blog/do-the-woo-friday-shares-starting-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:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:204:\"Friday shares recap weekly highlights and content from Do the Woo community, featuring diverse resources, news, and events aimed at enhancing engagement and contributions within WordPress and WooCommerce.\";s: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 Oct 2024 09:23: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:5:\"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:\"\";}}}}}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:53:\"Do The Woo Community: Around the Corner, WooSesh 2024\";s: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=86292\";s: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/around-the-corner-woosesh-2024/\";s: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:149:\"BobWP reminds the community to register for the free WooSesh 2024 event on October 29-30, featuring valuable sessions, live chats, and Seshie voting.\";s: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, 24 Oct 2024 12:56:48 +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:5:\"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:\"\";}}}}}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:66:\"WPTavern: WordPress Themes Repository Now Houses 1000 Block Themes\";s: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:30:\"https://wptavern.com/?p=176325\";s: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:77:\"https://wptavern.com/wordpress-themes-repository-now-houses-1000-block-themes\";s: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:3604:\"

The WordPress Themes Repository has hit an exciting milestone of 1,000 block themes. As of today, the repository has over 12,000 free themes. 

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

Block themes were introduced in WordPress 5.9 allowing users to create and customize all aspects of their site using the block editor. This ushered in a new era of site design, and in July 2022, the Themes Repository celebrated reaching the 100-block-theme mark. It hit the 200 mark in December 2022.

\n\n\n\n

The journey of block themes was not without challenges leading to the community discussing why more theme authors were not embracing block themes. To give block themes greater visibility, a “Block Themes” menu item was added to the filter menu on the directory homepage, helping developers and site owners discover these innovative designs more easily.

\n\n\n\n

Ganga Kafle, a representative of the WordPress.org Themes Team, has shared more details about block themes and contributors. The very first block theme to go live was Armando, a theme crafted by Carolina Nymark. Today, Automattic leads the contributions to the block themes category with 116 themes, followed by Creta Themes with 41 themes. 

\n\n\n\n\"\"Top 10 WordPress Theme Contributors\n\n\n\n

Ganga Kafle also shared the team’s vision, “The themes team would like to see more block themes. We expect an influx of innovative designs and functionalities. Whether you’re a developer, designer, or site owner, the potential of block themes offers exciting opportunities for creativity and customization.”

\n\n\n\n

Remkus de Vries tweeted, “It started out real slow, but it seems we’ve finally got some momentum for the Block Themes. Let’s see how long it takes for the next 1000!” while Jeff Chandler tweeted, “Back in 2021, Matt’s request was for 5,000 block themes, not 1,000 lol. Still a bit shy of that number :D.”

\n\n\n\n

Automattic Product Wrangler Anne McCarthy also published WordPress Community Creates 1,000 Block Themes in 1,000 Days to mark the occassion.

\n\n\n\n

For developers interested in getting started with block themes, Carolina Nymark’s guide to creating WordPress block themes is an excellent resource. They can also explore the WordPress Theme Developer Handbook and Learn WordPress for more information and join the WordPress Community Themes repository.

\";s: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, 23 Oct 2024 19:24:43 +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:7:\"Jyolsna\";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:71:\"Gravatar: Upgrade Author Profiles with the Gravatar Block for WordPress\";s: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=2326\";s: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:99:\"https://blog.gravatar.com/2024/10/23/upgrade-author-profiles-with-the-gravatar-block-for-wordpress/\";s: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:2765:\"

Say goodbye to generic author boxes. The Gravatar Enhanced plugin for WordPress just got a major upgrade with a fully customizable Profile block. Now you can showcase your authors in style – and give your SEO a boost while you’re at it.

\n\n\n\n

Complete Control Over Your Author Profiles

\n\n\n\n

The new Gravatar Profile block puts you in the driver’s seat. Customize:

\n\n\n\n
    \n
  • Width and layout to match your site design
  • \n\n\n\n
  • Background and text colors for perfect branding
  • \n\n\n\n
  • Border styles for that extra pop
  • \n\n\n\n
  • Which profile elements to display (or hide)
  • \n
\n\n\n\n

Best part? Your authors can update their profiles directly through Gravatar.com – no WordPress access needed. Perfect for multi-author blogs and company websites.

\n\n\n\n

Boost Your SEO with Enhanced Author Signals

\n\n\n\n

Google loves knowing who’s behind your content. The new Profile block helps establish E-E-A-T signals (Experience, Expertise, Authoritativeness, and Trustworthiness) by:

\n\n\n\n
    \n
  • Linking to author profiles
  • \n\n\n\n
  • Displaying verified social accounts
  • \n\n\n\n
  • Showcasing author credentials and expertise
  • \n
\n\n\n\n

These reputation signals can help search engines better understand and rank your content.

\n\n\n\n

Quick Setup Guide

\n\n\n\n\"Screenshot\n\n\n\n
    \n
  1. Install the Gravatar Enhanced plugin
  2. \n\n\n\n
  3. Add the Gravatar Profile block to your single post templates
  4. \n\n\n\n
  5. Customize the look and feel
  6. \n\n\n\n
  7. Watch as author profiles automatically update across your site
  8. \n
\n\n\n\n

Why Switch to the New Profile Block?

\n\n\n\n
    \n
  • Better than the default: More features, more control, more professional
  • \n\n\n\n
  • Time-saving: Authors manage their own profiles
  • \n\n\n\n
  • SEO-friendly: Built-in support for Google’s E-E-A-T signals
  • \n\n\n\n
  • Always current: Gravatar profile updates reflect everywhere instantly
  • \n
\n\n\n\n

Ready to upgrade your author profiles? Get the Gravatar Enhanced plugin today and start customizing!

\n\n\n\n

Pro tip: This block can be used on any page or post, too!

\";s: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, 23 Oct 2024 17:50: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: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:80:\"WordPress.org blog: WordPress Community Creates 1,000 Block Themes in 1,000 Days\";s: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=18029\";s: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://wordpress.org/news/2024/10/wordpress-community-creates-1000-block-themes-in-1000-days/\";s: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:3329:\"\"Layout\n\n\n\n

In nearly 1,000 days, the WordPress community has created 1,000 Block themes—coming together to use the full potential of the Site Editor and unleash new creative possibilities for everyone.

\n\n\n\n

First introduced in WordPress 5.9, Block themes have steadily evolved, improving flexibility and functionality for themers, users, and agencies alike. Now, design tools allow customizing almost every detail. With style variations, users can change the overall look of their site in a few clicks. You can even use curation options to customize the editing process itself. But we’re not done! We can’t wait to keep pushing Block themes even further. Thank you to every early adopter who, by embracing early features with passion, helped shape the Block themes we love today with feedback and testing.

\n\n\n\n

If you haven’t yet explored Block themes, check out some of the resources below to get inspired:

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

Let’s celebrate and share our contributions! Please comment on the Theme Team’s post dedicated to highlighting this milestone to share your favorite Block theme and thank those who have contributed along the way. 

\n\n\n\n

Thank you to @kristastevens for editorial help, @beafialho for the featured image, and @kafleg for reviewing.

\";s: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, 23 Oct 2024 17:01: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:\"annezazu\";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:107:\"WPTavern: #142 – Miriam Schwab and Oliver Sild on Security Collaboration Between Elementor and Patchstack\";s: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=176318\";s: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:121:\"https://wptavern.com/podcast/142-miriam-schwab-and-oliver-sild-on-security-collaboration-between-elementor-and-patchstack\";s: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:50099:\"Transcript
\n

[00:00:00] 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, the recent security collaboration between Elementor, and Patchstack.

\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 Miriam Schwab and Oliver Sild.

\n\n\n\n

Miriam co-founded Strattic, a platform with an aim to revolutionize WordPress security and performance on the web. After Elementor aquired Strattic, Miriam continued leading the unit before becoming a head of WordPress relations.

\n\n\n\n

Prior to that, Miriam founded and managed a prominent WordPress development agency in Israel. With over 15 years of experience, she’s a respected member of the WordPress community and a frequent speaker at WordPress events.

\n\n\n\n

Oliver is the CEO and co-founder of Patchstack, a company dedicated to the mitigation of security vulnerabilities in WordPress and open source environments. Patchstack is now a seven year old enterprise, and they specialize in penetration testing, security process management, and protective services for developers, agencies, and major hosting companies.

\n\n\n\n

[00:02:07] Nathan Wrigley: Oliver’s background also includes experience running an agency, and his work at Patchstack focuses on collaborating with plugin developers and hosting providers to ensure robust security measures for their clientele.

\n\n\n\n

Miriam and Oliver joined me at WordCamp US 2024 in Portland, where they did a presentation discussing the processes needed to enhance open source plugin security, and the advantages of leveraging bug bounty partnerships.

\n\n\n\n

Their collaboration brings to light the importance of integrating security solutions within the WordPress ecosystem, especially for companies with a footprint as large as that of We talk about the global operations of

\n\n\n\n

Oliver’s team at Patchstack, who work across all time zones, providing round the clock threat intelligence and vulnerability monitoring.

\n\n\n\n

We also explore the Patchstack system as a whole and how it categorizes WordPress vulnerabilities based on their exploitation likelihood, and their implementation of virtual patches to protect against high and medium priority vulnerabilities automatically, without code changes.

\n\n\n\n

We also get into how Miriam’s team at Elementor collaborates with Patchstack to ensure rapid and professional handling of vulnerabilities, enhancing security for their 17 million installations.

\n\n\n\n

The partnership between Elementor and Patchstack is a great example of how different companies within the WordPress community are able to work together to provide better outcomes for their users.

\n\n\n\n

If you’re curious about the intersection of page builders and security in WordPress, or the value of collaborative partnerships in maintaining the ecosystem, 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 Miriam Schwab and Oliver Sild

\n\n\n\n

I am joined on the podcast today by Miriam Schwab and Oliver Sild. Hello.

\n\n\n\n

[00:04:14] Miriam Schwab: Hi.

\n\n\n\n

[00:04:15] Oliver Sild: Hello.

\n\n\n\n

[00:04:16] Nathan Wrigley: We’re in Portland. We’re at WordCamp US. It is 2024, and Miriam and Oliver have done a presentation, which I think happened yesterday. How did it go?

\n\n\n\n

[00:04:26] Miriam Schwab: I think quite well. I’ve been getting good feedback. What about you?

\n\n\n\n

[00:04:28] Oliver Sild: Yeah, I think it was great. I think, after the talk, we had a lot of people coming to us, and to ask about how they can, you know, replicate that on their plugins as well and it was very good.

\n\n\n\n

[00:04:37] Miriam Schwab: I actually ran into someone who was like, that was the best talk I’ve heard since the start of the conference, just by the way.

\n\n\n\n

[00:04:41] Nathan Wrigley: The title of that presentation was Enhancing Open Source Plugin Security, Establishing Robust Processes and Leveraging Bug Bounty Partnerships. And the podcast today is going to be about a partnership between, well, in Miriam’s case, Elementor, because that’s where Miriam’s working, and in Oliver’s case, Patchstack, because that’s where he’s working.

\n\n\n\n

Before we get into the nuts and the bolts of it though, can we start with Miriam? Can you just give us your little potted bio, like less than a minute, something like that?

\n\n\n\n

[00:05:06] Miriam Schwab: So, hi, I’m Miriam Schwab. I’m head of WordPress relations at Elementor. I act as a type of liaison between Elementor and the broader WordPress community. I joined Elementor about two years ago when they acquired the startup that I co-founded called Strattic, which was static hosting for WordPress. And that’s where my biggest activity around security started to happen. I basically created Strattic to solve security issues around WordPress. That was my biggest motivating factor for founding it. And then after joining Elementor I became quite involved in our security around our plugin specifically, and the processes behind it, and how we communicate with the community at large. And so that’s kind of how this all happened.

\n\n\n\n

Okay, great. Thank you, Miriam. And if you want to hear more from Miriam, I did a podcast episode with her from WordCamp Asia earlier this year. So you can check that out as well. I’ll put a link in the show notes. And, Oliver?

\n\n\n\n

[00:05:57] Oliver Sild: Yeah. I’m Oliver, I’m the CEO and co-founder of Patchstack. Actually, this month we turned seven years old, so already quite a long time. What we do is, we have just one very clear mission, it’s providing the fastest mitigation to security vulnerabilities in WordPress, and in open source. So we work with plugin developers, we do pen testing for them, manage their security processes. We also provide protection for developers and agencies for websites, to protect them from the vulnerabilities. And we work with probably most of the biggest hosting companies, in terms of helping them identify vulnerabilities in their customer’s websites, and also protect them from that.

\n\n\n\n

Yeah, I mean, from my own background, I used to also run an agency, which I think literally everyone has done at one point of the time. I had like a very strong security focus early on, so I did like malware research, and then met my co-founder who did vulnerability research. Fun fact, we met in Reddit. That’s how we actually met. But yeah, also do a lot of community stuff, so organising capture the flag events in Estonia.

\n\n\n\n

Right now, in WordCamp US, we also host a WordPress CTF, so everyone can go and join that. I don’t know when it’s going live, probably it’s over then. There’s a lot going on, and being very active in NGOs. I have co-founded a co-working space in Estonia, which is now a startup center and stuff. So a lot of community, open source and security stuff.

\n\n\n\n

[00:07:14] Nathan Wrigley: Thank you, Oliver, that’s great.

\n\n\n\n

So over the last few years, WordPress has been sort of replete with acquisitions, and then it felt like that dropped off the news and partnerships came along. And that became a big thing, and obviously Elementor, Patchstack partnering up. It seems like a curious thing to be partnering on. One is a page builder, that’s pretty clear, one is security. How did this come about, and what possible benefit is there with a security company partnering with a page builder company?

\n\n\n\n

[00:07:39] Miriam Schwab: So I’ll just start by explaining a bit about my approach to my position at Elementor, which is that, I want to find the ways that we can work together with other companies in the space, even ones that seemingly compete with us. Because there’s generally a place for us to collaborate, we have shared and common users. When we work together, things go better for everyone. I just really feel like there’s a power in two organisations, or companies coming together to achieve goals together. So I do actually quite a lot of that in general.

\n\n\n\n

With Patchstack it’s actually a really straightforward win-win here, I think, and definitely a win for Elementor. So Elementor, the plugin, the core and the free have an active install base of over 17 million websites, right? Which is a mind-boggling number. And that means that everything that Elementor does, we have to do quite carefully, right? Because it can impact the users very positively, and then something goes wrong that’s quite a negative experience.

\n\n\n\n

And that includes security. We need to make sure that the plugin is as secure as possible for this very broad user base. And we have a lot of very robust internal processes around ensuring that the code is secure before it’s deployed and released. But anyone who works in software will know that, no matter what you do, you can do everything and be superhuman, things still might end up having a vulnerability that needs to be dealt with after deployment. It’s just the nature of the game.

\n\n\n\n

So were working with a bug bounty program called Bugcrowd to bring another very significant layer of security to our plugin post-deployment. I was fortunate to meet Oliver, I think it’s like almost two years ago, at least a year and a half ago or something. I had been looking at what Patchstack was doing, I was very impressed. Their specific focus on WordPress plugins, and open source, and also the clear passion that they have for open source, and making open source ecosystems more secure. That really, I think resonated with me and with Elementor.

\n\n\n\n

And so we started to explore whether Patchstack could be a good solution for us to add another layer of security to our plugin, with that angle of expertise in WordPress. And so, you know, we start to explore that and work together, and it’s been successful from day one. And brings a lot of value, not just to Elementor, by bringing their like additional expertise to the table. But also obviously to our end users who can be confident that there’s a very thorough, and professional, and responsible process behind bug disclosure, and how we handle it, and release patches very, very quickly. Our turnaround time is quite fast.

\n\n\n\n

[00:09:58] Nathan Wrigley: So can I just unpack that for the audience who in many cases won’t be particularly technical. So, does the workflow go a bit like this? Elementor creates a new feature, creates an update, has something that they need to push out to the plugin, and that is then created on your side. But then somehow it gets pushed over to Patchstack, and then Patchstack inspect it, check it, make sure that it passes all the tests that maybe they’re using, and then passes it back to you and says, go, no go. Is it basically something like that?

\n\n\n\n

[00:10:25] Miriam Schwab: It’s something like that. I’ll explain a bit, and then I’ll let Oliver like expand on that. Basically, Patchstack receives a report from one of their security researchers that there’s an issue with Elementor. Patchstack gets more than one report, okay, in general, but the additional value that they bring to us is that they review the reports to make sure that what we’re seeing, and then dealing with, are quality reports.

\n\n\n\n

There’s a lot of researchers that just, they’re just looking to report stuff. So they’ll repeatedly report like ridiculous things that aren’t really a problem for anyone, just wasting everyone’s time. So we get high quality reports from Patchstack. We replicate it, you know, we determine the plan of action, and the team creates a patch for it, test it on our end as thoroughly as we can.

\n\n\n\n

Pretty early on within our work with Patchstack, we added a stage, I asked if they could do it, I think it was something like that, and they’re like, yeah, of course. And it’s possible they already did it, but we hadn’t experienced that before, that we then send it to them for review to make sure that it fully resolves the issue. That’s very value add because it’s additional pairs of eyes on it. And once they’ve confirmed, then that actually goes out to release to our users, and all that. But I’ll let Oliver just explain more about that.

\n\n\n\n

[00:11:26] Nathan Wrigley: Yeah. So just to confirm, that is one of the things that’s happening. Once you’ve packaged it up, it gets handed over to Patchstack. Patchstack inspect it, like I said, go, no go, something along those lines. Okay, over to Oliver for the technical details.

\n\n\n\n

[00:11:37] Oliver Sild: So it’s important to understand that our logic is that, the only way how we can provide the fastest mitigation for security vulnerabilities in the WordPress ecosystem is when we cover the entire life cycle of a security vulnerability.

\n\n\n\n

That starts from the point of someone finding it, reporting it to a vendor, patching it, to users getting notified about it, and users getting mitigated, and to the point where they eventually, you know, fix it, right?

\n\n\n\n

Which includes three different key stakeholders, right? So it’s plugin developers, website builders, or like website owners who build websites, and hosting companies who also have like a huge responsibility because they are like hosting that code and everything, right?

\n\n\n\n

So the reason why probably we are one of those only ones that are going to validate the patches is because we need to do it anyways. That’s the very simple answer.

\n\n\n\n

Because ultimately we have responsibility in front of our customers who are using Patchstack to protect their websites. And if we don’t validate the patches that we see, like plugins releasing fixes, then how do we actually know that it’s patched? Because there’s so many cases where vulnerabilities are getting patched by the vendors, but then you look into it and they patch the wrong thing, or they just kind of like messed something up. So for the hackers, it’s very easy to bypass it, and things like that.

\n\n\n\n

So before we tell our customers that, hey, now you don’t have a security vulnerability anymore, we must make sure that it’s the actual case, right? So that’s really where this comes from because yeah, as I said, we cover the entire life cycle. So our customers, developers and agencies who use Patchstack to get their websites, you know, we call it virtual patching, which is like auto mitigation of vulnerabilities in real time.

\n\n\n\n

So to get everything mitigated as soon as possible, and then plugins to fix all the vulnerabilities as soon as possible. And then hosting companies to be able to send out notifications. Everything, we need to basically combine all this into a single process. So internally we could say that we are actually doing one thing, but it just kind of like spans out in three different locations.

\n\n\n\n

[00:13:35] Nathan Wrigley: Where do you get your data from? Where do the data points about what’s going on in the world, for Patchstack, how does that come into you? Have you got like a, I don’t know, like a red team or something like that, or is it just your paid employees that are constantly going out looking? I genuinely have no idea how that information comes in into your inbox if you like, for want of a better word.

\n\n\n\n

[00:13:53] Oliver Sild: So there’s three sources really. We have internal security researchers that do a lot of pen testing, they do a lot of research in general.

\n\n\n\n

Then what we started doing, four years ago already, was we created the first kind of like open bug bounty program for WordPress. So if you, Nathan find the security vulnerability in someone else’s like Miriam’s plugin, then we pay you if you report it.

\n\n\n\n

So we started like incentivising security researchers to start looking for vulnerabilities in the WordPress eco system, because there was so many of them to find. And if you don’t give incentives for hackers to report them properly, then they are going to do something else with it. So that was something that we started doing, yeah, about four years ago already.

\n\n\n\n

And we have like 1,600 people in the community, of like ethical hackers all around the world. We have like a leaderboard system, and they get rewarded. Just two weeks ago, one of the researchers got like 16.4k for a single vulnerability, which we paid out from our own money.

\n\n\n\n

But we do all of that because we want to protect our customers, right? And also it helps to protect the plugins as well, because it gets the plugins, you know, fix the vulnerabilities before, potentially hackers have had time to kind of like do that.

\n\n\n\n

But there’s this third one then, which is the MVDP. So we act as a security point of contact for a lot of plugins. So Elementor is one example, but we have 400 other plugins that actually pass every single vulnerability to Patchstack. So we help them validate those issues. We help them to verify that the patches are complete and everything like that. And that’s also how we basically become like the best security solution for their users, because we are able to protect them very, very fast.

\n\n\n\n

[00:15:28] Nathan Wrigley: So we could be having the same conversation with Miriam with 400 other companies. There are 400 companies with the same kind of relationship. I’m guessing not many of them with 17 million installs. But actually that’s a serious point though. The fact that you’ve got 17 million installs kind of makes this more important than almost any other plugin out there in all honesty. Because if something goes wrong, it’s going to completely break. You know, it’s not like a minor function of your website, it probably is the entire website, the front facing website.

\n\n\n\n

And so I guess you have a pretty big target on your back. You know, if somebody can leverage, or figure out a vulnerability in Elementor, that’s going to be worth more than, I don’t know, plugin X over there that has 24 installs on the repo, or something like that. So the security posture from your side has to be really, really serious.

\n\n\n\n

And so, is it like a bi-directional relationship? Like, if you discover something, and I’m pointing at Oliver. If Patchstack discover something, you can then send it directly to Elementor, and forewarn them about that problem. They can fix their code. But it works in the other direction as well. You don’t know you’ve got a vulnerability, so you pass it to Patchstack, they figured that you have, and it comes back. So it’s this nice circle of virtue where you’re both helping each other out.

\n\n\n\n

[00:16:37] Miriam Schwab: There’s a few different directions that this security relationship works with Patchstack. So one is that they have their community of security researchers, that’s what they’re called, who are basically constantly trying to break into everyone’s stuff. That’s more or less what they’re doing.

\n\n\n\n

Now that could be like, oh no, why are they doing that? That sounds so terrible. But like, they’re not the only ones doing it, right? They’re doing it in order to then report it, so that it can be fixed.

\n\n\n\n

There’s other people who are just like them out there who are doing the same thing for malicious purposes, and don’t necessarily plan on reporting it, but plan on exploiting it.

\n\n\n\n

So we want these security researchers doing what they’re doing, and then reporting it to Patchstack, and Patchstack reports it to us. And then we start this cycle of mitigating it, and releasing a patch that fully resolves it.

\n\n\n\n

Because we’re so big, and we have such a huge code base, so definitely we’re like a target of interest because let’s say the ROI for a hacker, or a vulnerability is high for Elementor, so that’s why we take it seriously in terms of this full circle type of approach to the security before deployments and after deployment, which I described.

\n\n\n\n

But another way that we work with Patchstack is when we get reports that aren’t from Patchstack, because that also happens. But we find a lot of value in making sure that Patchstack is in the loop even on those reports. Theoretically, we could get a report from someone else, and I’ll explain how briefly, but we could get a report from someone else, and then we could just do our own thing. But we want to be as responsible and as transparent as possible around vulnerabilities that exist in Elementor.

\n\n\n\n

From our perspective, security’s not something to be embarrassed about because we know we’re doing everything we can. It’s something to just accept that it’s going to be a thing, but the question is not if, but how? So our how, is to be very, very responsible about it and transparent.

\n\n\n\n

So when we get these reports, we loop Patchstack in, and we tell them that we’ve got this report so that they can be part of the process, and make sure that the loop is closed in the most secure way possible, including that they look at these reports as well, and our patches as well, to make sure that we’re fully resolving it.

\n\n\n\n

[00:18:33] Nathan Wrigley: So you’re sort of patting each other’s backs in a way. You know, something that you get gets passed to them, that’s kind of nice free intel for them. It came to you first, but it ends up at Patchstack, so they can then act on that, and send it out to your other 400 customers if it might affect them. That’s nice.

\n\n\n\n

[00:18:47] Miriam Schwab: I think it helps Patchstack. I can’t speak for Patchstack, but I think it helps for Patchstack to have the full, the full vision of what’s going on with every, let’s say, all plugins that are in their MVD program, which means, by the way, MVDP is managed vulnerability disclosure program. Yes, that’s important because not everyone will know what that is.

\n\n\n\n

To have the full visibility into what’s going on, so when we share that information with Patchstack, it helps Patchstack have more information for everyone, and also for us, Elementor going forward. So there’s like more context for everyone. And then that comes back to this approach of transparency as well.

\n\n\n\n

Again, Oliver can speak to this, probably working with a plugin of our scale, while there’s a lot more at stake here, it brings a lot of learnings into Patchstack because there’s not that many plugins that are at the scale. I think there’s maybe five that are over 10 million active installs in the plugin repository. They recently updated the numbers so that it will show that, at least there’s that. And it’s a whole other ball game when you’re at that scale of size, reach, code base, age, right? Elementor is eight years old, so all that, but Oliver can talk to that.

\n\n\n\n

[00:19:42] Oliver Sild: So one of the things is that, if we look at the data from the past years. In 2023, if we look at all the security vulnerabilities being known, or made public in the WordPress ecosystem, over 76% originated from Patchstack. The number and the volume is incredibly high. And even if we talk about historic data, like all the WordPress historically, Patchstack has processed the highest amount of security vulnerabilities that are biggest amount of them, or even majority I would say.

\n\n\n\n

So that also gives us like some level of experience in terms of how much we’ve had to already work with security researchers. We understand how they like to report things, what are the issues with the reportings, and things like that, but also like how to build processes internally, so you would be able to even like, cope with that kind of a load, right?

\n\n\n\n

So I think there’s this kind of experience we’ve had there, which has allowed us to actually build a solution that works for Elementor, and they have a very high standards. So I think without the hard work we’ve done over the past years, it could have not been possible.

\n\n\n\n

By the way, we provide all of this to Elementor for free, Elementor doesn’t pay anything for providing MVDP service. And we provide this for free for everyone in the WordPress ecosystem. And we built this entire MVDP program, and the platform, together with European Union because European Union is going to pass a law in Q4 that is making this actually mandatory for all commercial open source software.

\n\n\n\n

[00:21:03] Nathan Wrigley: Why do you do it for free? You could see my face, my eyes open thinking, hang on, wait, why?

\n\n\n\n

[00:21:08] Oliver Sild: So, one of the reasons is because European Union funded building it for free, for us as well, right? So we got 2.7 million euros to build it, and to build all the processes and everything around it. European Union understood that WordPress ecosystem is just so massive in scale, and they chose us to do it because of our track record.

\n\n\n\n

And now we are very well connected with that, and as they are, you know, preparing to release this new regulation, which by the way, like even US companies need to comply with. So everyone who has European users, every software that has commercial element to it, like accepting donations, having paid support, having premium version, or even if they’re just not fully free, but like the company that owns the plugin has any commercial activity, they need to comply.

\n\n\n\n

And the things that they need to comply is have a VDP program, which is literally what we built. You need to start releasing patches separately from functional releases. There is going to be a lot of those kind of changes, like you have to notify users about vulnerabilities. You have to notify users later on, also if the vulnerability is getting mass exploited. There’s these kind of rules, and our platform basically pre complies you for that entire regulation.

\n\n\n\n

The reason why we do it also for free is exactly what Miriam told, it’s like we also get visibility. Because as I mentioned, we cover the entire life cycle of vulnerabilities, so our goal is to provide the fastest mitigation to vulnerabilities. And the way to do that is to know about vulnerabilities. So for our end users and to all Elementor users, for example, who are using Patchstack, they know that the fastest way to get protected is from Patchstack, because we work together with Elementor. We work together with other plugins, and that’s how they know that they are getting protected by Patchstack as well.

\n\n\n\n

[00:22:42] Miriam Schwab: So both of us have strange business models, Elementor and Patchstack, because if you think about it, Elementor’s 17 million active installs, the vast majority of them are using our free product, and that’s our business model. And Patchstack’s business model is based also on providing a lot of value for free that then ends up being an actual business model. I wonder if these types of business models, that bring a lot of people value for free, could exist outside of open source, and could exist outside of WordPress.

\n\n\n\n

[00:23:08] Nathan Wrigley: Do you both advertise each other’s presence then? For example, Miriam, do you on your website somewhere say, we have this relationship with Patchstack, I don’t know, protected by Patchstack or something? And again, in the opposite direction, do you say, yeah, one of our customers, Elementor? I don’t know if there’s anything in that.

\n\n\n\n

[00:23:24] Miriam Schwab: We have a page on our site that we make sure is linked to from the footer of every page on our site. It’s called our Trust Center. It’s very important for anyone who has some kind of security process, which everyone should, to have an easy way for people to find how to report issues to the company, because otherwise people might find something, not know how to report it. It ends up in some random person’s inbox, nobody pays attention, and that’s not good for anyone.

\n\n\n\n

So we have this trust page that describes all of our security process and everything, and that links to our Bug Bounty page. It’s a page fully dedicated to just explaining our Bug Bounty program. And it clearly states there that all plugin related issues should be, and need to be reported to Patchstack. And we highly request that people respect that process because it allows Patchstack to make sure that these vulnerabilities are patched quickly, and it allows Elementor to make sure that it’s patched quickly. Which is better for everyone because we have the processes in place based around our partnership with Patchstack.

\n\n\n\n

So that’s clearly visible on our site. And we talk about in different forums, for example, the talk given yesterday, and of course this interview right now. So it’s something that’s quite publicly known.

\n\n\n\n

[00:24:27] Oliver Sild: So what we also have is, on Patchstack, we have a vulnerability database, which is completely free to use in public, where everyone can see what are the latest vulnerabilities. We show people like what the priorities there are and so forth. But it also has a directory of VDPs. So we actually have a directory where you see all the plugins that have VDP programs active.

\n\n\n\n

So that also gives you, as a developer or user, an understanding of like, okay, I want to use a plugin for my website for a specific function, let’s say a page builder. I want to use something that has proper security practices in place. So that’s where we have like this directory where you can go and look into which ones actually have a VDP program.

\n\n\n\n

We also have like a highlighting there for those plugins that are, you know, also contributing more into the community aspect as well. Actually, Elementor is featured there currently.

\n\n\n\n

So, I think having mature security processes is a big competitive advantage for plugins as well, because developers are going to choose stuff that they feel, security is, in general, very hot topic right now. I just talked yesterday with some quite big hosts in the space, and they said that it used to be that everyone was asking about performance, and now everyone is asking about security.

\n\n\n\n

And that also means that this kind of interest to security has, you know, reached the developers and everywhere. And when they make those decisions of, what plugs should I use, they are going to eventually choose the ones that they can trust most.

\n\n\n\n

[00:25:47] Nathan Wrigley: Does it muddy the water a bit? In other words, let’s say that I’m a customer, and I’m out there looking for a page builder. I come to Elementor, I’ve got my site up and running and I’m thinking, okay, I want some sort of security, I’ve heard that security’s a thing on my website. Does it muddy the water? Commercial rivals of Patchstack, for example, is the implication, okay, you must only use Patchstack. Patchstack is our preferred customer, nothing else will work. Do you ever get any intel like that?

\n\n\n\n

And the other way around? You know, if people have got some sort of security posture, but they’re looking for a page builder, do you know what I mean? There could be some sort of misunderstanding, like we only work with Elementor, or we only work with Patchstack. Do you ever get any of that kind of intel where it’s, I don’t know, muddied the water, confused things?

\n\n\n\n

[00:26:25] Miriam Schwab: The way that is generally accepted that companies and products work when it comes to their security processes, and particularly with regards to their bug bounty programs, is that they will define their bug bounty programs, and it is highly requested that people respect that.

\n\n\n\n

That isn’t always the case, and so we have had to put some processes in place where we are capable of accepting reports from other parties or individuals, who for one reason or another prefer to send it directly to us.

\n\n\n\n

So it doesn’t mean that you have to only work with Patchstack. We want reports to go wherever they can go that will make sure that we’ll get them so that we can take care of them. Legitimate reports, right? High quality reports.

\n\n\n\n

But then at that point we loop Patchstack in anyways. And that’s one of the great things about our relationship with Patchstack, they’re not like, oh, they didn’t send a to us so, you know, good luck to you, take care of it yourself. It comes back to this interest in having full visibility. And we want Patchstack’s input in making sure that everything is done properly. Both in terms of us patching it fully and resolving the issue.

\n\n\n\n

But some other things that come up is that sometimes these other reporters send us reports that are not clear. Patchstack sends us reports that are quite clear, replicable, which means that we can recreate them on our end, which helps us figure out how to fix them, right? If you can’t see the problem, you can’t fix it, and well documented. Sometimes we get reports from other sources that are quite unclear. So Patchstack can even help us ask the right questions, or sometimes try to figure out what’s going on there, either we’ll do it ourselves. Basically the process is either directly to Patchstack, then to us. Or to us, and then to Patchstack, and then to us. And then that loop starts from that direction.

\n\n\n\n

So we’re open to working with anyone. We want the reports to come to us. If for some reason people really refuse to work with Patchstack as our bug bouncy program, that’s okay. Patchstack is still part of our bug bouncy process, but we are capable of handling that as well.

\n\n\n\n

[00:28:16] Oliver Sild: We actually work with other security companies. I don’t know if you’re not aware, but like Patchstack is powering vulnerability notification system and V Patching for Solid Security, which was previously known as iThemes Security. We do that for WPMU Defender. We do that for SecuPress. We do that for Shield Security. We do that for WP Guardian, which is a co-product with Patchstack and WebPros.

\n\n\n\n

So I think what is very common between Patchstack and Elementor is that we actually work with everyone, together. Regardless whether they are like a competitor or not. We work with everyone who is willing to work together with us as well. Everything that we do in Patchstack is about collaboration.

\n\n\n\n

As I’m saying, like we work with hosting companies, we work with plugins, we work with developers and agencies. I think that is literally the only way how to succeed in making the ecosystem secure.

\n\n\n\n

In general, I think that allows us to also just make it actually as secure as it can go. And I think, from going forward from here, with all the regulations and everything also coming in, I think it’s the only way really.

\n\n\n\n

[00:29:12] Nathan Wrigley: Let’s take the scenario, Miriam, that you discover, or it is discovered by you, so not by Patchstack, out there in the wild somewhere there’s a serious problem in the Elementor’s code base. And it’s Friday night, and it gets reported to you. I’m just interested, what is the behind the scenes process that you have got set up between you to make things happen in a timely fashion?

\n\n\n\n

So I’m taking the example of, you know, Friday night being the beginning of the weekend, everybody’s going off for a couple of days, this is a bad time to discover it. I’d be interesting to know, how does that get handed off, and how does it then come back? What are the backend systems that you’ve put in place that we’ll never know about, will never be discoverable to us, but I’m presuming they now exist since you’ve partnered up with each other?

\n\n\n\n

[00:29:51] Miriam Schwab: So there’s two types of reports. I mean, there’s a lot of types of reports, but I’m just going to divide them into two categories.

\n\n\n\n

One report, type of report is this issue is being actively exploited. Meaning bad people know about it and are already trying to hack sites with it. Or this issue is some level of severity and needs to be taken care of, but nobody knows about it yet.

\n\n\n\n

Okay, so in the case of the first one, it’s all hands on deck, do or die, let’s fix this. I can’t think that this has happened since we started working with Patchstack, so I’m like theorising here. But, probably we’ll reach out to them in one of our direct channels. So like we have a shared Slack channel with Patchstack, they’re very responsive there.

\n\n\n\n

So it would be like, help, all the sirens. We’re like now dealing with this. If it’s actively exploited, we know we’ll be like, okay, we’re probably already working on it, right?

\n\n\n\n

But, FYI, heads up, we’re going to like be releasing this as soon as possible, please be available so we can send it to you just for review before we do. So that’s one type.

\n\n\n\n

The second type is you can breathe more. There’s different levels of severity. Meaning if between now and some point it’s discovered, if it’s a high level of severity, then oh my goodness. If it’s low level security, then it’s like it’s not going to affect all sites, only going to affect some certain types of users, like that kind of stuff. So it’s like less urgent.

\n\n\n\n

But that probably means that we can all just continue our weekend. I’m theorising again, so nobody should take me at it and be like, what? You’re going to sleep through the weekend with this? No, that’s not what I mean. Each vulnerability is looked at for vulnerability, and if it’s super urgent or highly urgent, then it gets the attention immediately, Patchstack will be pulled in. But if not, then there’s like a pretty clear process around it in terms of internal timelines, and the timelines that Patchstack gives us.

\n\n\n\n

So the reason that Patchstack gives a timeline is because, if they report something, a plugin, developer, or whatever has a certain amount of time within which they need to patch it. It’s better for everyone that that exists. There’s a lot of other things that you want to make a priority, so you could just kind of drag it on. But It will eventually be found.

\n\n\n\n

If something is not patched within the timeframe, then Patchstack has a whole process, which Oliver can explain. But it does get disclosed, let’s say, to the plugin review team, and that’s a serious matter for the plugin then to have to deal with it at that point.

\n\n\n\n

And then we create our own internal timeline in terms of how fast we have to turn around a patch, also based on the level of severity. So if it’s highest level of severity, it’s like really fast, medium, less fast. But our turnaround time, our customers keep raving about it on like bugs, but also security issues, we’re very fast. We take it seriously in all situations. Whether it happens Friday night at midnight or, you know, Sunday morning, because our work week starts a Sunday, that’s a different story.

\n\n\n\n

[00:32:14] Nathan Wrigley: Oliver, just before you begin, I have a friend who’s a medic and he is in trauma surgery. His phone is the conduit to, like the alarms are sounding. Do you have something equivalent to like that? Do you operate a sort of 24/7? I think you said you’ve got a distributed team. So you’re able to react right now, no matter what time of the day or night, 365 days of the year. Is that the kind of thing that you do? I was saying about the weekend, do you all take the weekend off? How does it work?

\n\n\n\n

[00:32:38] Oliver Sild: We do cover all time zones. So we have people in Asia, we have people in Europe, we have people in the US. This is important for us to do threat intelligence and, you know, security research in general.

\n\n\n\n

One thing, also in terms of like a zero days, or like in vulnerabilities in general, one thing that we help the, I would say our developer to sleep over the weekend, is that we are actively monitoring whether this vulnerability is getting exploited or not.

\n\n\n\n

So immediately when we see any kind of like signals that there is an actual exploitation attempt against this vulnerability, they would be notified immediately.

\n\n\n\n

We also take care of this kind of like a background threat intelligence monitoring part, where we know about the vulnerability, so we have signals whether this vulnerability type is getting exploited or not.

\n\n\n\n

[00:33:17] Nathan Wrigley: So you could tell whether a zero day is realistically a zero day, okay. In theory it’s possible, but nobody’s doing anything about it, so maybe we can step down a little bit.

\n\n\n\n

[00:33:27] Oliver Sild: So there’s two things we do. One thing is that we have created what we call Patchstack Priority. And this is like a special scoring made for prioritising WordPress vulnerabilities based on the likelihood of them becoming exploited.

\n\n\n\n

So we have high priority vulnerabilities, which is based on historic data, vulnerability types, and there’s like a lot of data around that shows that this vulnerability, basically we predict that this vulnerability is going to become exploited.

\n\n\n\n

And then we have medium priority, which is vulnerabilities that are potentially going to be exploited in targeted attacks. Doesn’t mean that it’s mass exploited, but it’s like, you know, if you have like a e-commerce store, for example, that holds credit card details, there’s a higher potential that this is going to be used in a targeted attack.

\n\n\n\n

And then there’s low priority, which is like, this is not going to get exploited at all.

\n\n\n\n

Based on that, we also kind of modify our timelines and everything. And also we generate virtual patches based on that, which is the auto mitigation feature that we have for all the high and medium vulnerabilities. We immediately create virtual patches, which are like essentially vulnerability specific protection rules that get automatically deploy to our customer sites without changing any code or anything. It’s very, like a precise way of making sure that this vulnerable function can’t be used in any other way than it was originally intended.

\n\n\n\n

So because of that, we have full visibility into the kind of like a network, whether we see where a specific vulnerabilities are being exploited or not. And that allows us to also basically notify back to the plugin developers later saying like, hey, we now have proof that this vulnerability has been exploited, here’s all the attacker’s information, all that kind of stuff. So we have a lot of data around that as well.

\n\n\n\n

[00:35:03] Nathan Wrigley: I think it’s amazing that WordPress as a CMS is big enough to have a page builder plugin and a security plugin at the scale that they can not only function independently, but also they can create a really meaningful partnership between the two of you. And I have really found this conversation fascinating. It’s really interesting peeling back the curtain and seeing how you’re doing things behind the scenes, if you like, so that you’re protecting all of your customers. Thank you so much, Oliver. Thank you so much, Miriam. Where can we find you online?

\n\n\n\n

[00:35:34] Miriam Schwab: You can find me personally on Twitter at Miriam Schwab. I’m also on Make WordPress Slack, post status Slack, LinkedIn, whatever. And Elementor of course is on all the social networks. We’re active on Instagram, Twitter, our website, elementor.com.

\n\n\n\n

[00:35:48] Oliver Sild: All the same places, but just Oliver Sild.

\n\n\n\n

[00:35:51] Nathan Wrigley: Perfect, and Patchstack.

\n\n\n\n

[00:35:53] Oliver Sild: Yes, patchstack.com.

\n
\n\n\n\n

On the podcast today we have Miriam Schwab and Oliver Sild.

\n\n\n\n

Miriam co-founded Strattic, a platform with an aim to revolutionise WordPress security and performance on the web. After Elementor acquired Strattic, Miriam continued leading the unit before becoming Head of WordPress Relations. Prior to that, Miriam founded and managed a prominent WordPress development agency in Israel. With over 15 years of experience, she’s a respected member of the WordPress community and a frequent speaker at WordPress events.

\n\n\n\n

Oliver Sild is the CEO and co-founder of Patchstack, a company dedicated to the mitigation of security vulnerabilities in WordPress and open-source environments. Patchstack is now a seven-year-old enterprise, and they specialise in penetration testing, security process management, and protective services for developers, agencies, and major hosting companies. Oliver’s background also includes experience running an agency, and his work at Patchstack focuses on collaborating with plugin developers and hosting providers to ensure robust security measures for their clientele.

\n\n\n\n

Miriam and Oliver joined me at WordCamp US 2024 in Portland, where they did a presentation discussing the processes needed to enhance open source plugin security and the advantages of leveraging bug bounty partnerships. Their collaboration brings to light the importance of integrating security solutions within the WordPress ecosystem, especially for companies with a footprint as large as that of Elementor.

\n\n\n\n

We talk about the global operations of Oliver’s team at Patchstack, who work across all time zones, providing round-the-clock threat intelligence and vulnerability monitoring. We also explore the Patchstack system as a whole and how it categorises WordPress vulnerabilities based on their exploitation likelihood, and their implementation of virtual patches to protect against high and medium-priority vulnerabilities automatically without code changes.

\n\n\n\n

We also get into how Miriam’s team at Elementor collaborates with Patchstack to ensure rapid and professional handling of vulnerabilities, enhancing security for their 17 million installations. The partnership between Elementor and Patchstack is a great example of how different companies within the WordPress community are able to work together to provide better outcomes for their users.

\n\n\n\n

If you’re curious about the intersection of page builders and security in WordPress, or the value of collaborative partnerships in maintaining the ecosystem, this episode is for you.

\n\n\n\n

Useful links

\n\n\n\n

Elementor

\n\n\n\n

Patchstack

\n\n\n\n

Miriam Schwab on Balancing WordPress Success and Family Life – previous podcast

\n\n\n\n

Bugcrowd

\n\n\n\n

Patchstack’s bug bounty program

\n\n\n\n

Solid Security

\n\n\n\n

SecuPress

\n\n\n\n

Shield Security

\n\n\n\n

WPMU Dev Defender

\n\n\n\n

WP Guardian

\";s: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, 23 Oct 2024 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: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:100:\"Do The Woo Community: From Blogs to WooCommerce Shops, Privacy Policies with Donata Stroink-Skillrud\";s: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=86264\";s: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://dothewoo.io/from-blogs-to-ecommerce-shops-privacy-policies-with-donata-stroink-skillrud/\";s: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:194:\"Emma and Adam chat with Donata on the essential nature of website policies for WooCommerce. Highlights include compliance, consequences of neglect, and the importance of clear privacy practices.\";s: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, 23 Oct 2024 12:53: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:5:\"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:\"\";}}}}}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:64:\"BuddyPress: BuddyPress 14.2.1 Maintenance & Security 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:32:\"https://buddypress.org/?p=335364\";s: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:78:\"https://buddypress.org/2024/10/buddypress-14-2-1-maintenance-security-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:3817:\"

BuddyPress 14.2.1 is now available. This is a maintenance & security release. All BuddyPress installations should be updated as soon as possible.

\n\n\n\n

The 14.2.1 release addresses the following security issue:

\n\n\n\n
    \n
  • The “Take Photo” feature (which uses the logged in user’s Webcam to capture their profile photo) was vulnerable to an authenticated (Subscriber+) directory traversal. Discovered by Domons from the Wordfence organization.
  • \n
\n\n\n\n

This vulnerability was reported privately to the BuddyPress team, in accordance with WordPress’s security policies. Our thanks to the reporter for practicing coordinated disclosure.

\n\n\n\n

14.2.1 also fixes 3 bugs introduced in 14.0.0:

\n\n\n\n
    \n
  • Groups: move the invite_status group meta check out of the groups_join_group() function (see #9241).
  • \n\n\n\n
  • Administration: use the components right labels into the BP site health info panel (see #9237)
  • \n\n\n\n
  • Administration: resolve Multiple Issues with the BP constants site health info panel (see #9245)
  • \n
\n\n\n\n

For complete details, visit the 14.2.1 changelog.

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

You can get the latest version by clicking on the above button, downloading it from the WordPress.org plugin directory or checking it out from our Subversion repository.

\n\n\n\n

If for a specific reason you can’t upgrade to 14.2.1, we have also ported the security fix to BuddyPress versions going all the way back to branch 11.0. Here’s the list of the available downloads for the corresponding tags, you can also find these links on our WordPress.org Plugin Directory “Advanced” page:

\n\n\n\n
    \n
  • If you are using BP 11.x and can’t upgrade to 14.2.1, please upgrade to 11.4.3
  • \n\n\n\n
  • If you are using BP 12.x and can’t upgrade to 14.2.1, please upgrade to 12.5.2
  • \n
\n\n\n\n
\n\n\n\n

Many thanks to 14.2.1 contributors 

\n\n\n\n

vapvarun, boonebgorges, emaraliveimath.

\";s: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 Oct 2024 22:22:16 +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:\"Mathieu Viet\";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:53:\"WordPress.org blog: WordPress 6.7 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:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=18023\";s: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/2024/10/wordpress-6-7-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:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:10796:\"

The first release candidate (RC1) for WordPress 6.7 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.7 is the best it can be.

\n\n\n\n

You can test WordPress 6.7 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.7-RC1
WordPress PlaygroundUse the 6.7 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.
You can test the RC1 version in four ways.\n\n\n\n

The current target for the WordPress 6.7 release is November 12, 2024. Get an overview of the 6.7 release cycle, and check the Make WordPress Core blog for 6.7-related posts in the coming weeks for further details.

\n\n\n\n

What’s in WordPress 6.7 RC1?

\n\n\n\n

Get a recap of WordPress 6.7’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.7. 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.7 (scheduled for November 12, 2024), 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.7 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.7.

\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.7 release cycle.

\n\n\n\n

Release the haiku

\n\n\n\n

I See An R.C.
You See A Chance For Testing
Six Seven For The Win!

\n\n\n\n

Thank you to the following contributors for collaborating on this post: @atachibana, @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:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 22 Oct 2024 16:42: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:14:\"David Baumwald\";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:59:\"Do The Woo Community: Vote in This Year’s WooSesh Seshies\";s: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=86238\";s: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:60:\"https://dothewoo.io/blog/vote-in-this-years-woosesh-seshies/\";s: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:128:\"Make sure and get your vote in for the Seshies, which will be announced on day 2 of WooSesh, end of day at the Do the Woo recap.\";s: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 Oct 2024 10:29:59 +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:5:\"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:\"\";}}}}}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:107:\"Do The Woo Community: Showcase Day WCUS and the Future of Open Source Contribution with Tammie and Jonathan\";s: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=86209\";s: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/showcase-day-wcus-and-the-future-of-open-source-contribution-with-tammie-and-jonathan/\";s: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:200:\"Jonathan and Tammie discuss their experiences at WordCamp US, focusing on Showcase Day\'s impact, the value of diverse contributions, and how companies can align their goals with community involvement.\";s: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 Oct 2024 09:30: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:5:\"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:\"\";}}}}}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:86:\"WPTavern: WordPress Expands Code of Conduct to Private Conversations, Community Reacts\";s: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:30:\"https://wptavern.com/?p=175808\";s: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://wptavern.com/wordpress-expands-code-of-conduct-to-private-conversations-community-reacts\";s: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:5182:\"

Automattic’s Marketing Lead, Nicholas Garofalo, has announced that WordPress is adding a new element to the Community Code of Conduct: Publishing private messages without consent. This addition expands the examples of unacceptable behaviors in the Community Code of Conduct to six.

\n\n\n\n

He pointed out that “Sharing private communications without permission is a clear violation of professional integrity. This new addition ensures that private messages receive the same level of protection as personal information and that sensitive communications shared in confidence will not be disclosed without prior consent… This change encourages honest, constructive engagement across all levels of participation.”

\n\n\n\n

He continued, “The strength of our community lies in the trust we place in one another. By clarifying and reinforcing our expectations, we are taking another step toward maintaining an inclusive, respectful, and safe environment for everyone.”

\n\n\n\n

Code of Conduct is based on the Contributor Covenant, version 2.1 and now includes six examples of unacceptable behavior.

\n\n\n\n
    \n
  • The use of sexualized language or imagery, and sexual attention or advances of any kind.
  • \n\n\n\n
  • Insulting or derogatory comments, taunting or baiting, and personal or political attacks.
  • \n\n\n\n
  • Public or private harassment.
  • \n\n\n\n
  • Publishing others’ private information, such as a physical or email address, without their explicit permission.
  • \n\n\n\n
  • Publishing private messages without consent.
  • \n\n\n\n
  • Other conduct which could reasonably be considered inappropriate in a professional setting.
  • \n
\n\n\n\n

The new addition takes effect immediately, with violations handled according to the existing enforcement guidelines. The sole exception is when private messages are shared to report concerns to the Incident Response Team.

\n\n\n\n

Yoast-sponsored WordPress Core contributor Carolina Nymark shared her experience in X, “I am one of the people who’s private WP Slack messages have been screenshotted and made public. In my case it was a harmless joke that was shared, but it should go without saying that you don’t share private messages.” 

\n\n\n\n

@gsusMad tweeted, “Attacking transparency (leaks) with transparency (CoC) as a way to show commitment to a respectful and inclusive community doesn’t feel right. If that wasn’t obvious when making the move, it’s a sign of a spiral where truth has likely become a second-class citizen, which I’m not sure aligns well with your core values.”

\n\n\n\n

“These sort of clauses make sense as long as they have a whistleblower clause. Public service whistleblowers are protected by law, I’d like to see these CoCs extend those capabilities to themselves and their communities personally.”, shared Nicholas Griffin, a Software Engineer.

\n\n\n\n

Steve Daniels tweeted, “This is vile. WordPress is changing its code of conduct to protect those who attack others in private messages by banning them from sharing the evidence. Only an abuser would create or condone such activity.”

\n\n\n\n

Former Incident Response Team member Megan Rose shared her concerns about the new changes. She said, “I worry that this new rule could enable abuse to happen in private at a time when the public trust of the IRT could potentially be in flux due to turnover or other factors… I wanted to publicly encourage caution with this new rule.”

\n\n\n\n

Megan Rose also echoed concerns shared by others regarding how this rule may intersect with whistleblower and labor laws.

\n\n\n\n

Angela Jin, who was the Head of Programs & Contributor Experience at Automattic, shared her thoughts on Community Code of Conduct, “Focusing on the WordPress Code of Conduct, this latest change is something that most people under regular circumstances, will likely readily agree to. However, it contradicts my experience with the Community and Incident Response Teams. We generally tried to avoid making very specific “don’t do this” type rules, opting instead for behaviors we wanted to encourage… The timing is also suspect, or right, given everything happening in WordPress at the moment. It depends on how you prefer to view 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:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 21 Oct 2024 18:06: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:7:\"Jyolsna\";s: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:\"Tue, 12 Nov 2024 17:27:30 GMT\";s:12:\"content-type\";s:8:\"text/xml\";s:13:\"last-modified\";s:29:\"Tue, 12 Nov 2024 17:00:30 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\";s:14:\"20211220193300\";}','off'), +(172,'_transient_timeout_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1731475651','off'), +(173,'_transient_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1731432451','off'), +(174,'_transient_timeout_dash_v2_88ae138922fe95674369b1cb3d215a2b','1731475651','off'), +(175,'_transient_dash_v2_88ae138922fe95674369b1cb3d215a2b','','off'), +(176,'_site_transient_timeout_wp_theme_files_patterns-93f4f3a30109443b1f1ec1699edabcdc','1731437655','off'), +(177,'_site_transient_wp_theme_files_patterns-93f4f3a30109443b1f1ec1699edabcdc','a:2:{s:7:\"version\";s:3:\"1.3\";s:8:\"patterns\";a:57:{s:15:\"banner-hero.php\";a:5:{s:5:\"title\";s:4:\"Hero\";s:4:\"slug\";s:28:\"twentytwentyfour/banner-hero\";s:11:\"description\";s:69:\"A hero section with a title, a paragraph, a CTA button, and an image.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";i:2;s:8:\"featured\";}}s:30:\"banner-project-description.php\";a:5:{s:5:\"title\";s:19:\"Project description\";s:4:\"slug\";s:43:\"twentytwentyfour/banner-project-description\";s:11:\"description\";s:64:\"Project description section with title, paragraph, and an image.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:4:{i:0;s:8:\"featured\";i:1;s:6:\"banner\";i:2;s:5:\"about\";i:3;s:9:\"portfolio\";}}s:30:\"cta-content-image-on-right.php\";a:5:{s:5:\"title\";s:34:\"Call to action with image on right\";s:4:\"slug\";s:43:\"twentytwentyfour/cta-content-image-on-right\";s:11:\"description\";s:76:\"A title, paragraph, two CTA buttons, and an image for a general CTA section.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";}}s:15:\"cta-pricing.php\";a:5:{s:5:\"title\";s:7:\"Pricing\";s:4:\"slug\";s:28:\"twentytwentyfour/cta-pricing\";s:11:\"description\";s:69:\"A pricing section with a title, a paragraph and three pricing levels.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"services\";}}s:12:\"cta-rsvp.php\";a:5:{s:5:\"title\";s:4:\"RSVP\";s:4:\"slug\";s:25:\"twentytwentyfour/cta-rsvp\";s:11:\"description\";s:63:\"A large RSVP heading sideways, a description, and a CTA button.\";s:13:\"viewportWidth\";i:1100;s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"featured\";}}s:27:\"cta-services-image-left.php\";a:5:{s:5:\"title\";s:42:\"Services call to action with image on left\";s:4:\"slug\";s:40:\"twentytwentyfour/cta-services-image-left\";s:11:\"description\";s:65:\"An image, title, paragraph and a CTA button to describe services.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:4:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";i:2;s:8:\"featured\";i:3;s:8:\"services\";}}s:26:\"cta-subscribe-centered.php\";a:5:{s:5:\"title\";s:23:\"Centered call to action\";s:4:\"slug\";s:39:\"twentytwentyfour/cta-subscribe-centered\";s:11:\"description\";s:67:\"Subscribers CTA section with a title, a paragraph and a CTA button.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}s:8:\"keywords\";a:3:{i:0;s:10:\"newsletter\";i:1;s:9:\"subscribe\";i:2;s:6:\"button\";}}s:28:\"footer-centered-logo-nav.php\";a:5:{s:5:\"title\";s:40:\"Footer with centered logo and navigation\";s:4:\"slug\";s:41:\"twentytwentyfour/footer-centered-logo-nav\";s:11:\"description\";s:73:\"A footer section with a centered logo, navigation, and WordPress credits.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:25:\"footer-colophon-3-col.php\";a:5:{s:5:\"title\";s:31:\"Footer with colophon, 3 columns\";s:4:\"slug\";s:38:\"twentytwentyfour/footer-colophon-3-col\";s:11:\"description\";s:47:\"A footer section with a colophon and 3 columns.\";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:31:\"Footer with colophon, 4 columns\";s:4:\"slug\";s:23:\"twentytwentyfour/footer\";s:11:\"description\";s:47:\"A footer section with a colophon and 4 columns.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:29:\"gallery-full-screen-image.php\";a:4:{s:5:\"title\";s:17:\"Full screen image\";s:4:\"slug\";s:42:\"twentytwentyfour/gallery-full-screen-image\";s:11:\"description\";s:51:\"A cover image section that covers the entire width.\";s:10:\"categories\";a:2:{i:0;s:7:\"gallery\";i:1;s:9:\"portfolio\";}}s:36:\"gallery-offset-images-grid-2-col.php\";a:6:{s:5:\"title\";s:25:\"Offset gallery, 2 columns\";s:4:\"slug\";s:49:\"twentytwentyfour/gallery-offset-images-grid-2-col\";s:11:\"description\";s:51:\"A gallery section with 2 columns and offset images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:7:\"gallery\";i:1;s:9:\"portfolio\";}s:8:\"keywords\";a:5:{i:0;s:7:\"project\";i:1;s:6:\"images\";i:2;s:5:\"media\";i:3;s:7:\"masonry\";i:4;s:7:\"columns\";}}s:36:\"gallery-offset-images-grid-3-col.php\";a:6:{s:5:\"title\";s:25:\"Offset gallery, 3 columns\";s:4:\"slug\";s:49:\"twentytwentyfour/gallery-offset-images-grid-3-col\";s:11:\"description\";s:51:\"A gallery section with 3 columns and offset images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:7:\"gallery\";i:1;s:9:\"portfolio\";}s:8:\"keywords\";a:5:{i:0;s:7:\"project\";i:1;s:6:\"images\";i:2;s:5:\"media\";i:3;s:7:\"masonry\";i:4;s:7:\"columns\";}}s:36:\"gallery-offset-images-grid-4-col.php\";a:6:{s:5:\"title\";s:25:\"Offset gallery, 4 columns\";s:4:\"slug\";s:49:\"twentytwentyfour/gallery-offset-images-grid-4-col\";s:11:\"description\";s:51:\"A gallery section with 4 columns and offset images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:7:\"gallery\";i:1;s:8:\"featured\";i:2;s:9:\"portfolio\";}s:8:\"keywords\";a:5:{i:0;s:7:\"project\";i:1;s:6:\"images\";i:2;s:5:\"media\";i:3;s:7:\"masonry\";i:4;s:7:\"columns\";}}s:26:\"gallery-project-layout.php\";a:5:{s:5:\"title\";s:14:\"Project layout\";s:4:\"slug\";s:39:\"twentytwentyfour/gallery-project-layout\";s:11:\"description\";s:54:\"A gallery section with a project layout with 2 images.\";s:13:\"viewportWidth\";i:1600;s:10:\"categories\";a:3:{i:0;s:7:\"gallery\";i:1;s:8:\"featured\";i:2;s:9:\"portfolio\";}}s:14:\"hidden-404.php\";a:4:{s:5:\"title\";s:3:\"404\";s:4:\"slug\";s:27:\"twentytwentyfour/hidden-404\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:19:\"hidden-comments.php\";a:4:{s:5:\"title\";s:8:\"Comments\";s:4:\"slug\";s:32:\"twentytwentyfour/hidden-comments\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:21:\"hidden-no-results.php\";a:4:{s:5:\"title\";s:10:\"No results\";s:4:\"slug\";s:34:\"twentytwentyfour/hidden-no-results\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:25:\"hidden-portfolio-hero.php\";a:4:{s:5:\"title\";s:14:\"Portfolio hero\";s:4:\"slug\";s:38:\"twentytwentyfour/hidden-portfolio-hero\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:20:\"hidden-post-meta.php\";a:4:{s:5:\"title\";s:9:\"Post meta\";s:4:\"slug\";s:33:\"twentytwentyfour/hidden-post-meta\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:26:\"hidden-post-navigation.php\";a:4:{s:5:\"title\";s:15:\"Post navigation\";s:4:\"slug\";s:39:\"twentytwentyfour/hidden-post-navigation\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:24:\"hidden-posts-heading.php\";a:5:{s:5:\"title\";s:13:\"Posts heading\";s:4:\"slug\";s:37:\"twentytwentyfour/hidden-posts-heading\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;s:10:\"categories\";a:1:{i:0;s:6:\"hidden\";}}s:17:\"hidden-search.php\";a:4:{s:5:\"title\";s:6:\"Search\";s:4:\"slug\";s:30:\"twentytwentyfour/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:\"twentytwentyfour/hidden-sidebar\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:23:\"page-about-business.php\";a:8:{s:5:\"title\";s:5:\"About\";s:4:\"slug\";s:36:\"twentytwentyfour/page-about-business\";s:11:\"description\";s:147:\"A business about page with a hero section, a text section, a services section, a team section, a clients section, a FAQ section, and a CTA section.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfour_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:22:\"page-home-blogging.php\";a:7:{s:5:\"title\";s:13:\"Blogging home\";s:4:\"slug\";s:35:\"twentytwentyfour/page-home-blogging\";s:11:\"description\";s:92:\"A blogging home page with a hero section, a text section, a blog section, and a CTA section.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfour_page\";}s:8:\"keywords\";a:2:{i:0;s:4:\"page\";i:1;s:7:\"starter\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:22:\"page-home-business.php\";a:8:{s:5:\"title\";s:13:\"Business home\";s:4:\"slug\";s:35:\"twentytwentyfour/page-home-business\";s:11:\"description\";s:146:\"A business home page with a hero section, a text section, a services section, a team section, a clients section, a FAQ section, and a CTA section.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfour_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:31:\"page-home-portfolio-gallery.php\";a:8:{s:5:\"title\";s:28:\"Portfolio home image gallery\";s:4:\"slug\";s:34:\"twentytwentyfour/page-home-gallery\";s:11:\"description\";s:46:\"A portfolio home page that features a gallery.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfour_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:23:\"page-home-portfolio.php\";a:8:{s:5:\"title\";s:40:\"Portfolio home with post featured images\";s:4:\"slug\";s:36:\"twentytwentyfour/page-home-portfolio\";s:11:\"description\";s:94:\"A portfolio home page with a description and a 4-column post section with only feature images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfour_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:27:\"page-newsletter-landing.php\";a:8:{s:5:\"title\";s:18:\"Newsletter landing\";s:4:\"slug\";s:40:\"twentytwentyfour/page-newsletter-landing\";s:11:\"description\";s:62:\"A block with a newsletter subscription CTA for a landing page.\";s:13:\"viewportWidth\";i:1100;s:10:\"categories\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:21:\"twentytwentyfour_page\";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:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:27:\"page-portfolio-overview.php\";a:8:{s:5:\"title\";s:26:\"Portfolio project overview\";s:4:\"slug\";s:40:\"twentytwentyfour/page-portfolio-overview\";s:11:\"description\";s:138:\"A full portfolio page with a section for project description, project details, a full screen image, and a gallery section with two images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfour_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:21:\"page-rsvp-landing.php\";a:8:{s:5:\"title\";s:12:\"RSVP landing\";s:4:\"slug\";s:34:\"twentytwentyfour/page-rsvp-landing\";s:11:\"description\";s:63:\"A large RSVP heading sideways, a description, and a CTA button.\";s:13:\"viewportWidth\";i:1100;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfour_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:15:\"posts-1-col.php\";a:5:{s:5:\"title\";s:23:\"List of posts, 1 column\";s:4:\"slug\";s:28:\"twentytwentyfour/posts-1-col\";s:11:\"description\";s:26:\"A list of posts, 1 column.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:15:\"posts-3-col.php\";a:5:{s:5:\"title\";s:24:\"List of posts, 3 columns\";s:4:\"slug\";s:28:\"twentytwentyfour/posts-3-col\";s:11:\"description\";s:27:\"A list of posts, 3 columns.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:20:\"posts-grid-2-col.php\";a:5:{s:5:\"title\";s:49:\"Grid of posts featuring the first post, 2 columns\";s:4:\"slug\";s:33:\"twentytwentyfour/posts-grid-2-col\";s:11:\"description\";s:52:\"A grid of posts featuring the first post, 2 columns.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:27:\"posts-images-only-3-col.php\";a:5:{s:5:\"title\";s:42:\"Posts with featured images only, 3 columns\";s:4:\"slug\";s:40:\"twentytwentyfour/posts-images-only-3-col\";s:11:\"description\";s:53:\"A list of posts with featured images only, 3 columns.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:34:\"posts-images-only-offset-4-col.php\";a:4:{s:5:\"title\";s:49:\"Offset posts with featured images only, 4 columns\";s:4:\"slug\";s:47:\"twentytwentyfour/posts-images-only-offset-4-col\";s:11:\"description\";s:53:\"A list of posts with featured images only, 4 columns.\";s:10:\"categories\";a:1:{i:0;s:5:\"posts\";}}s:14:\"posts-list.php\";a:5:{s:5:\"title\";s:38:\"List of posts without images, 1 column\";s:4:\"slug\";s:27:\"twentytwentyfour/posts-list\";s:11:\"description\";s:41:\"A list of posts without images, 1 column.\";s:10:\"categories\";a:2:{i:0;s:5:\"query\";i:1;s:5:\"posts\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:14:\"team-4-col.php\";a:5:{s:5:\"title\";s:23:\"Team members, 4 columns\";s:4:\"slug\";s:27:\"twentytwentyfour/team-4-col\";s:11:\"description\";s:76:\"A team section, with a heading, a paragraph, and 4 columns for team members.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:4:\"team\";i:1;s:5:\"about\";}}s:29:\"template-archive-blogging.php\";a:6:{s:5:\"title\";s:25:\"Blogging archive template\";s:4:\"slug\";s:42:\"twentytwentyfour/template-archive-blogging\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:5:{i:0;s:7:\"archive\";i:1;s:8:\"category\";i:2;s:3:\"tag\";i:3;s:6:\"author\";i:4;s:4:\"date\";}}s:30:\"template-archive-portfolio.php\";a:6:{s:5:\"title\";s:26:\"Portfolio archive template\";s:4:\"slug\";s:43:\"twentytwentyfour/template-archive-portfolio\";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:26:\"template-home-blogging.php\";a:6:{s:5:\"title\";s:22:\"Blogging home template\";s:4:\"slug\";s:39:\"twentytwentyfour/template-home-blogging\";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:26:\"template-home-business.php\";a:6:{s:5:\"title\";s:22:\"Business home template\";s:4:\"slug\";s:39:\"twentytwentyfour/template-home-business\";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:27:\"template-home-portfolio.php\";a:6:{s:5:\"title\";s:49:\"Portfolio home template with post featured images\";s:4:\"slug\";s:40:\"twentytwentyfour/template-home-portfolio\";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:27:\"template-index-blogging.php\";a:6:{s:5:\"title\";s:23:\"Blogging index template\";s:4:\"slug\";s:40:\"twentytwentyfour/template-index-blogging\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"index\";i:1;s:4:\"home\";}}s:28:\"template-index-portfolio.php\";a:6:{s:5:\"title\";s:24:\"Portfolio index template\";s:4:\"slug\";s:41:\"twentytwentyfour/template-index-portfolio\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:5:\"index\";}}s:28:\"template-search-blogging.php\";a:6:{s:5:\"title\";s:24:\"Blogging search template\";s:4:\"slug\";s:41:\"twentytwentyfour/template-search-blogging\";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-portfolio.php\";a:6:{s:5:\"title\";s:25:\"Portfolio search template\";s:4:\"slug\";s:42:\"twentytwentyfour/template-search-portfolio\";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-single-portfolio.php\";a:6:{s:5:\"title\";s:30:\"Portfolio single post template\";s:4:\"slug\";s:42:\"twentytwentyfour/template-single-portfolio\";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:24:\"testimonial-centered.php\";a:6:{s:5:\"title\";s:20:\"Centered testimonial\";s:4:\"slug\";s:37:\"twentytwentyfour/testimonial-centered\";s:11:\"description\";s:67:\"A centered testimonial section with an avatar, name, and job title.\";s:13:\"viewportWidth\";i:1300;s:10:\"categories\";a:2:{i:0;s:12:\"testimonials\";i:1;s:4:\"text\";}s:8:\"keywords\";a:3:{i:0;s:5:\"quote\";i:1;s:6:\"review\";i:2;s:5:\"about\";}}s:27:\"text-alternating-images.php\";a:5:{s:5:\"title\";s:28:\"Text with alternating images\";s:4:\"slug\";s:40:\"twentytwentyfour/text-alternating-images\";s:11:\"description\";s:92:\"A text section, then a two-column section with text in one column and an image in the other.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:4:\"text\";i:1;s:5:\"about\";}}s:33:\"text-centered-statement-small.php\";a:6:{s:5:\"title\";s:25:\"Centered statement, small\";s:4:\"slug\";s:46:\"twentytwentyfour/text-centered-statement-small\";s:11:\"description\";s:54:\"A centered italic text statement with compact padding.\";s:13:\"viewportWidth\";i:1200;s:10:\"categories\";a:2:{i:0;s:4:\"text\";i:1;s:5:\"about\";}s:8:\"keywords\";a:2:{i:0;s:7:\"mission\";i:1;s:12:\"introduction\";}}s:27:\"text-centered-statement.php\";a:6:{s:5:\"title\";s:18:\"Centered statement\";s:4:\"slug\";s:40:\"twentytwentyfour/text-centered-statement\";s:11:\"description\";s:70:\"A centered text statement with a large amount of padding on all sides.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:4:\"text\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:2:{i:0;s:7:\"mission\";i:1;s:12:\"introduction\";}}s:12:\"text-faq.php\";a:6:{s:5:\"title\";s:3:\"FAQ\";s:4:\"slug\";s:25:\"twentytwentyfour/text-faq\";s:11:\"description\";s:76:\"A FAQ section with a large FAQ heading and a group of questions and answers.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:4:\"text\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:4:{i:0;s:3:\"faq\";i:1;s:5:\"about\";i:2;s:10:\"frequently\";i:3;s:5:\"asked\";}}s:27:\"text-feature-grid-3-col.php\";a:5:{s:5:\"title\";s:23:\"Feature grid, 3 columns\";s:4:\"slug\";s:40:\"twentytwentyfour/text-feature-grid-3-col\";s:11:\"description\";s:62:\"A feature grid of 2 rows and 3 columns with headings and text.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:4:\"text\";i:1;s:5:\"about\";}}s:24:\"text-project-details.php\";a:5:{s:5:\"title\";s:15:\"Project details\";s:4:\"slug\";s:37:\"twentytwentyfour/text-project-details\";s:11:\"description\";s:40:\"A text-only section for project details.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:4:\"text\";i:1;s:9:\"portfolio\";}}s:31:\"text-title-left-image-right.php\";a:5:{s:5:\"title\";s:49:\"Title text and button on left with image on right\";s:4:\"slug\";s:44:\"twentytwentyfour/text-title-left-image-right\";s:11:\"description\";s:77:\"A title, a paragraph and a CTA button on the left with an image on the right.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}}}}','off'), +(178,'publishpress_future_workflow_samples_created','1','auto'), +(179,'_transient_timeout_as-post-store-dependencies-met','1731522256','off'), +(180,'_transient_as-post-store-dependencies-met','yes','off'), +(181,'_transient_timeout_publishpressfuture_orphan_workflow_args_cleanup','1731522256','off'), +(182,'_transient_publishpressfuture_orphan_workflow_args_cleanup','1','off'), +(183,'_transient_timeout_publishpressfuture_finished_scheduled_steps_cleanup','1731522256','off'), +(184,'_transient_publishpressfuture_finished_scheduled_steps_cleanup','1','off'), +(185,'action_scheduler_lock_async-request-runner','67339d50563ae0.33152469|1731435916','no'), +(186,'_transient_wp_styles_for_blocks','a:2:{s:4:\"hash\";s:32:\"6c08f10f781314fea7ccc4d5e3695f52\";s:6:\"blocks\";a:63:{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:0:\"\";s:14:\"core/pullquote\";s:347:\":root :where(.wp-block-pullquote){border-radius: var(--wp--preset--spacing--20);font-family: var(--wp--preset--font-family--heading);font-size: var(--wp--preset--font-size--x-large);font-style: italic;font-weight: 400;letter-spacing: 0em;line-height: 1.5;padding-top: var(--wp--preset--spacing--40);padding-bottom: var(--wp--preset--spacing--40);}\";s:32:\"c48738dcb285a3f6ab83acff204fc486\";s:157:\":root :where(.wp-block-pullquote cite){font-family: var(--wp--preset--font-family--body);font-size: var(--wp--preset--font-size--medium);font-style: normal;}\";s:11:\"core/avatar\";s:56:\":root :where(.wp-block-avatar img){border-radius: 90px;}\";s:12:\"core/buttons\";s:673:\":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: 0.7rem;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: 0.7rem;margin-block-end: 0;}:root :where(.wp-block-buttons-is-layout-flex){gap: 0.7rem;}:root :where(.wp-block-buttons-is-layout-grid){gap: 0.7rem;}\";s:13:\"core/calendar\";s:456:\":root :where(.wp-block-calendar table, .wp-block-calendar th){color: var(--wp--preset--color--contrast);}:root :where(.wp-block-calendar.wp-block-calendar table:where(:not(.has-text-color)) th){background-color:var(--wp--preset--color--contrast-2);color:var(--wp--preset--color--base);border-color:var(--wp--preset--color--contrast-2)}:root :where(.wp-block-calendar table:where(:not(.has-text-color)) td){border-color:var(--wp--preset--color--contrast-2)}\";s:15:\"core/categories\";s:191:\":root :where(.wp-block-categories){padding-right: 0px;padding-left: 0px;}:root :where(.wp-block-categories){list-style-type:none;}:root :where(.wp-block-categories li){margin-bottom: 0.5rem;}\";s:9:\"core/code\";s:567:\":root :where(.wp-block-code){background-color: var(--wp--preset--color--base-2);border-radius: var(--wp--preset--spacing--20);border-color: var(--wp--preset--color--contrast);color: var(--wp--preset--color--contrast-2);font-size: var(--wp--preset--font-size--medium);font-style: normal;font-weight: 400;line-height: 1.6;padding-top: calc(var(--wp--preset--spacing--30) + 0.75rem);padding-right: calc(var(--wp--preset--spacing--30) + 0.75rem);padding-bottom: calc(var(--wp--preset--spacing--30) + 0.75rem);padding-left: calc(var(--wp--preset--spacing--30) + 0.75rem);}\";s:24:\"core/comment-author-name\";s:170:\":root :where(.wp-block-comment-author-name){color: var(--wp--preset--color--contrast);font-size: var(--wp--preset--font-size--small);font-style: normal;font-weight: 600;}\";s:32:\"c0002c260f8238c4212f3e4c369fc4f7\";s:143:\":root :where(.wp-block-comment-author-name a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast);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:177:\":root :where(.wp-block-comment-content){font-size: var(--wp--preset--font-size--small);margin-top: var(--wp--preset--spacing--20);margin-bottom: var(--wp--preset--spacing--20);}\";s:17:\"core/comment-date\";s:164:\":root :where(.wp-block-comment-date){color: var(--wp--preset--color--contrast-2);font-size: var(--wp--preset--font-size--small);margin-top: 0px;margin-bottom: 0px;}\";s:32:\"c83ca7b3e52884c70f7830c54f99b318\";s:138:\":root :where(.wp-block-comment-date a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast-2);text-decoration: none;}\";s:32:\"7a05169cd0e6c7a5390492b955f8fd3d\";s:105:\":root :where(.wp-block-comment-date a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";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:143:\":root :where(.wp-block-comment-edit-link a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast-2);text-decoration: none;}\";s:32:\"9c12982bf0f274860d94c3aa18230c84\";s:110:\":root :where(.wp-block-comment-edit-link a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";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:144:\":root :where(.wp-block-comment-reply-link a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast-2);text-decoration: none;}\";s:32:\"f8339fa97df92f99a6b4eac7a6597226\";s:111:\":root :where(.wp-block-comment-reply-link a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";s:23:\"core/post-comments-form\";s:109:\":root :where(.wp-block-post-comments-form textarea, .wp-block-post-comments-form input){border-radius:.33rem}\";s:24:\"core/comments-pagination\";s:92:\":root :where(.wp-block-comments-pagination){font-size: var(--wp--preset--font-size--small);}\";s:29:\"core/comments-pagination-next\";s:97:\":root :where(.wp-block-comments-pagination-next){font-size: var(--wp--preset--font-size--small);}\";s:32:\"core/comments-pagination-numbers\";s:100:\":root :where(.wp-block-comments-pagination-numbers){font-size: var(--wp--preset--font-size--small);}\";s:33:\"core/comments-pagination-previous\";s:101:\":root :where(.wp-block-comments-pagination-previous){font-size: var(--wp--preset--font-size--small);}\";s:14:\"core/footnotes\";s:82:\":root :where(.wp-block-footnotes){font-size: var(--wp--preset--font-size--small);}\";s:12:\"core/gallery\";s:79:\":root :where(.wp-block-gallery){margin-bottom: var(--wp--preset--spacing--50);}\";s:10:\"core/image\";s:0:\"\";s:9:\"core/list\";s:75:\":root :where(.wp-block-list){padding-left: var(--wp--preset--spacing--10);}\";s:13:\"core/loginout\";s:114:\":root :where(.wp-block-loginout input){border-radius:.33rem;padding:calc(0.667em + 2px);border:1px solid #949494;}\";s:15:\"core/navigation\";s:53:\":root :where(.wp-block-navigation){font-weight: 500;}\";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:16:\"core/post-author\";s:84:\":root :where(.wp-block-post-author){font-size: var(--wp--preset--font-size--small);}\";s:21:\"core/post-author-name\";s:89:\":root :where(.wp-block-post-author-name){font-size: var(--wp--preset--font-size--small);}\";s:32:\"5e6daa05ce887f9195642ee978692d48\";s:98:\":root :where(.wp-block-post-author-name a:where(:not(.wp-element-button))){text-decoration: none;}\";s:32:\"9a762eac1c7e11f5da88ab6368f7855f\";s:109:\":root :where(.wp-block-post-author-name a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";s:14:\"core/post-date\";s:126:\":root :where(.wp-block-post-date){color: var(--wp--preset--color--contrast-2);font-size: var(--wp--preset--font-size--small);}\";s:32:\"ac0d4e00f5ec22d14451759983e5bd43\";s:135:\":root :where(.wp-block-post-date a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast-2);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:17:\"core/post-excerpt\";s:55:\":root :where(.wp-block-post-excerpt){line-height: 1.6;}\";s:24:\"core/post-featured-image\";s:228:\":root :where(.wp-block-post-featured-image img, .wp-block-post-featured-image .block-editor-media-placeholder, .wp-block-post-featured-image .wp-block-post-featured-image__overlay){border-radius: var(--wp--preset--spacing--20);}\";s:15:\"core/post-terms\";s:192:\":root :where(.wp-block-post-terms){font-size: var(--wp--preset--font-size--small);}:root :where(.wp-block-post-terms .wp-block-post-terms__prefix){color: var(--wp--preset--color--contrast-2);}\";s:32:\"b7c958776cf894ff147e343b0c9ddf57\";s:92:\":root :where(.wp-block-post-terms a:where(:not(.wp-element-button))){text-decoration: none;}\";s:32:\"eb904b88c81440705e2673cf9a778b66\";s:103:\":root :where(.wp-block-post-terms a:where(:not(.wp-element-button)):hover){text-decoration: underline;}\";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:16:\"core/query-title\";s:61:\":root :where(.wp-block-query-title span){font-style: italic;}\";s:21:\"core/query-no-results\";s:86:\":root :where(.wp-block-query-no-results){padding-top: var(--wp--preset--spacing--30);}\";s:10:\"core/quote\";s:1316:\":root :where(.wp-block-quote){background-color: var(--wp--preset--color--base-2);border-radius: var(--wp--preset--spacing--20);font-family: var(--wp--preset--font-family--heading);font-size: var(--wp--preset--font-size--large);font-style: italic;line-height: 1.3;padding-top: calc(var(--wp--preset--spacing--30) + 0.75rem);padding-right: calc(var(--wp--preset--spacing--30) + 0.75rem);padding-bottom: calc(var(--wp--preset--spacing--30) + 0.75rem);padding-left: calc(var(--wp--preset--spacing--30) + 0.75rem);}:root :where(.wp-block-quote :where(p)){margin-block-start:0;margin-block-end:calc(var(--wp--preset--spacing--10) + 0.5rem);}:root :where(.wp-block-quote :where(:last-child)){margin-block-end:0;}:root :where(.wp-block-quote.has-text-align-right.is-style-plain, .rtl .is-style-plain.wp-block-quote:not(.has-text-align-center):not(.has-text-align-left)){border-width: 0 2px 0 0;padding-left:calc(var(--wp--preset--spacing--20) + 0.5rem);padding-right:calc(var(--wp--preset--spacing--20) + 0.5rem);}:root :where(.wp-block-quote.has-text-align-left.is-style-plain, body:not(.rtl) .is-style-plain.wp-block-quote:not(.has-text-align-center):not(.has-text-align-right)){border-width: 0 0 0 2px;padding-left:calc(var(--wp--preset--spacing--20) + 0.5rem);padding-right:calc(var(--wp--preset--spacing--20) + 0.5rem)}\";s:32:\"1de7a22e22013106efc5be82788cb6c0\";s:152:\":root :where(.wp-block-quote cite){font-family: var(--wp--preset--font-family--body);font-size: var(--wp--preset--font-size--small);font-style: normal;}\";s:11:\"core/search\";s:264:\":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--small);}:root :where(.wp-block-search .wp-block-search__input){border-radius:.33rem}\";s:32:\"14fa6a3d0cfbde171cbc0fb04aa8a6cf\";s:114:\":root :where(.wp-block-search .wp-element-button,.wp-block-search .wp-block-button__link){border-radius: .33rem;}\";s:14:\"core/separator\";s:327:\":root :where(.wp-block-separator){border-color: currentColor;border-width: 0 0 1px 0;border-style: solid;color: var(--wp--preset--color--contrast);}:root :where(.wp-block-separator){}:root :where(.wp-block-separator:not(.is-style-wide):not(.is-style-dots):not(.alignwide):not(.alignfull)){width: var(--wp--preset--spacing--60)}\";s:17:\"core/site-tagline\";s:129:\":root :where(.wp-block-site-tagline){color: var(--wp--preset--color--contrast-2);font-size: var(--wp--preset--font-size--small);}\";s:15:\"core/site-title\";s:194:\":root :where(.wp-block-site-title){font-family: var(--wp--preset--font-family--body);font-size: clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.542), 1.2rem);font-style: normal;font-weight: 600;}\";s:32:\"f513d889cf971b13995cc3fffed2f39b\";s:92:\":root :where(.wp-block-site-title a:where(:not(.wp-element-button))){text-decoration: none;}\";s:32:\"22c37a317cc0ebd50155b5ad78564f37\";s:98:\":root :where(.wp-block-site-title a:where(:not(.wp-element-button)):hover){text-decoration: none;}\";}}','on'), +(187,'db_upgraded','','on'), +(188,'postexpiratorVersion','4.1.1-beta.1','auto'), +(189,'_site_transient_timeout_theme_roots','1731437663','off'), +(190,'_site_transient_theme_roots','a:3:{s:16:\"twentytwentyfive\";s:7:\"/themes\";s:16:\"twentytwentyfour\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";}','off'), +(191,'_transient_timeout_action_scheduler_last_pastdue_actions_check','1731457464','off'), +(192,'_transient_action_scheduler_last_pastdue_actions_check','1731435864','off'), +(193,'can_compress_scripts','0','on'), +(194,'post-expirator_wp_reviews_installed_on','2024-11-12 18:24:27','auto'); /*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `wp_postexpirator_debug` +-- + +DROP TABLE IF EXISTS `wp_postexpirator_debug`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_postexpirator_debug` ( + `id` int NOT NULL AUTO_INCREMENT, + `timestamp` timestamp NOT NULL, + `blog` int NOT NULL, + `message` text NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_postexpirator_debug` +-- + +LOCK TABLES `wp_postexpirator_debug` WRITE; +/*!40000 ALTER TABLE `wp_postexpirator_debug` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_postexpirator_debug` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `wp_postmeta` -- @@ -416,12 +485,12 @@ DROP TABLE IF EXISTS `wp_postmeta`; CREATE TABLE `wp_postmeta` ( `meta_id` bigint unsigned NOT NULL AUTO_INCREMENT, `post_id` bigint unsigned NOT NULL DEFAULT '0', - `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_520_ci, + `meta_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `meta_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci, PRIMARY KEY (`meta_id`), KEY `post_id` (`post_id`), KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -432,7 +501,23 @@ 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'); +(2,3,'_wp_page_template','default'), +(3,6,'_pp_workflow_debug_ray_show_queries','0'), +(4,6,'_pp_workflow_debug_ray_show_emails','0'), +(5,6,'_pp_workflow_debug_ray_show_wordpress_errors','0'), +(6,6,'_pp_workflow_debug_ray_show_current_running_step','0'), +(7,7,'_pp_workflow_debug_ray_show_queries','0'), +(8,7,'_pp_workflow_debug_ray_show_emails','0'), +(9,7,'_pp_workflow_debug_ray_show_wordpress_errors','0'), +(10,7,'_pp_workflow_debug_ray_show_current_running_step','0'), +(11,8,'_pp_workflow_debug_ray_show_queries','0'), +(12,8,'_pp_workflow_debug_ray_show_emails','0'), +(13,8,'_pp_workflow_debug_ray_show_wordpress_errors','0'), +(14,8,'_pp_workflow_debug_ray_show_current_running_step','0'), +(15,9,'_pp_workflow_debug_ray_show_queries','0'), +(16,9,'_pp_workflow_debug_ray_show_emails','0'), +(17,9,'_pp_workflow_debug_ray_show_wordpress_errors','0'), +(18,9,'_pp_workflow_debug_ray_show_current_running_step','0'); /*!40000 ALTER TABLE `wp_postmeta` ENABLE KEYS */; UNLOCK TABLES; @@ -448,31 +533,31 @@ CREATE TABLE `wp_posts` ( `post_author` bigint 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 COLLATE utf8mb4_unicode_520_ci NOT NULL, - `post_title` text COLLATE utf8mb4_unicode_520_ci NOT NULL, - `post_excerpt` text COLLATE utf8mb4_unicode_520_ci NOT NULL, - `post_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'publish', - `comment_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open', - `ping_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open', - `post_password` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `post_name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `to_ping` text COLLATE utf8mb4_unicode_520_ci NOT NULL, - `pinged` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `post_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL, + `post_title` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL, + `post_excerpt` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL, + `post_status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'publish', + `comment_status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open', + `ping_status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open', + `post_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `post_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `to_ping` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL, + `pinged` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci 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 COLLATE utf8mb4_unicode_520_ci NOT NULL, + `post_content_filtered` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL, `post_parent` bigint unsigned NOT NULL DEFAULT '0', - `guid` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `guid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', `menu_order` int NOT NULL DEFAULT '0', - `post_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'post', - `post_mime_type` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `post_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'post', + `post_mime_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', `comment_count` bigint 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=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -484,10 +569,86 @@ LOCK TABLES `wp_posts` WRITE; INSERT INTO `wp_posts` VALUES (1,1,'2024-07-30 20:00:07','2024-07-30 20:00:07','\n

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

\n','Hello world!','','publish','open','open','','hello-world','','','2024-07-30 20:00:07','2024-07-30 20:00:07','',0,'http://localhost:60802/?p=1',0,'post','',1), (2,1,'2024-07-30 20:00:07','2024-07-30 20:00: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','','','2024-07-30 20:00:07','2024-07-30 20:00:07','',0,'http://localhost:60802/?page_id=2',0,'page','',0), -(3,1,'2024-07-30 20:00:07','2024-07-30 20:00:07','\n

Who we are

\n\n\n

Suggested text: Our website address is: http://localhost:60802.

\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','','','2024-07-30 20:00:07','2024-07-30 20:00:07','',0,'http://localhost:60802/?page_id=3',0,'page','',0); +(3,1,'2024-07-30 20:00:07','2024-07-30 20:00:07','\n

Who we are

\n\n\n

Suggested text: Our website address is: http://localhost:60802.

\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','','','2024-07-30 20:00:07','2024-07-30 20:00:07','',0,'http://localhost:60802/?page_id=3',0,'page','',0), +(4,0,'2024-11-12 17:27:23','2024-11-12 17:27:23','','Navigation','','publish','closed','closed','','navigation','','','2024-11-12 17:27:23','2024-11-12 17:27:23','',0,'http://localhost:60802/?p=4',0,'wp_navigation','',0), +(5,1,'2024-11-12 17:27:29','0000-00-00 00:00:00','','Auto Draft','','auto-draft','open','open','','','','','2024-11-12 17:27:29','0000-00-00 00:00:00','',0,'http://localhost:60802/?p=5',0,'post','',0), +(6,0,'2024-11-12 18:24:15','0000-00-00 00:00:00','{\"nodes\":[{\"id\":\"n1717543440185\",\"type\":\"trigger\",\"position\":{\"x\":0,\"y\":-140},\"data\":{\"name\":\"trigger\\/core.post-updated\",\"elementaryType\":\"trigger\",\"version\":1,\"slug\":\"onPostUpdated1\",\"settings\":{\"postQuery\":{\"postSource\":\"custom\",\"postType\":[],\"postId\":[],\"postStatus\":[]}}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":0,\"y\":-140},\"dragging\":false},{\"id\":\"n1717543448599\",\"type\":\"generic\",\"position\":{\"x\":0,\"y\":-20},\"data\":{\"name\":\"action\\/core.send-email\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"sendEmail1\",\"settings\":{\"recipient\":{\"recipient\":\"global.site.admin_email\",\"custom\":\"\"},\"subject\":\"Post updated: {{onPostUpdated1.postBefore.title}}\",\"message\":\"The post \\\"{{onPostUpdated1.postBefore.title}} was updated.\\n\\nThe new title is \\\"{{onPostUpdated1.postAfter.title}}\\\".\"}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":0,\"y\":-20},\"dragging\":false}],\"edges\":[{\"source\":\"n1717543440185\",\"sourceHandle\":\"output\",\"target\":\"n1717543448599\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717543440185-output-n1717543448599-input\"}],\"viewport\":{\"x\":352.5,\"y\":809.5,\"zoom\":2},\"editorVersion\":\"4.1.1-beta.1\"}','Notify when a post is updated','Notify the site admin when a post is updated.','draft','closed','closed','','','','','2024-11-12 18:24:15','2024-11-12 18:24:15','',0,'http://localhost:60802/?p=6',0,'ppfuture_workflow','',0), +(7,0,'2024-11-12 18:24:15','0000-00-00 00:00:00','{\"nodes\":[{\"id\":\"n1717531507668\",\"type\":\"trigger\",\"position\":{\"x\":12,\"y\":12},\"data\":{\"name\":\"trigger\\/core.save-post\",\"elementaryType\":\"trigger\",\"version\":2,\"slug\":\"onSavePost1\",\"settings\":{\"postQuery\":{\"postSource\":\"custom\",\"postType\":[\"post\"],\"postId\":[],\"postStatus\":[\"publish\"]}}},\"width\":140,\"height\":65,\"selected\":false,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":284,\"x\":12,\"y\":12,\"positionAbsolute\":{\"x\":12,\"y\":12},\"dragging\":false},{\"id\":\"n1717531530334\",\"type\":\"generic\",\"position\":{\"x\":12,\"y\":252},\"data\":{\"name\":\"action\\/core.post-change-status\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"changePostStatus1\",\"settings\":{\"newStatus\":{\"newStatus\":\"publish\",\"status\":\"draft\"},\"post\":{\"variable\":\"onSavePost1.post\"}}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":12,\"y\":252},\"dragging\":false,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":333,\"x\":12,\"y\":252},{\"id\":\"n1717531533130\",\"type\":\"generic\",\"position\":{\"x\":12,\"y\":132},\"data\":{\"name\":\"advanced\\/core.schedule\",\"elementaryType\":\"advanced\",\"version\":1,\"slug\":\"schedule1\",\"settings\":{\"schedule\":{\"whenToRun\":\"offset\",\"dateSource\":\"onSavePost1.post.post_date\",\"recurrence\":\"single\",\"repeatUntil\":\"forever\",\"repeatInterval\":\"3600\",\"repeatTimes\":\"5\",\"repeatUntilDate\":\"2024-06-11T20:06:02.100Z\",\"unique\":true,\"priority\":\"10\",\"specificDate\":\"2024-06-07T20:06:02.100Z\",\"dateOffset\":\"+7 days\"}}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":12,\"y\":132},\"dragging\":false,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":335,\"x\":12,\"y\":132},{\"id\":\"n1717531536270\",\"type\":\"generic\",\"position\":{\"x\":12,\"y\":372},\"data\":{\"name\":\"action\\/core.send-email\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"sendEmail1\",\"settings\":{\"recipient\":{\"recipient\":\"global.site.admin_email\",\"custom\":\"\"}}},\"width\":140,\"height\":65,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":337,\"x\":12,\"y\":372,\"selected\":true,\"dragging\":false,\"positionAbsolute\":{\"x\":12,\"y\":372}}],\"edges\":[{\"source\":\"n1717531507668\",\"sourceHandle\":\"output\",\"target\":\"n1717531533130\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717531507668-output-n1717531533130-input\"},{\"source\":\"n1717531533130\",\"sourceHandle\":\"output\",\"target\":\"n1717531530334\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717531533130-output-n1717531530334-input\"},{\"source\":\"n1717531530334\",\"sourceHandle\":\"output\",\"target\":\"n1717531536270\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717531530334-output-n1717531536270-input\"}],\"viewport\":{\"x\":335.5,\"y\":522,\"zoom\":2},\"editorVersion\":\"4.1.1-beta.1\"}','Unpublish to Draft after a week','Change the post status to Draft a week after it was published.','draft','closed','closed','','','','','2024-11-12 18:24:15','2024-11-12 18:24:15','',0,'http://localhost:60802/?p=7',0,'ppfuture_workflow','',0), +(8,0,'2024-11-12 18:24:16','0000-00-00 00:00:00','{\"nodes\":[{\"id\":\"n1717542854679\",\"type\":\"trigger\",\"position\":{\"x\":20,\"y\":-100},\"data\":{\"name\":\"trigger\\/core.save-post\",\"elementaryType\":\"trigger\",\"version\":2,\"slug\":\"onSavePost1\",\"settings\":{\"postQuery\":{\"postSource\":\"custom\",\"postType\":[\"post\"],\"postId\":[],\"postStatus\":[\"publish\"]}}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":20,\"y\":-100},\"dragging\":false,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":284,\"x\":12,\"y\":12},{\"id\":\"n1717542934571\",\"type\":\"generic\",\"position\":{\"x\":20,\"y\":140},\"data\":{\"name\":\"action\\/core.post-change-status\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"changePostStatus1\",\"settings\":{\"newStatus\":{\"newStatus\":\"publish\",\"status\":\"draft\"},\"post\":{\"variable\":\"onSavePost1.post\"}}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":20,\"y\":140},\"dragging\":false,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":286,\"x\":12,\"y\":252},{\"id\":\"n1717542946349\",\"type\":\"generic\",\"position\":{\"x\":20,\"y\":20},\"data\":{\"name\":\"advanced\\/core.schedule\",\"elementaryType\":\"advanced\",\"version\":1,\"slug\":\"schedule1\",\"settings\":{\"schedule\":{\"whenToRun\":\"offset\",\"dateSource\":\"onSavePost1.post.post_date\",\"recurrence\":\"single\",\"repeatUntil\":\"forever\",\"repeatInterval\":\"3600\",\"repeatTimes\":\"5\",\"repeatUntilDate\":\"2024-06-11T23:16:24.422Z\",\"unique\":true,\"priority\":\"10\",\"specificDate\":\"2024-06-07T23:16:24.422Z\",\"dateOffset\":\"+15 days\"}}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":20,\"y\":20},\"dragging\":false,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":288,\"x\":12,\"y\":132},{\"id\":\"n1717543017933\",\"type\":\"generic\",\"position\":{\"x\":0,\"y\":250},\"data\":{\"name\":\"action\\/core.replace-post-terms\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"replacePostTerms1\",\"settings\":{\"taxonomyTerms\":{\"taxonomy\":\"category\",\"terms\":[]},\"post\":{\"variable\":\"onSavePost1.post\"}}},\"width\":177,\"height\":65,\"selected\":true,\"positionAbsolute\":{\"x\":0,\"y\":250},\"dragging\":false},{\"id\":\"n1717543063491\",\"type\":\"generic\",\"position\":{\"x\":20,\"y\":360},\"data\":{\"name\":\"action\\/core.send-email\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"sendEmail1\",\"settings\":{\"recipient\":{\"recipient\":\"global.site.admin_email\",\"custom\":\"\"}}},\"width\":140,\"height\":65,\"selected\":false,\"positionAbsolute\":{\"x\":20,\"y\":360},\"dragging\":false}],\"edges\":[{\"source\":\"n1717542854679\",\"sourceHandle\":\"output\",\"target\":\"n1717542946349\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"reactflow__edge-n1717542854679output-n1717542946349input\",\"sections\":[{\"id\":\"reactflow__edge-n1717542854679output-n1717542946349input_s0\",\"startPoint\":{\"x\":87,\"y\":62},\"endPoint\":{\"x\":87,\"y\":132},\"incomingShape\":\"n1717542854679\",\"outgoingShape\":\"n1717542946349\"}],\"container\":\"root\",\"selected\":false},{\"source\":\"n1717542946349\",\"sourceHandle\":\"output\",\"target\":\"n1717542934571\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717542946349-output-n1717542934571-input\",\"sections\":[{\"id\":\"n1717542946349-output-n1717542934571-input_s0\",\"startPoint\":{\"x\":87,\"y\":182},\"endPoint\":{\"x\":87,\"y\":252},\"incomingShape\":\"n1717542946349\",\"outgoingShape\":\"n1717542934571\"}],\"container\":\"root\",\"selected\":false},{\"source\":\"n1717542934571\",\"sourceHandle\":\"output\",\"target\":\"n1717543017933\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717542934571-output-n1717543017933-input\"},{\"source\":\"n1717543017933\",\"sourceHandle\":\"output\",\"target\":\"n1717543063491\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717543017933-output-n1717543063491-input\"}],\"viewport\":{\"x\":322.5,\"y\":646,\"zoom\":2},\"editorVersion\":\"4.1.1-beta.1\"}','Unpublish and change category after one week','Move the post to draft and add a category after 15 days.','draft','closed','closed','','','','','2024-11-12 18:24:16','2024-11-12 18:24:16','',0,'http://localhost:60802/?p=8',0,'ppfuture_workflow','',0), +(9,0,'2024-11-12 18:24:16','0000-00-00 00:00:00','{\"nodes\":[{\"id\":\"n1717531365606\",\"type\":\"trigger\",\"position\":{\"x\":12,\"y\":12},\"data\":{\"name\":\"trigger\\/core.save-post\",\"elementaryType\":\"trigger\",\"version\":2,\"slug\":\"onSavePost1\",\"settings\":{\"postQuery\":{\"postSource\":\"custom\",\"postType\":[\"post\"],\"postId\":[],\"postStatus\":[\"publish\"]}}},\"width\":150,\"height\":50,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":284,\"x\":12,\"y\":12,\"selected\":false,\"positionAbsolute\":{\"x\":12,\"y\":12}},{\"id\":\"n1717531386494\",\"type\":\"generic\",\"position\":{\"x\":12,\"y\":132},\"data\":{\"name\":\"advanced\\/core.schedule\",\"elementaryType\":\"advanced\",\"version\":1,\"slug\":\"schedule1\",\"settings\":{\"schedule\":{\"whenToRun\":\"offset\",\"dateSource\":\"onSavePost1.post.post_date\",\"recurrence\":\"single\",\"repeatUntil\":\"forever\",\"repeatInterval\":\"3600\",\"repeatTimes\":\"5\",\"repeatUntilDate\":\"2024-06-11T20:03:33.442Z\",\"unique\":true,\"priority\":\"10\",\"specificDate\":\"2024-06-07T20:03:33.442Z\",\"dateOffset\":\"+30 days\"}}},\"width\":150,\"height\":50,\"selected\":false,\"positionAbsolute\":{\"x\":12,\"y\":132},\"dragging\":false,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":333,\"x\":12,\"y\":132},{\"id\":\"n1717531395486\",\"type\":\"generic\",\"position\":{\"x\":12,\"y\":252},\"data\":{\"name\":\"action\\/core.add-post-terms\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"addPostTerms1\",\"settings\":{\"taxonomyTerms\":{\"taxonomy\":\"category\",\"terms\":[]},\"post\":{\"variable\":\"onSavePost1.post\"}}},\"width\":150,\"height\":50,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":335,\"x\":12,\"y\":252,\"selected\":false,\"positionAbsolute\":{\"x\":12,\"y\":252}},{\"id\":\"n1717531398637\",\"type\":\"generic\",\"position\":{\"x\":12,\"y\":372},\"data\":{\"name\":\"action\\/core.send-email\",\"elementaryType\":\"action\",\"version\":1,\"slug\":\"sendEmail1\",\"settings\":{\"recipient\":{\"recipient\":\"global.site.admin_email\",\"custom\":\"\"}}},\"width\":150,\"height\":50,\"targetPosition\":\"top\",\"sourcePosition\":\"bottom\",\"$H\":337,\"x\":12,\"y\":372,\"selected\":true,\"dragging\":false,\"positionAbsolute\":{\"x\":12,\"y\":372}}],\"edges\":[{\"source\":\"n1717531365606\",\"sourceHandle\":\"output\",\"target\":\"n1717531386494\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717531365606-output-n1717531386494-input\"},{\"source\":\"n1717531386494\",\"sourceHandle\":\"output\",\"target\":\"n1717531395486\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717531386494-output-n1717531395486-input\"},{\"source\":\"n1717531395486\",\"sourceHandle\":\"output\",\"target\":\"n1717531398637\",\"targetHandle\":\"input\",\"type\":\"genericEdge\",\"id\":\"n1717531395486-output-n1717531398637-input\"}],\"viewport\":{\"x\":325.5,\"y\":300.5,\"zoom\":2},\"editorVersion\":\"4.1.1-beta.1\"}','Add extra categories one month after publishing','Sample workflow to add extra categories one month after publishing','draft','closed','closed','','','','','2024-11-12 18:24:16','2024-11-12 18:24:16','',0,'http://localhost:60802/?p=9',0,'ppfuture_workflow','',0); /*!40000 ALTER TABLE `wp_posts` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `wp_ppfuture_actions_args` +-- + +DROP TABLE IF EXISTS `wp_ppfuture_actions_args`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_ppfuture_actions_args` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `cron_action_id` bigint unsigned NOT NULL, + `post_id` bigint unsigned NOT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT '0', + `scheduled_date` datetime NOT NULL, + `created_at` datetime NOT NULL, + `args` varchar(1000) COLLATE utf8mb4_unicode_520_ci NOT NULL, + PRIMARY KEY (`id`), + KEY `post_id` (`post_id`,`id`), + KEY `enabled_post_id` (`post_id`,`enabled`,`id`), + KEY `cron_action_id` (`cron_action_id`,`id`), + KEY `enabled_cron_action_id` (`cron_action_id`,`enabled`,`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_ppfuture_actions_args` +-- + +LOCK TABLES `wp_ppfuture_actions_args` WRITE; +/*!40000 ALTER TABLE `wp_ppfuture_actions_args` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_ppfuture_actions_args` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_ppfuture_workflow_scheduled_steps` +-- + +DROP TABLE IF EXISTS `wp_ppfuture_workflow_scheduled_steps`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_ppfuture_workflow_scheduled_steps` ( + `action_id` bigint unsigned NOT NULL, + `workflow_id` bigint unsigned NOT NULL, + `step_id` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `action_uid_hash` varchar(32) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `action_uid` varchar(400) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `is_recurring` tinyint(1) NOT NULL DEFAULT '0', + `repeat_until` set('forever','times','date') COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'forever', + `repeat_times` int NOT NULL DEFAULT '0', + `repeat_until_date` datetime DEFAULT NULL, + `uncompressed_args` varchar(10000) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `compressed_args` blob, + `is_compressed` tinyint(1) NOT NULL DEFAULT '0', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`action_id`), + KEY `workflow_id` (`workflow_id`,`action_id`), + KEY `step_id` (`step_id`,`action_id`), + KEY `action_uid_hash` (`action_uid_hash`,`action_id`), + KEY `is_recurring` (`is_recurring`,`action_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_ppfuture_workflow_scheduled_steps` +-- + +LOCK TABLES `wp_ppfuture_workflow_scheduled_steps` WRITE; +/*!40000 ALTER TABLE `wp_ppfuture_workflow_scheduled_steps` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_ppfuture_workflow_scheduled_steps` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `wp_term_relationships` -- @@ -525,8 +686,8 @@ DROP TABLE IF EXISTS `wp_term_taxonomy`; CREATE TABLE `wp_term_taxonomy` ( `term_taxonomy_id` bigint unsigned NOT NULL AUTO_INCREMENT, `term_id` bigint unsigned NOT NULL DEFAULT '0', - `taxonomy` varchar(32) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `description` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL, + `taxonomy` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL, `parent` bigint unsigned NOT NULL DEFAULT '0', `count` bigint NOT NULL DEFAULT '0', PRIMARY KEY (`term_taxonomy_id`), @@ -556,8 +717,8 @@ DROP TABLE IF EXISTS `wp_termmeta`; CREATE TABLE `wp_termmeta` ( `meta_id` bigint unsigned NOT NULL AUTO_INCREMENT, `term_id` bigint unsigned NOT NULL DEFAULT '0', - `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_520_ci, + `meta_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `meta_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci, PRIMARY KEY (`meta_id`), KEY `term_id` (`term_id`), KEY `meta_key` (`meta_key`(191)) @@ -582,8 +743,8 @@ DROP TABLE IF EXISTS `wp_terms`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `wp_terms` ( `term_id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `slug` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `slug` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', `term_group` bigint NOT NULL DEFAULT '0', PRIMARY KEY (`term_id`), KEY `slug` (`slug`(191)), @@ -612,12 +773,12 @@ DROP TABLE IF EXISTS `wp_usermeta`; CREATE TABLE `wp_usermeta` ( `umeta_id` bigint unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint unsigned NOT NULL DEFAULT '0', - `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_520_ci, + `meta_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `meta_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci, PRIMARY KEY (`umeta_id`), KEY `user_id` (`user_id`), KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -641,7 +802,12 @@ INSERT INTO `wp_usermeta` VALUES (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','1'); +(15,1,'show_welcome_panel','1'), +(16,1,'session_tokens','a:2:{s:64:\"a0db0c5d05981a01325e2ea7b029453626cc6fc2386b838517418424c5152db2\";a:4:{s:10:\"expiration\";i:1731605246;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/129.0.0.0 Safari/537.36\";s:5:\"login\";i:1731432446;}s:64:\"f8c46ffd6cf27f8216672e9cc59aeffe90039980412759037da48cc6c9544d9c\";a:4:{s:10:\"expiration\";i:1731608662;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/129.0.0.0 Safari/537.36\";s:5:\"login\";i:1731435862;}}'), +(17,1,'wp_user-settings','posts_list_mode=list&mfold=o'), +(18,1,'wp_user-settings-time','1731432444'), +(19,1,'wp_dashboard_quick_press_last_post_id','5'), +(20,1,'community-events-location','a:1:{s:2:\"ip\";s:12:\"192.168.65.0\";}'); /*!40000 ALTER TABLE `wp_usermeta` ENABLE KEYS */; UNLOCK TABLES; @@ -654,15 +820,15 @@ DROP TABLE IF EXISTS `wp_users`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `wp_users` ( `ID` bigint unsigned NOT NULL AUTO_INCREMENT, - `user_login` varchar(60) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `user_pass` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `user_nicename` varchar(50) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `user_email` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `user_url` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `user_login` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `user_pass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `user_nicename` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `user_email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `user_url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `user_activation_key` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `user_activation_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', `user_status` int NOT NULL DEFAULT '0', - `display_name` varchar(250) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `display_name` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', PRIMARY KEY (`ID`), KEY `user_login_key` (`user_login`), KEY `user_nicename` (`user_nicename`), @@ -690,4 +856,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2024-07-30 20:11:34 +-- Dump completed on 2024-11-12 18:24:38 From 16b03881803a0df019944e149e46751dfe105ccb Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 15:26:08 -0300 Subject: [PATCH 11/17] Adjust tests for WP-6.7-RC4 --- dev-workspace/docker/compose.yaml | 6 +++--- post-expirator.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dev-workspace/docker/compose.yaml b/dev-workspace/docker/compose.yaml index 62a80ccc0..46c00f228 100644 --- a/dev-workspace/docker/compose.yaml +++ b/dev-workspace/docker/compose.yaml @@ -17,7 +17,7 @@ services: - ../.cache/.composer/cache:/root/.composer/cache - ../.cache/.composer/auth.json:/root/.composer/auth.json wordpress: - image: wordpress:6.6 + image: wordpress:beta-6.7 container_name: ${COMPOSE_PROJECT_NAME}_tests_wordpress restart: always ports: @@ -31,7 +31,7 @@ services: - ../.cache/wordpress:/var/www/html/ - ../../:/var/www/html/wp-content/plugins/post-expirator - ../../tests/Support/Data/plugins/pre-tests:/var/www/html/wp-content/plugins/pre-tests - - ../../tests/Support/Data/plugins/classic-editor-v1.6.2:/var/www/html/wp-content/plugins/classic-editor + - ../../tests/Support/Data/plugins/classic-editor-v1.6.5:/var/www/html/wp-content/plugins/classic-editor depends_on: db: condition: service_healthy @@ -68,7 +68,7 @@ services: - ../.cache/wordpress:/var/www/html/ - ../../:/var/www/html/wp-content/plugins/post-expirator - ../../tests/Support/Data/plugins/pre-tests:/var/www/html/wp-content/plugins/pre-tests - - ../../tests/Support/Data/plugins/classic-editor-v1.6.2:/var/www/html/wp-content/plugins/classic-editor + - ../../tests/Support/Data/plugins/classic-editor-v1.6.5:/var/www/html/wp-content/plugins/classic-editor depends_on: - wordpress links: diff --git a/post-expirator.php b/post-expirator.php index 5b942ac4e..8ba91a69a 100644 --- a/post-expirator.php +++ b/post-expirator.php @@ -27,7 +27,7 @@ global $wp_version; $min_php_version = '7.4'; -$min_wp_version = '6.7'; +$min_wp_version = '6.7-RC4'; // If the PHP or WP version is not compatible, terminate the plugin execution. $invalid_php_version = version_compare(phpversion(), $min_php_version, '<'); From 6e3de93af458a7d19350568253329927732525f9 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 15:33:49 -0300 Subject: [PATCH 12/17] Fix tests of timezone on NY without daylight saving --- tests/Integration/Framework/System/DateTimeHandlerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/Framework/System/DateTimeHandlerTest.php b/tests/Integration/Framework/System/DateTimeHandlerTest.php index 30bb65e60..5a711b626 100644 --- a/tests/Integration/Framework/System/DateTimeHandlerTest.php +++ b/tests/Integration/Framework/System/DateTimeHandlerTest.php @@ -72,7 +72,7 @@ public function testGetCalculatedTimeWithOffsetPassingInvalidOffset(): void $dateTimeHandler->getCalculatedTimeWithOffset(time(), 'invalid offset'); } - #[Examples(['+1 month 13:00', '-4', 'America/New_York', '+1 month 17:00'])] + #[Examples(['+1 month 13:00', '-5', 'America/New_York', '+1 month 18:00'])] #[Examples(['+1 month 17:00', '0', 'UTC', '+1 month 17:00'])] #[Examples(['+1 month 18:00', '+1', 'Europe/Madrid', '+1 month 17:00'])] #[Examples(['+1 month 14:00', '-3', 'America/Sao_Paulo', '+1 month 17:00'])] From c8cf532ad72c1a51ae258bd7fed1146722634ef8 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 16:07:59 -0300 Subject: [PATCH 13/17] Improve pre-release script --- dev-workspace/scripts/pre-release.sh | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/dev-workspace/scripts/pre-release.sh b/dev-workspace/scripts/pre-release.sh index a27512c80..f142a3fa1 100644 --- a/dev-workspace/scripts/pre-release.sh +++ b/dev-workspace/scripts/pre-release.sh @@ -86,13 +86,21 @@ validate_version $version # Create branch name branch_name="release-$version" -# Create and checkout new branch -echo -e "${GREEN}Creating branch $branch_name...${NC}" -git checkout -b $branch_name +# Check if the current branch already exists. If not, create it. +if ! git show-ref --verify --quiet refs/heads/$branch_name; then + echo -e "${GREEN}Creating branch $branch_name...${NC}" + git checkout -b $branch_name +fi + +# If not in the release branch, checkout to it. +if [[ "$(git branch --show-current)" != "$branch_name" ]]; then + git checkout $branch_name +fi -# Push branch to remote -echo -e "${GREEN}Pushing branch to remote...${NC}" -git push -u origin $branch_name +# Push branch to remote, if not already pushed. +if ! git push -u origin $branch_name; then + echo -e "${GREEN}Branch $branch_name already pushed to remote.${NC}" +fi # Generate checklist checklist=$(create_checklist $version) From 5bb8af20da34e084cbd5c59e19f8f6daa9d20347 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 16:08:55 -0300 Subject: [PATCH 14/17] Improve pre-release script --- dev-workspace/scripts/pre-release.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dev-workspace/scripts/pre-release.sh b/dev-workspace/scripts/pre-release.sh index f142a3fa1..ae0513c56 100644 --- a/dev-workspace/scripts/pre-release.sh +++ b/dev-workspace/scripts/pre-release.sh @@ -102,6 +102,12 @@ if ! git push -u origin $branch_name; then echo -e "${GREEN}Branch $branch_name already pushed to remote.${NC}" fi +# Check if the github credentials are set up. +if ! gh auth status &> /dev/null; then + echo -e "${YELLOW}Warning: GitHub credentials are not set up.${NC}" + exit 1 +fi + # Generate checklist checklist=$(create_checklist $version) From ff0dc5affbf275d8d2b112c0f6c0328b527f5b76 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 16:44:50 -0300 Subject: [PATCH 15/17] Fix the pr template file --- dev-workspace/pr-template.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dev-workspace/pr-template.md b/dev-workspace/pr-template.md index 3f5d2649e..c4c84d4b6 100644 --- a/dev-workspace/pr-template.md +++ b/dev-workspace/pr-template.md @@ -2,14 +2,13 @@ To release the Free plugin version $1, ensure you complete all the tasks below. ## Pre-release Checklist -- [ ] Create the release branch as `release-$1` from the development branch. - [ ] Review and merge all relevant Pull Requests into the release branch. - [ ] Update the version number to a beta version in the main plugin file as per [tech documentation](https://rambleventures.slab.com/posts/version-numbers-58nmrk4b), and commit to the release branch. - [ ] Start a dev-workspace session. - [ ] Run `composer update` (updating root and lib vendors). - [ ] Review updated packages and mention any production library updates in the changelog. - [ ] Inspect GitHub’s Dependabot warnings or Pull Requests. Resolve any false positives, then fix and commit the remaining issues. -- [ ] If needed, build JS files for production using `composer build:js` and commit changes. +- [ ] If needed, build JS files for production using `composer build:js` and `composer build:js-dev` and commit changes. - [ ] Run a code quality check with `composer check` and fix the highlighted issues. - [ ] Update the language files with `composer gen:lang` and note this in the changelog. - [ ] For minor and patch releases, maintain backward compatibility (e.g., renamed or moved classes, namespaces, functions). Include deprecation comments and note this in the changelog. Major releases may remove deprecated code; always note this in the changelog. @@ -32,4 +31,3 @@ To release the Free plugin version $1, ensure you complete all the tasks below. ## Notes - Release version: $1 -- Created on: $(date +"%Y-%m-%d") From fa57a524fb47ed973ed6ec0db303e4ac558ce231 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 16:45:33 -0300 Subject: [PATCH 16/17] Bump version to 4.1.1 --- post-expirator.php | 4 ++-- readme.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/post-expirator.php b/post-expirator.php index 8ba91a69a..a5567898c 100644 --- a/post-expirator.php +++ b/post-expirator.php @@ -5,7 +5,7 @@ * Plugin URI: http://wordpress.org/extend/plugins/post-expirator/ * Description: PublishPress Future allows you to schedule automatic changes to posts, pages and other content types. * Author: PublishPress - * Version: 4.1.1-beta.1 + * Version: 4.1.1 * Author URI: http://publishpress.com * Text Domain: post-expirator * Domain Path: /languages @@ -51,7 +51,7 @@ } if (! defined('PUBLISHPRESS_FUTURE_VERSION')) { - define('PUBLISHPRESS_FUTURE_VERSION', '4.1.1-beta.1'); + define('PUBLISHPRESS_FUTURE_VERSION', '4.1.1'); } if (! defined('PUBLISHPRESS_FUTURE_PLUGIN_FILE')) { diff --git a/readme.txt b/readme.txt index 7ebeda875..3889445c7 100644 --- a/readme.txt +++ b/readme.txt @@ -7,7 +7,7 @@ Requires at least: 6.7 Requires PHP: 7.4 Tested up to: 6.7 License: GPLv2 or later -Stable tag: 4.1.0 +Stable tag: 4.1.1 PublishPress Future can make scheduled changes to your content. You can unpublish posts, move posts to a new status, update the categories, and more. From 0efcf468b0714865bb0416fd92de4e47e51b6fe8 Mon Sep 17 00:00:00 2001 From: Anderson Martins Date: Tue, 12 Nov 2024 16:47:21 -0300 Subject: [PATCH 17/17] Update composer files --- composer.lock | 38 +++++++++++++++---------------- lib/vendor/composer/installed.php | 4 ++-- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/composer.lock b/composer.lock index c77f2750f..5ad8785bb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6d69ca4bb4f70a5f886994dc73ca044b", + "content-hash": "e31c7d053e53cd188bd80100c04154c9", "packages": [], "packages-dev": [ { @@ -1575,16 +1575,16 @@ }, { "name": "composer/pcre", - "version": "3.3.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { @@ -1594,8 +1594,8 @@ "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.10", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", "phpunit/phpunit": "^8 || ^9" }, "type": "library", @@ -1634,7 +1634,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.1" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -1650,7 +1650,7 @@ "type": "tidelift" } ], - "time": "2024-08-27T18:44:43+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", @@ -5879,12 +5879,12 @@ "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "d606b0a8375f2519e37d0b6643b2c540f8b0811d" + "reference": "95a8c158ec6809b39fd364f24e33968b044895fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/d606b0a8375f2519e37d0b6643b2c540f8b0811d", - "reference": "d606b0a8375f2519e37d0b6643b2c540f8b0811d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/95a8c158ec6809b39fd364f24e33968b044895fb", + "reference": "95a8c158ec6809b39fd364f24e33968b044895fb", "shasum": "" }, "require": { @@ -5931,7 +5931,7 @@ "type": "github" } ], - "time": "2024-11-10T08:00:00+00:00" + "time": "2024-11-12T14:27:35+00:00" }, { "name": "sebastian/cli-parser", @@ -7349,16 +7349,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.3", + "version": "3.11.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" + "reference": "70c08f8d20c0eb4fe56f26644dd94dae76a7f450" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", - "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/70c08f8d20c0eb4fe56f26644dd94dae76a7f450", + "reference": "70c08f8d20c0eb4fe56f26644dd94dae76a7f450", "shasum": "" }, "require": { @@ -7425,7 +7425,7 @@ "type": "open_collective" } ], - "time": "2024-09-18T10:38:58+00:00" + "time": "2024-11-12T09:53:29+00:00" }, { "name": "symfony/browser-kit", @@ -12130,7 +12130,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=7.2.5", + "php": ">=7.4", "ext-json": "*" }, "platform-dev": {}, diff --git a/lib/vendor/composer/installed.php b/lib/vendor/composer/installed.php index 2708000bf..25ab61ad3 100644 --- a/lib/vendor/composer/installed.php +++ b/lib/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'c07d126336a5306c400ceda4e43d1fcaf57a093a', + 'reference' => 'fa57a524fb47ed973ed6ec0db303e4ac558ce231', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'c07d126336a5306c400ceda4e43d1fcaf57a093a', + 'reference' => 'fa57a524fb47ed973ed6ec0db303e4ac558ce231', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(),