{"id":259154,"date":"2026-01-01T19:53:28","date_gmt":"2026-01-01T19:53:28","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/markdown-fm\/"},"modified":"2026-03-05T12:34:46","modified_gmt":"2026-03-05T12:34:46","slug":"yaml-custom-fields","status":"publish","type":"plugin","link":"https:\/\/tah.wordpress.org\/plugins\/yaml-custom-fields\/","author":15411520,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.7","stable_tag":"1.2.7","tested":"6.9.4","requires":"5.0","requires_php":"8.1","requires_plugins":null,"header_name":"YAML Custom Fields","header_author":"Silvestar Bistrovi\u0107","header_description":"A WordPress plugin for managing YAML frontmatter schemas in theme templates","assets_banners_color":"","last_updated":"2026-03-05 12:34:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/maliMirkec\/yaml-custom-fields","header_author_uri":"https:\/\/www.silvestar.codes","rating":0,"author_block_rating":0,"active_installs":0,"downloads":296,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.3":{"tag":"1.2.3","author":"starbist","date":"2026-01-01 19:56:32"},"1.2.4":{"tag":"1.2.4","author":"starbist","date":"2026-01-06 22:02:30"},"1.2.5":{"tag":"1.2.5","author":"starbist","date":"2026-01-21 10:12:38"},"1.2.6":{"tag":"1.2.6","author":"starbist","date":"2026-02-05 11:22:19"},"1.2.7":{"tag":"1.2.7","author":"starbist","date":"2026-03-05 12:34:46"}},"upgrade_notice":{"1.2.6":"<p>Important fix for code fields. HTML\/JavaScript\/CSS code is now properly preserved using base64 encoding. Re-save any code fields that previously had content stripped.<\/p>","1.2.5":"<p>Bug fix for code field sanitization. Code fields now preserve raw content correctly without premature HTML entity encoding.<\/p>","1.2.4":"<p>Asset folder reorganization for better WordPress.org compliance. All functionality remains unchanged.<\/p>","1.2.3":"<p>Bug fix for dynamic block fields. Taxonomy, post type, and data object fields now render correctly when adding blocks dynamically.<\/p>","1.2.2":"<p>Important security update with nonce verification fixes. Updated to PHP 8.1+ requirement with Symfony 6.4 compatibility.<\/p>","1.2.1":"<p>Fixes for export\/import functionality and template global field handling. Recommended update for better data portability.<\/p>","1.2.0":"<p>Major feature update introducing Template Global Fields for shared default values across posts using the same template.<\/p>","1.1.0":"<p>Code quality improvements, consolidated Export\/Import page, and enhanced security. All functionality remains backwards compatible.<\/p>","1.0.0":"<p>Initial release of YAML Custom Fields.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3430736,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.3","1.2.4","1.2.5","1.2.6","1.2.7"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Main YAML Custom Fields admin page showing page templates and template partials with enable\/disable toggles","2":"Schema editor for main page templates with YAML syntax for defining custom fields","3":"Schema editor for partial templates (headers, footers, etc.)","4":"Partial data editor for managing global content in template partials","5":"Data Validation page for reviewing imported content","6":"Data Objects page for managing structured, reusable data types","7":"Export\/Import page with consolidated export\/import functionality for settings, page data, and data objects","8":"Documentation page with comprehensive guides and examples"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2010,253139,9051,1117,31642],"plugin_category":[55],"plugin_contributors":[253140],"plugin_business_model":[],"class_list":["post-259154","plugin","type-plugin","status-publish","hentry","plugin_tags-custom-fields","plugin_tags-frontmatter","plugin_tags-meta-fields","plugin_tags-schema","plugin_tags-yaml","plugin_category-seo-and-marketing","plugin_contributors-starbist","plugin_committers-starbist"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/icon-256x256.png?rev=3430736","icon_2x":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/icon-256x256.png?rev=3430736","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>YAML Custom Fields allows you to define structured content schemas with an intuitive interface and ACF-like template functions. Perfect for theme developers who want flexible, schema-based content management without the complexity.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Define YAML schemas for page templates and template partials<\/li>\n<li>15+ field types including string, rich-text, images, blocks, taxonomies, data objects, and more<\/li>\n<li>Easy-to-use admin interface for managing schemas and data<\/li>\n<li><strong>Three-level data hierarchy:<\/strong>\n\n<ul>\n<li>Per-page data for individual customization (stored in post meta)<\/li>\n<li>Per-template global data shared across all posts using the same template<\/li>\n<li>Site-wide global data for partials like headers and footers<\/li>\n<\/ul><\/li>\n<li><strong>Per-field global\/local toggle:<\/strong> Each field can independently use template global data or page-specific data<\/li>\n<li><strong>Visual dual-field interface:<\/strong> See both template global and page-specific values side-by-side<\/li>\n<li>Data Objects for managing structured, reusable data (universities, companies, etc.)<\/li>\n<li>Data Validation page for reviewing imported content<\/li>\n<li>Consolidated Export\/Import page for all data types (settings, page data, data objects)<\/li>\n<li>Simple template functions with ACF-like syntax and auto-merge behavior<\/li>\n<li>Administrator-only access for security<\/li>\n<li>Clean uninstall removes all database records<\/li>\n<li>WordPress Coding Standards compliant<\/li>\n<\/ul>\n\n<h4>Supported Field Types<\/h4>\n\n<ul>\n<li><strong>String<\/strong> - Single-line text with min\/max length<\/li>\n<li><strong>Text<\/strong> - Multi-line textarea<\/li>\n<li><strong>Rich Text<\/strong> - WordPress WYSIWYG editor<\/li>\n<li><strong>Code<\/strong> - Code editor with syntax highlighting<\/li>\n<li><strong>Boolean<\/strong> - Checkbox for true\/false values<\/li>\n<li><strong>Number<\/strong> - Number input with min\/max constraints<\/li>\n<li><strong>Date<\/strong> - Date picker with optional time<\/li>\n<li><strong>Select<\/strong> - Dropdown with single\/multiple selection<\/li>\n<li><strong>Taxonomy<\/strong> - WordPress categories, tags, or custom taxonomies with single\/multiple selection<\/li>\n<li><strong>Post Type<\/strong> - Dropdown to select registered post types (Post, Page, custom post types)<\/li>\n<li><strong>Data Object<\/strong> - Reference to structured data objects managed independently (universities, companies, team members, etc.)<\/li>\n<li><strong>Image<\/strong> - WordPress media uploader for images<\/li>\n<li><strong>File<\/strong> - WordPress media uploader for any file<\/li>\n<li><strong>Object<\/strong> - Nested group of fields<\/li>\n<li><strong>Block<\/strong> - Repeatable blocks for flexible page builders<\/li>\n<\/ul>\n\n<h4>Usage Example<\/h4>\n\n<p>In your theme template:<\/p>\n\n<pre><code>&lt;?php\n$hero_title = ycf_get_field('hero_title');\n$hero_image = ycf_get_image('hero_image', null, 'full');\n$category = ycf_get_term('category');\n$post_type = ycf_get_post_type('content_type');\n$university = ycf_get_data_object('university');\n$features = ycf_get_field('features');\n?&gt;\n\n&lt;div class=\"hero\"&gt;\n  &lt;?php if ($hero_image): ?&gt;\n    &lt;img src=\"&lt;?php echo esc_url($hero_image['url']); ?&gt;\" alt=\"&lt;?php echo esc_attr($hero_image['alt']); ?&gt;\"&gt;\n  &lt;?php endif; ?&gt;\n  &lt;h1&gt;&lt;?php echo esc_html($hero_title); ?&gt;&lt;\/h1&gt;\n  &lt;?php if ($category): ?&gt;\n    &lt;span class=\"category\"&gt;&lt;?php echo esc_html($category-&gt;name); ?&gt;&lt;\/span&gt;\n  &lt;?php endif; ?&gt;\n  &lt;?php if ($university): ?&gt;\n    &lt;p&gt;&lt;?php echo esc_html($university['name']); ?&gt;&lt;\/p&gt;\n  &lt;?php endif; ?&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n\n<h3>Developer Documentation<\/h3>\n\n<h4>Template Functions<\/h4>\n\n<p><strong>Get a single field value:<\/strong><\/p>\n\n<pre><code>$value = ycf_get_field('field_name');\n$value = ycf_get_field('field_name', 123); \/\/ Specific post ID\n$value = ycf_get_field('logo', 'partial:header.php'); \/\/ From partial\n$value = ycf_get_field('title', null, $block); \/\/ From block context\n<\/code><\/pre>\n\n<p><strong>Get image field with details:<\/strong><\/p>\n\n<pre><code>$image = ycf_get_image('field_name', null, 'full');\n$image = ycf_get_image('field_name', 123, 'thumbnail'); \/\/ Specific post ID\n$image = ycf_get_image('icon', null, 'medium', $block); \/\/ From block context\n\n\/\/ Returns: array('id', 'url', 'alt', 'title', 'caption', 'description', 'width', 'height')\n<\/code><\/pre>\n\n<p><strong>Get file field with details:<\/strong><\/p>\n\n<pre><code>$file = ycf_get_file('field_name', null);\n$file = ycf_get_file('field_name', 123); \/\/ Specific post ID\n$file = ycf_get_file('document', null, $block); \/\/ From block context\n\n\/\/ Returns: array('id', 'url', 'path', 'filename', 'filesize', 'mime_type', 'title')\n<\/code><\/pre>\n\n<p><strong>Get taxonomy field (term or terms):<\/strong><\/p>\n\n<pre><code>$term = ycf_get_term('field_name', null);\n$term = ycf_get_term('field_name', 123); \/\/ Specific post ID\n$term = ycf_get_term('category', null, $block); \/\/ From block context\n\n\/\/ Returns: WP_Term object or array of WP_Term objects (for multiple selection)\n<\/code><\/pre>\n\n<p><strong>Get post type field:<\/strong><\/p>\n\n<pre><code>$post_type = ycf_get_post_type('field_name', null);\n$post_type = ycf_get_post_type('field_name', 123); \/\/ Specific post ID\n$post_type = ycf_get_post_type('content_type', null, $block); \/\/ From block context\n\n\/\/ Returns: WP_Post_Type object or null\n<\/code><\/pre>\n\n<p><strong>Get data object field:<\/strong><\/p>\n\n<pre><code>$university = ycf_get_data_object('field_name', null);\n$university = ycf_get_data_object('field_name', 123); \/\/ Specific post ID\n$university = ycf_get_data_object('university', null, $block); \/\/ From block context\n\n\/\/ Returns: Array with data object entry fields or null\n<\/code><\/pre>\n\n<p><strong>Get all entries of a data object type:<\/strong><\/p>\n\n<pre><code>$all_universities = ycf_get_data_objects('universities');\nforeach ($all_universities as $entry_id =&gt; $university) {\n    echo esc_html($university['name']);\n}\n\n\/\/ Returns: Array of all entries for the specified data object type\n<\/code><\/pre>\n\n<p><strong>Get all fields:<\/strong><\/p>\n\n<pre><code>$fields = ycf_get_fields();\n$fields = ycf_get_fields(123); \/\/ Specific post ID\n$fields = ycf_get_fields('partial:footer.php'); \/\/ From partial\n<\/code><\/pre>\n\n<p><strong>Check if field exists:<\/strong><\/p>\n\n<pre><code>if (ycf_has_field('hero_title')) {\n    echo ycf_get_field('hero_title');\n}\n<\/code><\/pre>\n\n<p><strong>Working with Block fields:<\/strong><\/p>\n\n<pre><code>$blocks = ycf_get_field('features');\n\nif (!empty($blocks)) {\n    foreach ($blocks as $block) {\n        \/\/ Access nested fields using context_data parameter\n        $title = ycf_get_field('title', null, $block);\n        $icon = ycf_get_image('icon', null, 'thumbnail', $block);\n        $category = ycf_get_term('category', null, $block);\n\n        echo '&lt;h3&gt;' . esc_html($title) . '&lt;\/h3&gt;';\n        if ($icon) {\n            echo '&lt;img src=\"' . esc_url($icon['url']) . '\"&gt;';\n        }\n        if ($category) {\n            echo '&lt;span&gt;' . esc_html($category-&gt;name) . '&lt;\/span&gt;';\n        }\n    }\n}\n<\/code><\/pre>\n\n<h4>Sample YAML Schema<\/h4>\n\n<pre><code>fields:\n  - name: hero_title\n    label: Hero Title\n    type: string\n    required: true\n    options:\n      maxlength: 100\n  - name: hero_image\n    label: Hero Image\n    type: image\n  - name: category\n    label: Category\n    type: taxonomy\n    options:\n      taxonomy: category\n  - name: tags\n    label: Tags\n    type: taxonomy\n    multiple: true\n    options:\n      taxonomy: post_tag\n  - name: content_type\n    label: Content Type\n    type: post_type\n  - name: university\n    label: University\n    type: data_object\n    options:\n      object_type: universities\n  - name: features\n    label: Features\n    type: block\n    list: true\n    blockKey: type\n    blocks:\n      - name: feature\n        label: Feature Block\n        fields:\n          - name: title\n            label: Title\n            type: string\n          - name: icon\n            label: Icon\n            type: image\n          - name: description\n            label: Description\n            type: text\n<\/code><\/pre>\n\n<h4>Working with Partials<\/h4>\n\n<p>For custom partials, add the @ycf marker in the file header:<\/p>\n\n<pre><code>&lt;?php\n\/**\n * Custom Navigation Partial\n * @ycf\n *\/\n<\/code><\/pre>\n\n<p>Then click \"Refresh Template List\" in the YAML Custom Fields admin page.<\/p>\n\n<h4>Template Global Fields<\/h4>\n\n<p>Template Global Fields allow you to define default values that are shared across all posts using the same template, while still allowing individual posts to override specific fields.<\/p>\n\n<p><strong>Setting up Template Global:<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>YAML Custom Fields<\/strong> admin page<\/li>\n<li>Enable YAML for your template (e.g., page.php)<\/li>\n<li>Click <strong>Add Template Global<\/strong> to define the template global schema<\/li>\n<li>Define fields that should have shared default values<\/li>\n<li>Click <strong>Manage Template Global Data<\/strong> to set the default values<\/li>\n<\/ol>\n\n<p><strong>Using Template Global in Posts:<\/strong><\/p>\n\n<p>When editing a post that uses a template with Template Global fields, you'll see a dual-field interface for each field:<\/p>\n\n<ul>\n<li><strong>Template Global (All Pages)<\/strong> - Read-only display showing the default value (with Edit link)<\/li>\n<li><strong>Page-Specific Value<\/strong> - Editable field for this post only<\/li>\n<li><strong>Checkbox<\/strong> - \"Use template global for this field\" - Toggle per field<\/li>\n<\/ul>\n\n<p><strong>Benefits:<\/strong><\/p>\n\n<ul>\n<li><strong>Consistency:<\/strong> Set default values once, use across all posts<\/li>\n<li><strong>Flexibility:<\/strong> Override any field on any post individually<\/li>\n<li><strong>Clarity:<\/strong> See both global and local values side-by-side<\/li>\n<li><strong>Efficiency:<\/strong> Update template global to affect all posts at once<\/li>\n<\/ul>\n\n<p><strong>Data Priority (when using template functions):<\/strong><\/p>\n\n<p>When a field uses template global, <code>ycf_get_field()<\/code> returns data in this priority order:<\/p>\n\n<ol>\n<li>Page-specific value (if \"use template global\" is unchecked)<\/li>\n<li>Template global value (if \"use template global\" is checked)<\/li>\n<li>Site-wide global value (if template has site-wide global enabled)<\/li>\n<li>null (if no value exists)<\/li>\n<\/ol>\n\n<h4>Data Storage<\/h4>\n\n<ul>\n<li><strong>Page\/Post data:<\/strong> Stored in post meta with key <code>_yaml_cf_data<\/code><\/li>\n<li><strong>Template Global preferences:<\/strong> Stored in post meta with key <code>_yaml_cf_use_template_global_fields<\/code> (per-field array)<\/li>\n<li><strong>Template Global schemas:<\/strong> Stored in options table with key <code>yaml_cf_template_global_schemas<\/code><\/li>\n<li><strong>Template Global data:<\/strong> Stored in options table with key <code>yaml_cf_template_global_data<\/code><\/li>\n<li><strong>Site-wide global schema:<\/strong> Stored in options table with key <code>yaml_cf_global_schema<\/code><\/li>\n<li><strong>Site-wide global data:<\/strong> Stored in options table with key <code>yaml_cf_global_data<\/code><\/li>\n<li><strong>Partial data:<\/strong> Stored in options table with key <code>yaml_cf_partial_data<\/code><\/li>\n<li><strong>Schemas:<\/strong> Stored in options table with key <code>yaml_cf_schemas<\/code><\/li>\n<li><strong>Data Object Types:<\/strong> Stored in options table with key <code>yaml_cf_data_object_types<\/code><\/li>\n<li><strong>Data Object Entries:<\/strong> Stored in options table with keys <code>yaml_cf_data_object_entries_{type_slug}<\/code><\/li>\n<\/ul>\n\n<h3>Privacy Policy<\/h3>\n\n<p>YAML Custom Fields does not collect, store, or transmit any user data outside of your WordPress installation. All data is stored locally in your WordPress database.<\/p>\n\n<h3>Third-Party Libraries<\/h3>\n\n<p>This plugin includes the following third-party libraries:<\/p>\n\n<ul>\n<li><strong>Symfony YAML Component<\/strong> (v6.4) - Licensed under MIT License (GPL-compatible)\n\n<ul>\n<li>Homepage: https:\/\/symfony.com\/components\/Yaml<\/li>\n<li>License: https:\/\/github.com\/symfony\/yaml\/blob\/7.3\/LICENSE<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h3>Credits<\/h3>\n\n<ul>\n<li>Author: <a href=\"https:\/\/www.silvestar.codes\">Silvestar Bistrovic<\/a><\/li>\n<\/ul>\n\n<h3>Support<\/h3>\n\n<p>For documentation, examples, and support, visit:\n* <a href=\"https:\/\/github.com\/maliMirkec\/yaml-custom-fields\">Plugin Documentation<\/a>\n* <a href=\"https:\/\/github.com\/maliMirkec\/yaml-custom-fields\/issues\">Report Issues<\/a><\/p>\n\n<!--section=installation-->\n<h4>From WordPress Plugin Directory<\/h4>\n\n<ol>\n<li>Log in to your WordPress admin dashboard<\/li>\n<li>Navigate to <strong>Plugins \u2192 Add New<\/strong><\/li>\n<li>Search for \"YAML Custom Fields\"<\/li>\n<li>Click <strong>Install Now<\/strong> next to the YAML Custom Fields plugin<\/li>\n<li>Click <strong>Activate<\/strong> after installation completes<\/li>\n<li>Go to <strong>YAML Custom Fields<\/strong> in the admin menu to configure your schemas<\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Download the plugin ZIP file<\/li>\n<li>Log in to your WordPress admin dashboard<\/li>\n<li>Navigate to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong><\/li>\n<li>Choose the ZIP file and click <strong>Install Now<\/strong><\/li>\n<li>Click <strong>Activate<\/strong> after installation completes<\/li>\n<li>Go to <strong>YAML Custom Fields<\/strong> in the admin menu to configure your schemas<\/li>\n<\/ol>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 5.0 or higher<\/li>\n<li>PHP 8.1 or higher<\/li>\n<li>The plugin includes all necessary dependencies<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20yaml%20frontmatter%3F\"><h3>What is YAML frontmatter?<\/h3><\/dt>\n<dd><p>YAML frontmatter is a structured way to define metadata for content. It's commonly used in static site generators and headless CMS systems. YAML Custom Fields brings this approach to WordPress themes.<\/p><\/dd>\n<dt id=\"how%20is%20this%20different%20from%20acf%3F\"><h3>How is this different from ACF?<\/h3><\/dt>\n<dd><p>While ACF is a comprehensive custom fields solution, YAML Custom Fields focuses on YAML-based schemas that are portable and version-controllable. It's ideal for developers who prefer code-first approaches and want simpler, more predictable data structures.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20with%20my%20existing%20theme%3F\"><h3>Can I use this with my existing theme?<\/h3><\/dt>\n<dd><p>Yes! YAML Custom Fields works with any WordPress theme. You define schemas for your templates and use simple PHP functions to retrieve the data in your template files.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20gutenberg%3F\"><h3>Does this work with Gutenberg?<\/h3><\/dt>\n<dd><p>Yes, YAML Custom Fields is compatible with both the Classic and Block (Gutenberg) editors. The custom fields appear below the editor regardless of which editor you're using.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens to my data if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Your data remains in the database. Only when you <strong>delete<\/strong> the plugin (not just deactivate) will it clean up all settings, schemas, and custom field data.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20for%20woocommerce%20products%3F\"><h3>Can I use this for WooCommerce products?<\/h3><\/dt>\n<dd><p>Currently, YAML Custom Fields supports pages and posts only. Support for custom post types including WooCommerce products may be added in future versions.<\/p><\/dd>\n<dt id=\"how%20do%20i%20report%20bugs%20or%20request%20features%3F\"><h3>How do I report bugs or request features?<\/h3><\/dt>\n<dd><p>Please visit the <a href=\"https:\/\/github.com\/maliMirkec\/yaml-custom-fields\">GitHub repository<\/a> to report issues or request features.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.7<\/h4>\n\n<ul>\n<li><strong>FIX: Data Object Fields in Blocks\/Objects<\/strong> - Fixed data_object fields not rendering correctly when nested inside block or object fields by adding recursive data object collection in AssetManager and DataObjectController<\/li>\n<li><strong>FIX: Attachment Data Validation<\/strong> - Fixed attachment validation logic to correctly handle the case where a schema exists but has no image\/file fields, preventing numeric values from being incorrectly cleared<\/li>\n<li><strong>FIX: Import Schema Parsing<\/strong> - Fixed data object import to parse YAML schema before validating attachment data, ensuring attachment IDs are preserved correctly during import<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li><strong>FIX: Code Field HTML Preservation<\/strong> - Code fields now use base64 encoding with a marker prefix to preserve HTML\/JavaScript\/CSS code exactly as entered, preventing WordPress sanitization from stripping tags<\/li>\n<li><strong>FIX: Code Field Re-save Protection<\/strong> - Already-encoded code fields are now preserved on re-save even if schema detection fails, preventing data loss on page refresh<\/li>\n<li><strong>NEW: Auto-decode on Frontend<\/strong> - Code field values are automatically decoded when retrieved via yaml_cf_get_field() and related functions<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li><strong>FIX: Code Field Sanitization<\/strong> - Changed filter from FILTER_SANITIZE_FULL_SPECIAL_CHARS to FILTER_UNSAFE_RAW in postRaw() to preserve raw data for schema-aware sanitization, fixing HTML entities being encoded before code fields could be properly identified<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li><strong>REFACTOR: Assets Folder Structure<\/strong> - Reorganized assets for WordPress.org compliance<\/li>\n<li><strong>IMPROVED: File Organization<\/strong> - Separated admin assets (CSS\/JS) into 'admin-assets' folder<\/li>\n<li><strong>IMPROVED: Plugin Assets<\/strong> - Moved WordPress.org assets (icons, banners, screenshots) to 'assets' folder<\/li>\n<li><strong>UPDATED: File References<\/strong> - Updated all asset paths in templates and AssetManager<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li><strong>FIX: Dynamic Block Fields<\/strong> - Fixed taxonomy, post_type, and data_object fields not rendering correctly in dynamically added blocks<\/li>\n<li><strong>NEW: JavaScript Field Handlers<\/strong> - Added missing post_type and data_object field support to JavaScript block rendering<\/li>\n<li><strong>IMPROVED: Field Type Parity<\/strong> - All field types now work identically in both static (PHP) and dynamic (JavaScript) rendering<\/li>\n<li><strong>IMPROVED: Data Localization<\/strong> - Enhanced controllers to pass taxonomy terms, post types, and data objects to JavaScript<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li><strong>UPDATED: Symfony Libraries<\/strong> - Updated Symfony YAML Component to 6.4 and Deprecation Contracts to 3.6.0 for PHP 8.1+ compatibility<\/li>\n<li><strong>SECURITY: Nonce Verification<\/strong> - Fixed GET parameter access to verify nonces before accessing other parameters<\/li>\n<li><strong>IMPROVED: Script Enqueuing<\/strong> - Converted all inline scripts to proper wp_enqueue_script usage with wp_localize_script<\/li>\n<li><strong>REQUIREMENT: PHP 8.1+<\/strong> - Minimum PHP version requirement (Symfony 6.4 LTS supports PHP 8.1+)<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li><strong>FIX: Export\/Import<\/strong> - Template global schemas and data now properly exported and imported<\/li>\n<li><strong>FIX: Page Data Export<\/strong> - Schema is now included in page data exports (form-based and AJAX)<\/li>\n<li><strong>FIX: Page Data Import<\/strong> - Now correctly handles both single-post and multi-post export formats<\/li>\n<li><strong>NEW: Template Global Readonly Display<\/strong> - Template-global-only fields now display as readonly in post editor<\/li>\n<li><strong>NEW: Auto-fallback for Template Global Fields<\/strong> - <code>ycf_get_field()<\/code> now automatically retrieves template global data<\/li>\n<li>Fixed browser autocomplete issues with template global form fields<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li><strong>NEW: Template Global Fields<\/strong> - Define shared default values for all posts using the same template<\/li>\n<li><strong>NEW: Per-field global\/local toggle<\/strong> - Each field can independently use template global or page-specific data<\/li>\n<li><strong>NEW: Dual-field interface<\/strong> - Visual side-by-side comparison of template global and page-specific values<\/li>\n<li><strong>NEW: Auto-merge data hierarchy<\/strong> - Intelligent data priority system (page &gt; template global &gt; site global)<\/li>\n<li>Enhanced post editor UI with clear visual indicators for global vs local data<\/li>\n<li>Improved field rendering system with unique IDs for dual fields<\/li>\n<li>Added per-field preferences storage for granular control<\/li>\n<li>Better reset functionality that preserves global data<\/li>\n<li>Enhanced documentation with Template Global Fields guide<\/li>\n<li>Improved admin interface organization for template management<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Improved code quality and WordPress Coding Standards compliance<\/li>\n<li>Consolidated Export\/Import functionality into single admin page<\/li>\n<li>Renamed \"Export Page Data\" to \"Export\/Import\" for clarity<\/li>\n<li>Reorganized admin menu structure (Export\/Import now positioned above Documentation)<\/li>\n<li>Enhanced database query performance with optimized caching strategy<\/li>\n<li>Implemented post tracking system for efficient cache management<\/li>\n<li>Improved input sanitization using filter_input() throughout the plugin<\/li>\n<li>Enhanced output escaping for better security<\/li>\n<li>Added production-safe logging system with WordPress hooks<\/li>\n<li>Better file upload validation and error handling<\/li>\n<li>Removed all phpcs:ignore suppressions in favor of proper WordPress coding practices<\/li>\n<li>Added phpcs.xml.dist configuration file for consistent code standards<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Support for 15+ field types<\/li>\n<li>Template and partial support<\/li>\n<li>ACF-like template functions with context_data parameter for block fields<\/li>\n<li>Taxonomy field type for categories, tags, and custom taxonomies (single\/multiple selection)<\/li>\n<li>Post Type field type for selecting registered WordPress post types<\/li>\n<li>Data Objects feature for managing structured, reusable data (universities, companies, etc.)<\/li>\n<li>Enhanced helper functions: ycf_get_field(), ycf_get_image(), ycf_get_file(), ycf_get_term(), ycf_get_post_type(), ycf_get_data_object(), ycf_get_data_objects()<\/li>\n<li>Block\/repeater functionality with context-aware field access<\/li>\n<li>WordPress media integration<\/li>\n<li>Administrator-only access<\/li>\n<li>Clean uninstall<\/li>\n<li>Clear buttons for image and file fields<\/li>\n<li>Reset All Data button for clearing all custom fields<\/li>\n<li>Confirmation alerts for destructive actions<\/li>\n<li>Copy snippet buttons for all field types with complete function signatures<\/li>\n<\/ul>","raw_excerpt":"A WordPress plugin for managing YAML frontmatter schemas in theme templates and partials.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/259154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=259154"}],"author":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/starbist"}],"wp:attachment":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=259154"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=259154"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=259154"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=259154"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=259154"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=259154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}