{"id":347581,"date":"2026-08-18T12:55:19","date_gmt":"2026-08-18T12:55:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/metabench\/"},"modified":"2026-08-18T13:05:33","modified_gmt":"2026-08-18T13:05:33","slug":"metabench","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/metabench\/","author":13753551,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"MetaBench","header_author":"Artem Lahodniuk","header_description":"A workbench for metadata. Search, filter, sort and edit custom fields for posts and terms from one fast panel.","assets_banners_color":"202736","last_updated":"2026-08-18 13:05:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/silver.od.ua\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":52,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"Silver222","date":"2026-08-18 12:55:02"},"1.0.1":{"tag":"1.0.1","author":"Silver222","date":"2026-08-18 13:05:33"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3652904,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3652904,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3652904,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3652904,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2010,2275,2994,4586,5059],"plugin_category":[],"plugin_contributors":[87170],"plugin_business_model":[],"class_list":["post-347581","plugin","type-plugin","status-publish","hentry","plugin_tags-custom-fields","plugin_tags-developer","plugin_tags-metadata","plugin_tags-post-meta","plugin_tags-term-meta","plugin_contributors-silver222","plugin_committers-silver222"],"banners":{"banner":"https:\/\/ps.w.org\/metabench\/assets\/banner-772x250.png?rev=3652904","banner_2x":"https:\/\/ps.w.org\/metabench\/assets\/banner-1544x500.png?rev=3652904","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/metabench\/assets\/icon-128x128.png?rev=3652904","icon_2x":"https:\/\/ps.w.org\/metabench\/assets\/icon-256x256.png?rev=3652904","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>MetaBench replaces the cramped core Custom Fields box with a panel built for\nsites that actually have a lot of metadata.<\/p>\n\n<ul>\n<li><strong>Search<\/strong> across both keys and values, with matches highlighted as you type.<\/li>\n<li><strong>Filter<\/strong> by value type \u2014 text, number, long text, array, JSON or empty.<\/li>\n<li><strong>Sort<\/strong> by key, by value size, or by raw database order.<\/li>\n<li><strong>Edit in place<\/strong>, with a textarea for long values and JSON editing for\nserialised arrays.<\/li>\n<li><strong>Rename, create and delete<\/strong> fields, each independently switchable.<\/li>\n<li>Works on <strong>posts and terms<\/strong>, on whichever post types and taxonomies you\nenable.<\/li>\n<li>Works in the <strong>block editor and the classic editor<\/strong> with no duplicated UI.<\/li>\n<\/ul>\n\n<h4>Permissions<\/h4>\n\n<p>For ordinary meta keys, every read and write goes through the per-key\ncapabilities that core derives from <code>register_meta()<\/code> auth callbacks. A user who\ncannot edit such a field through core cannot edit it through MetaBench either.<\/p>\n\n<p>Protected keys \u2014 those beginning with an underscore, where ACF, SEO plugins and\nWooCommerce keep their data \u2014 work differently, and the difference is worth\nunderstanding.<\/p>\n\n<pre><code>map_meta_cap() denies `edit_post_meta` on a protected key for *every* role,\n<\/code><\/pre>\n\n<p>including administrators, unless a plugin has registered an <code>auth_..._meta_...<\/code>\nfilter for that specific key. That blanket denial is aimed at untrusted REST and\nXML-RPC callers, and it makes the core capability unusable as a gate for a\ndeliberate administrative tool.<\/p>\n\n<p>MetaBench therefore gates protected keys separately. They are listed and\neditable only when <strong>both<\/strong>:<\/p>\n\n<ol>\n<li>\"Show protected fields\" is switched on in the settings, and<\/li>\n<li>the user holds <code>manage_options<\/code> (filterable via\n   metabench_protected_capability).<\/li>\n<\/ol>\n\n<p>This is an intentional step past the core denial, kept as narrow and explicit as\npossible. If you do not want that behaviour on your site, leave the setting off\n\u2014 which is the default \u2014 and MetaBench will never touch a protected key.<\/p>\n\n<h4>Translations<\/h4>\n\n<p>MetaBench ships translated into German, Spanish, French, Italian, Japanese,\nDutch, Polish, Brazilian Portuguese, Russian, Ukrainian and Simplified Chinese,\ncovering all 119 translatable strings.<\/p>\n\n<p>Every string the JavaScript panel displays is defined in PHP and handed to the\nbrowser through <code>wp_localize_script()<\/code>, so the whole interface translates from a\nsingle <code>.po<\/code> file with no JavaScript build step and no separate JSON language\npacks.<\/p>\n\n<p>To retranslate or add a locale, edit the <code>.po<\/code> file in <code>languages\/<\/code> with Poedit\nor any gettext editor, then recompile:<\/p>\n\n<pre><code>wp i18n make-mo languages\/ languages\/\nwp i18n make-php languages\/\n<\/code><\/pre>\n\n<p>After changing translatable strings in the source, regenerate the template with\n    wp i18n make-pot . languages\/metabench.pot --domain=metabench.<\/p>\n\n<h4>For developers<\/h4>\n\n<p>Filters:<\/p>\n\n<ul>\n<li><code>metabench_settings<\/code> \u2014 the effective settings array.<\/li>\n<li><code>metabench_required_capability<\/code> \u2014 the capability gating the panel.<\/li>\n<li><code>metabench_protected_capability<\/code> \u2014 the capability gating protected keys.<\/li>\n<li><code>metabench_available_post_types<\/code> \/ <code>metabench_available_taxonomies<\/code> \u2014 the\nchoices offered on the settings screen.<\/li>\n<li><code>metabench_get_items<\/code> \u2014 the rows returned for an object.<\/li>\n<li><code>metabench_validate_key<\/code> \u2014 return a <code>WP_Error<\/code> to block a write.<\/li>\n<\/ul>\n\n<p>REST routes, all under <code>metabench\/v1<\/code>:<\/p>\n\n<ul>\n<li><code>GET    \/fields\/&lt;object_type&gt;\/&lt;object_id&gt;<\/code><\/li>\n<li><code>POST   \/fields\/&lt;object_type&gt;\/&lt;object_id&gt;<\/code><\/li>\n<li><code>POST   \/fields\/&lt;object_type&gt;\/&lt;object_id&gt;\/&lt;meta_id&gt;<\/code><\/li>\n<li><code>DELETE \/fields\/&lt;object_type&gt;\/&lt;object_id&gt;\/&lt;meta_id&gt;<\/code><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>metabench<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the Plugins screen.<\/li>\n<li>Visit <strong>Settings \u2192 MetaBench<\/strong> and enable the post types and taxonomies you\nwant the panel on.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20changes%20save%20when%20i%20update%20the%20post%3F\"><h3>Do changes save when I update the post?<\/h3><\/dt>\n<dd><p>No. Each field saves immediately over the REST API, independently of the post.\nThat means you can fix one meta value without publishing unrelated draft edits,\nbut it also means there is no undo \u2014 the panel says so beneath the table.<\/p><\/dd>\n<dt id=\"why%20can%20i%20not%20see%20my%20acf%20fields%3F\"><h3>Why can I not see my ACF fields?<\/h3><\/dt>\n<dd><p>ACF stores its values in protected keys beginning with an underscore. Enable\n\"Show protected fields\" under Settings \u2192 MetaBench, and note that only users\nwith <code>manage_options<\/code> will see them. Editing those by hand can desynchronise\nACF's own field references, so change them only when you know what a key does.<\/p><\/dd>\n<dt id=\"why%20is%20one%20of%20my%20fields%20read%20only%3F\"><h3>Why is one of my fields read only?<\/h3><\/dt>\n<dd><p>Either you lack the capability for that key, or the stored value is a\nserialised PHP object. Objects cannot round-trip through the JSON editor\nwithout risking data loss, so MetaBench shows them but refuses to write them.<\/p><\/dd>\n<dt id=\"does%20it%20handle%20duplicate%20meta%20keys%3F\"><h3>Does it handle duplicate meta keys?<\/h3><\/dt>\n<dd><p>Yes. Rows are addressed by <code>meta_id<\/code>, so several rows sharing one key are\nlisted and edited individually rather than collapsed into one.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Hardened deserialization of stored meta values so a protected-key payload\ncan no longer instantiate arbitrary PHP objects on read.<\/li>\n<li>Corrected a docblock that claimed object-cache caching the code doesn't do.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"A workbench for metadata. Search, filter, sort and edit custom fields for posts and terms from one fast panel.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/347581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=347581"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/silver222"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=347581"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=347581"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=347581"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=347581"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=347581"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=347581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}