{"id":210411,"date":"2024-11-14T09:50:28","date_gmt":"2024-11-14T09:50:28","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/bulk-content-toolkit\/"},"modified":"2026-05-20T15:00:24","modified_gmt":"2026-05-20T15:00:24","slug":"bulk-content-toolkit","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/bulk-content-toolkit\/","author":22011295,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.3","stable_tag":"1.4.3","tested":"7.0","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Bulk Content Toolkit","header_author":"tlloancy","header_description":"A comprehensive toolkit for efficiently managing bulk actions on various types of content in WordPress, including posts, pages, and custom post types.","assets_banners_color":"5796b7","last_updated":"2026-05-20 15:00:24","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/donorbox.org\/wordpress-plugins","header_plugin_uri":"","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":20,"downloads":2073,"num_ratings":1,"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":"tlloancy","date":"2024-11-14 09:50:19"},"1.0.1":{"tag":"1.0.1","author":"tlloancy","date":"2024-11-22 10:25:03"},"1.0.2":{"tag":"1.0.2","author":"tlloancy","date":"2024-11-24 04:28:01"},"1.0.3":{"tag":"1.0.3","author":"tlloancy","date":"2024-11-30 21:50:50"},"1.0.4":{"tag":"1.0.4","author":"tlloancy","date":"2024-12-01 00:18:28"},"1.0.5":{"tag":"1.0.5","author":"tlloancy","date":"2025-05-10 19:02:36"},"1.1.0":{"tag":"1.1.0","author":"tlloancy","date":"2025-08-23 14:51:47"},"1.2":{"tag":"1.2","author":"tlloancy","date":"2025-08-23 20:47:23"},"1.2.1":{"tag":"1.2.1","author":"tlloancy","date":"2025-08-23 21:08:20"},"1.2.2":{"tag":"1.2.2","author":"tlloancy","date":"2025-08-25 04:36:56"},"1.2.3":{"tag":"1.2.3","author":"tlloancy","date":"2025-08-25 14:29:36"},"1.2.4":{"tag":"1.2.4","author":"tlloancy","date":"2025-08-26 01:39:08"},"1.2.5":{"tag":"1.2.5","author":"tlloancy","date":"2025-08-26 13:50:08"},"1.2.7":{"tag":"1.2.7","author":"tlloancy","date":"2025-08-27 03:45:42"},"1.2.8":{"tag":"1.2.8","author":"tlloancy","date":"2025-08-27 13:15:54"},"1.2.9":{"tag":"1.2.9","author":"tlloancy","date":"2026-03-13 21:03:37"},"1.3.0":{"tag":"1.3.0","author":"tlloancy","date":"2026-05-09 16:50:32"},"1.4.0":{"tag":"1.4.0","author":"tlloancy","date":"2026-05-19 21:34:50"},"1.4.2":{"tag":"1.4.2","author":"tlloancy","date":"2026-05-20 14:49:58"},"1.4.3":{"tag":"1.4.3","author":"tlloancy","date":"2026-05-20 15:00:24"}},"upgrade_notice":{"1.4.1":"<ul>\n<li>Fix: Quick edit checkbox now uses a hidden input \u2014 unchecking reliably submits &#039;no&#039; instead of being silently ignored.<\/li>\n<li>Fix: LearnPress boolean fields (_lp_coming_soon and 12 others) now write &#039;&#039; for false instead of &#039;no&#039;, matching LearnPress native storage convention.<\/li>\n<li>Fix: WooCommerce boolean fields normalized to &#039;yes&#039;\/&#039;no&#039; on write.<\/li>\n<li>Fix: Switch pre-population in quick edit now updates the hidden input, not just the visual checkbox.<\/li>\n<li>Fix: Delegated click handler keeps hidden input in sync with checkbox state after user interaction.<\/li>\n<\/ul>","1.4.0":"<ul>\n<li>New: <strong>Field Search<\/strong> \u2014 live filter input above the Available Fields list on the settings page. Instantly narrows down fields by name, useful on sites with 50+ meta keys.<\/li>\n<\/ul>","1.3.0":"<p>Security release. Update immediately. Fixes unsafe redirect, SQL injection risk, missing nonce checks, and a fatal error in field type detection.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3354301,"resolution":"256x256","location":"assets","locale":"","width":560,"height":560}},"assets_banners":{"banner-772x250.gif":{"filename":"banner-772x250.gif","revision":3354301,"resolution":"772x250","location":"assets","locale":"","width":752,"height":416}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.1.0","1.2","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.7","1.2.8","1.2.9","1.3.0","1.4.0","1.4.2","1.4.3"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[11143,2010,9051,16582,286],"plugin_category":[45],"plugin_contributors":[232640],"plugin_business_model":[],"class_list":["post-210411","plugin","type-plugin","status-publish","hentry","plugin_tags-bulk-edit","plugin_tags-custom-fields","plugin_tags-meta-fields","plugin_tags-quick-edit","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-tlloancy","plugin_committers-tlloancy"],"banners":{"banner":"https:\/\/ps.w.org\/bulk-content-toolkit\/assets\/banner-772x250.gif?rev=3354301","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/bulk-content-toolkit\/assets\/icon-256x256.gif?rev=3354301","icon_2x":"https:\/\/ps.w.org\/bulk-content-toolkit\/assets\/icon-256x256.gif?rev=3354301","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Bulk Content Toolkit<\/strong> adds any custom meta field to the native WordPress Quick Edit row and Bulk Edit panel \u2014 automatically, without writing a single line of code.<\/p>\n\n<p>Most bulk edit plugins hardcode which fields they support. Bulk Content Toolkit reads your actual database and exposes every meta field that exists on your site, regardless of which plugin created it.<\/p>\n\n<p><strong>How it works<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>Settings \u2192 Bulk Edit<\/strong>.<\/li>\n<li>Pick a post type (products, courses, pages, custom types\u2026).<\/li>\n<li>Move the fields you want into the \"Selected Fields\" column.<\/li>\n<li>Save \u2014 those fields now appear in <strong>Quick Edit<\/strong> and <strong>Bulk Edit<\/strong> inside the native WordPress UI.<\/li>\n<\/ol>\n\n<p><strong>Works with everything<\/strong><\/p>\n\n<p>Because the plugin reads directly from wp_postmeta, it works with any field from any plugin \u2014 without any integration code:<\/p>\n\n<ul>\n<li>WooCommerce: _price, _sale_price, _stock_status, _manage_stock, _tax_status, and all product meta<\/li>\n<li>LearnPress: _lp_price, _lp_coming_soon, _lp_max_students, _lp_passing_condition, and all course meta<\/li>\n<li>ACF (Advanced Custom Fields): any field saved to post meta<\/li>\n<li>Elementor, WPML, Yoast SEO, and any other plugin that writes to wp_postmeta<\/li>\n<\/ul>\n\n<p><strong>Automatic field type detection<\/strong><\/p>\n\n<p>The plugin samples your existing data and infers the correct input type \u2014 checkbox, select, number, date, color, URL, textarea, and more. Common WooCommerce and LearnPress fields are hardcoded to their correct type.<\/p>\n\n<p><strong>100% native<\/strong><\/p>\n\n<p>No new UI to learn. No external spreadsheet. No CSV. Fields appear in Quick Edit and Bulk Edit exactly where WordPress users already expect them.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to \/wp-content\/plugins\/ or install via Plugins \u2192 Add New.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to Settings \u2192 Bulk Edit and select which fields to expose for each post type.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20woocommerce%20product%20fields%3F\"><h3>Does this work with WooCommerce product fields?<\/h3><\/dt>\n<dd><p>Yes. Switch the post type to \"Products\" in the settings and you will see every WooCommerce meta key \u2014 price, stock, tax status, sale dates \u2014 ready to add to your Bulk Edit panel.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20custom%20post%20types%3F\"><h3>Does this work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. All registered public post types appear in the selector automatically.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20bulk%20changes%3F\"><h3>Can I undo bulk changes?<\/h3><\/dt>\n<dd><p>The plugin does not store undo history. Use it alongside a backup plugin. The Bulk Edit panel always defaults to \"\u2014 No change \u2014\" so you cannot accidentally overwrite fields you did not intend to touch.<\/p><\/dd>\n<dt id=\"how%20does%20field%20type%20detection%20work%3F\"><h3>How does field type detection work?<\/h3><\/dt>\n<dd><p>The plugin samples existing meta values and uses an 80% vote threshold to infer the type. Common WooCommerce and LearnPress fields are hardcoded so they always render correctly.<\/p><\/dd>\n<dt id=\"what%20if%20a%20field%20shows%20the%20wrong%20input%20type%3F\"><h3>What if a field shows the wrong input type?<\/h3><\/dt>\n<dd><p>Remove the field from Selected Fields and re-add it. The plugin will re-sample your data.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Fix: WooCommerce is optional; removed WC requires at least header.<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Bump: WP V7<\/li>\n<li>Fix: Bulk edit switches no longer double-prefix field names (custom_custom__*) \u2014 mixed yes\/no now shows centered indeterminate state and saving without clicking leaves posts unchanged.<\/li>\n<li>Fix: Indeterminate switch styling via .bct-indeterminate class (works when native :indeterminate is not painted).<\/li>\n<li>Fix: PHP bulk checkbox save ignores any submitted value other than yes, no, or indeterminate.<\/li>\n<li>Improvement: More WooCommerce internal meta keys blocked from the field picker.<\/li>\n<li>Cleanup: Removed unused files (display.php, admin.js, bulk-actions.php, core-functions.php) and dead bulk-actions dropdown hooks.<\/li>\n<li>Dev: Central debug helper (bulkedittoolkit_log) \u2014 single PHPCS ignore; JS logs gated by UserScriptParams.debug (WP_DEBUG or BULKEDITTOOLKIT_DEBUG).<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Fix: Quick edit checkbox now uses a hidden input \u2014 unchecking reliably submits 'no' instead of being silently ignored.<\/li>\n<li>Fix: LearnPress boolean fields (_lp_coming_soon and 12 others) now write '' for false instead of 'no', matching LearnPress native storage convention.<\/li>\n<li>Fix: WooCommerce boolean fields normalized to 'yes'\/'no' on write.<\/li>\n<li>Fix: Switch pre-population in quick edit now updates the hidden input, not just the visual checkbox.<\/li>\n<li>Fix: Delegated click handler keeps hidden input in sync with checkbox state after user interaction.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: <strong>Field Search<\/strong> \u2014 live filter input above the Available Fields list on the settings page. Instantly narrows down fields by name, useful on sites with 50+ meta keys.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Security: Replaced all wp_redirect() with wp_safe_redirect() + exit.<\/li>\n<li>Security: Added isset() + wp_unslash() on all $_POST\/$_REQUEST accesses before sanitization.<\/li>\n<li>Security: Removed unauthenticated AJAX hook on get_bulk_edit_statuses.<\/li>\n<li>Security: Fixed SQL injection risk \u2014 table names now passed through esc_sql().<\/li>\n<li>Security: Added explicit nonce verification on the quick edit save path.<\/li>\n<li>Fix: Fatal PHP error in checkbox type detection \u2014 missing $ on variable name, checkbox auto-detection was completely broken.<\/li>\n<li>Fix: Double-prefix bug on checkbox field key in bulk save \u2014 unchecking a field in bulk edit had no effect.<\/li>\n<li>Fix: Hidden input and checkbox no longer share the same name attribute \u2014 unchecking now saves correctly.<\/li>\n<li>Fix: Select \"no change\" logic \u2014 empty string now correctly skips the field.<\/li>\n<li>Fix: date() replaced with gmdate() in 8 places to avoid runtime timezone drift.<\/li>\n<li>Fix: i18n placeholders in _n() corrected, missing translators comment added.<\/li>\n<li><strong>Mixed State Checkboxes<\/strong>: Initializes to indeterminate when selected posts have different values. Saving without touching leaves all posts unchanged.<\/li>\n<li><strong>Mixed State Selects<\/strong>: Initializes to \"\u2014 No change \u2014\" when values differ. Saving without changing leaves all posts unchanged.<\/li>\n<li><strong>Quick Edit Pre-population<\/strong>: All field types now load the post's current value when the row opens.<\/li>\n<li><strong>Column Display<\/strong>: Checkboxes show a dashicon, dates use WP date format, long text truncated at 40 chars, URLs show domain only.<\/li>\n<li><strong>Screen Options<\/strong>: Each column can be individually shown\/hidden per user via the native WP Screen Options panel.<\/li>\n<li><strong>Field Discovery<\/strong>: Rewritten with a single SQL JOIN + DISTINCT \u2014 dramatically faster on large catalogs.<\/li>\n<li><strong>Settings Cache<\/strong>: wp_cache_get\/set with 5 min TTL \u2014 settings table no longer queried on every page load.<\/li>\n<li><strong>Field Type System<\/strong>: New field-types.php centralizes known_types and blocked_keys registries.<\/li>\n<li><strong>Type Sampler<\/strong>: Rewritten with 80% vote threshold \u2014 a single outlier no longer causes a field to be mistyped.<\/li>\n<li><strong>i18n<\/strong>: All hardcoded strings replaced with English base strings via __() and esc_html_e().<\/li>\n<\/ul>\n\n<h4>1.2.9<\/h4>\n\n<ul>\n<li>Compatibility: Verified and bumped tested up to WordPress 6.9.<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>Fix: Select tag gathered with wrong method in bulk edit.<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Fix: Select and switch fields definitively handled in bulk edit.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fix: CSS was overstepping its own scope due to a bad condition.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Fix: \"No Change\" option for select fields in bulk edit now correctly prevents unintended updates.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Improvement: Clearer bulk edit interface.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: Select fields now require at least two distinct values to display as a select input.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: <strong>Known Types System<\/strong> \u2014 hardcoded map of WooCommerce and LearnPress meta keys to their correct input type.<\/li>\n<li>New: Reset and Rebuild button \u2014 remove and re-add a field to force type re-detection.<\/li>\n<li>Improvement: AJAX handling for Quick Edit reworked.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Improvement: Styling for toggle switches and select fields.<\/li>\n<li>Fix: Select fields rendering incorrectly in quick edit row.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Expose any custom meta field \u2014 from WooCommerce, LearnPress, ACF, or any plugin \u2014 directly in the native WordPress Quick Edit and Bulk Edit panels.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/210411","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=210411"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tlloancy"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=210411"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=210411"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=210411"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=210411"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=210411"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=210411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}