[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f92s39MAV6FAx6lUBEgghCqfnZN-iCjDFqtUAfZmnB28":3},{"slug":4,"name":5,"version":6,"author":7,"author_profile":8,"description":9,"short_description":10,"active_installs":11,"downloaded":12,"rating":11,"num_ratings":11,"last_updated":13,"tested_up_to":14,"requires_at_least":15,"requires_php":16,"tags":17,"homepage":13,"download_link":21,"security_score":22,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24,"vulnerabilities":25,"developer":26,"crawl_stats":23,"alternatives":32,"analysis":130,"fingerprints":213},"version-control-your-content","Version Control Your Content","1.0.0","Haris Amjed","https:\u002F\u002Fprofiles.wordpress.org\u002Fharisamjed\u002F","\u003Cp>The Version Control Your Content plugin provides an alternative to the native WP \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fdocumentation\u002Farticle\u002Frevisions\u002F\" rel=\"ugc\">Revisions\u003C\u002Fa> feature using Git services.\u003C\u002Fp>\n\u003Ch4>Requirements\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>A GitHub account. If you don’t have one, you can create one \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjoin\" rel=\"nofollow ugc\">here\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>A GitHub private repository. If you don’t have one, you can create one \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnew\" rel=\"nofollow ugc\">here\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>(Optional but highly recommended) A GitHub fine-grained personal access token. If you don’t have one, you can create one \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsettings\u002Ftokens\u002Fnew\" rel=\"nofollow ugc\">here\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>This plugin provides an option for version control in the following places for now:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Block Editor (Gutenberg)\u003C\u002Fli>\n\u003Cli>Classic Editor\u003C\u002Fli>\n\u003Cli>Additional CSS in the Customizer\u003C\u002Fli>\n\u003Cli>Default Settings pages in WP Admin\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>On all supported pages, you will see a “Version Control” box, and you can activate or deactivate it for that page. It will also show you the real-time GitHub API usage in the top admin bar.\u003C\u002Fp>\n\u003Cp>This solution will put minimal load on your server because there will be no database entries, no complex SQL operations, and only simple JavaScript-based API calls to external Git services.\u003C\u002Fp>\n\u003Ch4>How it works behind the scenes?\u003C\u002Fh4>\n\u003Col>\n\u003Cli>When you submit any HTML form, such as saving a post, it captures the form data via JavaScript before sending it to the server backend.\u003C\u002Fli>\n\u003Cli>It sanitizes the data and converts it to JSON format (if needed).\u003C\u002Fli>\n\u003Cli>It sends that JSON or HTML data to your Git repository via a commit.\u003C\u002Fli>\n\u003Cli>In this way, all your changes will be new commits in your Git repo in related JSON or HTML files.\u003C\u002Fli>\n\u003Cli>In the commits box, a list of all commits will be shown. It will also provide an option to view the changes or revert to that version.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Planned Upcoming Features\u003C\u002Fh4>\n\u003Cp>Currently, I have developed it for three views as described above, and the following features will be added in the future:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Integration with page builders like Elementor, Divi, Beaver Builder, WPBakery, etc.\u003C\u002Fli>\n\u003Cli>Integration with WooCommerce\u003C\u002Fli>\n\u003Cli>Integration with BuddyPress\u003C\u002Fli>\n\u003Cli>Integration with bbPress\u003C\u002Fli>\n\u003Cli>Integration with WPML, etc.\u003C\u002Fli>\n\u003C\u002Ful>\n","Provides an alternative to the native WP Revisions feature using Git services. Also works for Additional CSS and wp-admin Settings pages.",0,423,"","6.7.5","5.6","7.2",[18,19,20],"git","github","version-control","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fversion-control-your-content.1.0.0.zip",100,null,"2026-03-15T10:48:56.248Z",[],{"slug":27,"display_name":7,"profile_url":8,"plugin_count":28,"total_installs":11,"avg_security_score":22,"avg_patch_time_days":29,"trust_score":30,"computed_at":31},"harisamjed",1,30,94,"2026-04-04T11:17:37.644Z",[33,50,65,86,109],{"slug":34,"name":35,"version":36,"author":37,"author_profile":38,"description":39,"short_description":40,"active_installs":41,"downloaded":42,"rating":11,"num_ratings":11,"last_updated":13,"tested_up_to":43,"requires_at_least":44,"requires_php":13,"tags":45,"homepage":48,"download_link":49,"security_score":22,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24},"wp-github-sync-meta","WP GitHub Sync Meta","1.2","lite3","https:\u002F\u002Fprofiles.wordpress.org\u002Flite3\u002F","\u003Cp>\u003Cem>A WordPress plugin to sync meta, tags and categories with a GitHub via wp-github-sync\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>This plugin Requires \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fwp-github-sync\u002F\" rel=\"ugc\">WordPress guithub Sync\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>Related Links:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"http:\u002F\u002Fwww.litefeel.com\u002F\" title=\"Author For WP GitHub Sync Meta\" rel=\"nofollow ugc\">Author Homepage\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flite3\u002Fwp-github-sync-meta\" title=\"On GitHub\" rel=\"nofollow ugc\">On GitHub\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n","A WordPress plugin to sync meta, tags and categories with a GitHub via wp-github-sync",10,1378,"4.7.32","4.2",[46,47,18,19,20],"collaboration","content","https:\u002F\u002Fgithub.com\u002Flite3\u002Fwp-github-sync-meta","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fwp-github-sync-meta.1.2.zip",{"slug":51,"name":52,"version":53,"author":54,"author_profile":55,"description":56,"short_description":57,"active_installs":41,"downloaded":58,"rating":30,"num_ratings":59,"last_updated":13,"tested_up_to":60,"requires_at_least":61,"requires_php":13,"tags":62,"homepage":63,"download_link":64,"security_score":22,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24},"writing-on-github","Writing On GitHub","1.11","litefeel","https:\u002F\u002Fprofiles.wordpress.org\u002Flitefeel\u002F","\u003Cp>\u003Cem>A WordPress plugin to allow you writing on GitHub (or Jekyll site).\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>Some code for this plugin comes from \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FmAAdhaTTah\u002Fwordpress-github-sync\" rel=\"nofollow ugc\">WordPress GitHub Sync\u003C\u002Fa>, thanks.\u003C\u002Fp>\n\u003Cp>Ever wish you could collaboratively author content for your WordPress site (or expose change history publicly and accept pull requests from your readers)?\u003C\u002Fp>\n\u003Cp>Well, now you can! Introducing \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flitefeel\u002Fwriting-on-github\" rel=\"nofollow ugc\">Writing On GitHub\u003C\u002Fa>!\u003C\u002Fp>\n\u003Ch4>Writing On GitHub does three things:\u003C\u002Fh4>\n\u003Col>\n\u003Cli>Allows content publishers to version their content in GitHub\u003C\u002Fli>\n\u003Cli>Allows readers to submit proposed improvements to WordPress-served content via GitHub’s Pull Request model\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Writing On GitHub might be able to do some other cool things:\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Allow teams to collaboratively write and edit posts using GitHub (e.g., pull requests, issues, comments)\u003C\u002Fli>\n\u003Cli>Allow you to sync the content of two different WordPress installations via GitHub\u003C\u002Fli>\n\u003Cli>Allow you to stage and preview content before “deploying” to your production server\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>How it works\u003C\u002Fh4>\n\u003Cp>The sync action is based on two hooks:\u003C\u002Fp>\n\u003Col>\n\u003Cli>A per-post sync fired in response to WordPress’s \u003Ccode>save_post\u003C\u002Fcode> hook which pushes content to GitHub\u003C\u002Fli>\n\u003Cli>A sync of all changed files triggered by GitHub’s \u003Ccode>push\u003C\u002Fcode> webhook (outbound API call)\u003C\u002Fli>\n\u003C\u002Fol>\n","A WordPress plugin to allow you writing on GitHub (or Jekyll site).",2602,3,"5.4.19","3.9",[46,47,18,19,20],"https:\u002F\u002Fgithub.com\u002Flitefeel\u002Fwriting-on-github","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fwriting-on-github.zip",{"slug":66,"name":67,"version":68,"author":69,"author_profile":70,"description":71,"short_description":72,"active_installs":73,"downloaded":74,"rating":75,"num_ratings":76,"last_updated":77,"tested_up_to":78,"requires_at_least":79,"requires_php":13,"tags":80,"homepage":83,"download_link":84,"security_score":22,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":85},"github-embed","Github Embed","2.2.1","Lee Willis","https:\u002F\u002Fprofiles.wordpress.org\u002Fleewillis77\u002F","\u003Cp>Plugin that allows you to embed details from GitHub just by pasting in the URL as you would any other embed source. Currently supports:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Repositories\u003C\u002Fli>\n\u003Cli>User profiles\u003C\u002Fli>\n\u003Cli>Project milestone summaries\u003C\u002Fli>\n\u003Cli>Project contributors\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Coming soon:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Gists…\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The plugin provides very basic styling, but adds classes so you can style as you see fit. If anyone has some ideas for a better default stylesheet – pull requests welcome!\u003C\u002Fp>\n\u003Cp>The main development is all going on on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fleewillis77\u002Fwp-github-oembed\" rel=\"nofollow ugc\">GitHub\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3>Treeware\u003C\u002Fh3>\n\u003Cp>You’re free to use this package for free, but if it makes it to your production environment please \u003Ca href=\"https:\u002F\u002Foffset.earth\u002Fademtisoftware?gift-trees\" rel=\"nofollow ugc\">buy the world a tree\u003C\u002Fa>.\u003C\u002Fp>\n","Plugin that allows you to embed details from GitHub just by pasting in the URL as you would any other embed source. Currently supports:",1000,28316,78,14,"2025-12-02T09:44:00.000Z","6.9.4","6.2",[81,19,82],"embed","oembed","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fgithub-embed\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fgithub-embed.2.2.1.zip","2026-03-15T15:16:48.613Z",{"slug":87,"name":88,"version":89,"author":90,"author_profile":91,"description":92,"short_description":93,"active_installs":94,"downloaded":95,"rating":22,"num_ratings":96,"last_updated":97,"tested_up_to":78,"requires_at_least":98,"requires_php":13,"tags":99,"homepage":104,"download_link":105,"security_score":106,"vuln_count":107,"unpatched_count":11,"last_vuln_date":108,"fetched_at":85},"wp-plugin-info-card","WP Plugin Info Card","6.3.0","Brice Capobianco","https:\u002F\u002Fprofiles.wordpress.org\u002Fbrikou\u002F","\u003Cp>Plugin Info Card displays plugins & themes data in beautiful cards using WP Plugin & Theme APIs. It has five blocks, five shortcodes, support for custom third-party plugins, Easy Digital Downloads, and GitHub Info Cards.\u003C\u002Fp>\n\u003Cspan class=\"embed-youtube\" style=\"text-align:center; display: block;\">\u003Ciframe loading=\"lazy\" class=\"youtube-player\" width=\"750\" height=\"422\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8eKDCEoXGKU?version=3&rel=0&showsearch=0&showinfo=1&iv_load_policy=1&fs=1&hl=en-US&autohide=2&wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\">\u003C\u002Fiframe>\u003C\u002Fspan>\n\u003Ch4>How does it work?\u003C\u002Fh4>\n\u003Cp>This thirteen minute video gives you an extensive overview on how WP Plugin Info Card works.\u003C\u002Fp>\n\u003Cspan class=\"embed-youtube\" style=\"text-align:center; display: block;\">\u003Ciframe loading=\"lazy\" class=\"youtube-player\" width=\"750\" height=\"422\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FaPcU27-R6lU?version=3&rel=0&showsearch=0&showinfo=1&iv_load_policy=1&fs=1&hl=en-US&autohide=2&wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\">\u003C\u002Fiframe>\u003C\u002Fspan>\n\u003Cp>WP Plugin Info Card lets you display plugins & themes identity cards in a beautiful box with a smooth 3D rotation effect, or in a more large and responsive layout.\u003C\u002Fp>\n\u003Cp>It uses WordPress.org plugins API & themes API to fetch data. All you need to do is provide a valid plugin\u002Ftheme ID (slug name), and then insert the shortcode in any page to make it work at once!\u003C\u002Fp>\n\u003Cp>This plugin is very light and includes scripts and CSS only if and when required (you can force scripts enqueuing in admin settings). The shortcode may be added anywhere shortcodes are supported within your theme.\u003C\u002Fp>\n\u003Cp>The plugin also uses WordPress transients to store data returned by the API for 12 hours (720min by default), so your page loading time will not be increased due to too many requests.\u003C\u002Fp>\n\u003Cp>The dashboard widget is very easy to set up: you simply add as many plugins and themes as you want in the admin page and they become visible in your dashboard. Fields are added on-the-fly and are sortable via drag-and-drop.\u003C\u002Fp>\n\u003Cp>It is perfect to keep track of your own plugins and themes!\u003C\u002Fp>\n\u003Ch4>Quick Links (Shortcode Documentation)\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fshortcodes\u002Fwp-pic\" rel=\"nofollow ugc\">[wp-pic] shortcode and parameters\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fshortcodes\u002Fwp-pic-query\" rel=\"nofollow ugc\">[wp-pic-query] shortcode and parameters\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fshortcodes\u002Fwp-pic-site-plugins\" rel=\"nofollow ugc\">[wp-pic-site-plugins] shortcode and parameters\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fshortcodes\u002Fwp-pic-plugin-screenshots\" rel=\"nofollow ugc\">[wp-pic-plugin-screenshots\u003Cbr \u002F>\n] shortcode and parameters\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.dlxplugins.com\u002Fwp-plugin-info-card\u002Fshortcodes\u002Fgithub-info-card\" rel=\"nofollow ugc\">[github-info-card] shortcode and parameters\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.dlxplugins.com\u002Fwp-plugin-info-card\u002Fshortcodes\u002Fwp-pic-badges\" rel=\"nofollow ugc\">[wp-pic-badges] shortcode and parameters\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Quick Links (Block Documentation)\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fblocks\u002Fwp-plugin-info-card-block\" rel=\"nofollow ugc\">WP Plugin Info Card block\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fblocks\u002Fwp-plugin-info-card-query-block\" rel=\"nofollow ugc\">WP Plugin Info Card Query block\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fblocks\u002Fsite-plugins-card-grid\" rel=\"nofollow ugc\">Site Plugins Card Grid block\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Fblocks\u002Fplugin-screenshots-info-card\" rel=\"nofollow ugc\">WP Plugin Info Card Plugin Screenshots block\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.dlxplugins.com\u002Fwp-plugin-info-card\u002Fblocks\u002Fthe-github-info-cards-block\" rel=\"nofollow ugc\">GitHub Info Cards Grid block\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.dlxplugins.com\u002Fwp-plugin-info-card\u002Fblocks\u002Fbadges-block\" rel=\"nofollow ugc\">Profile Badges Block\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwppic.dlxplugins.com\u002Foverview\u002Feasy-digital-downloads-integration\" rel=\"nofollow ugc\">Easy Digital Downloads integration\u003C\u002Fa> is now available as part of the free plugin. Show off your EDD plugins too!\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fdocs.dlxplugins.com\u002Fwp-plugin-info-card\u002Foverview\u002Fcustom-plugin-cards\" rel=\"nofollow ugc\">Custom Third-Party plugins\u003C\u002Fa> are available as well.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Ca href=\"http:\u002F\u002Fb-website.com\u002Fwp-envato-affiliate-card-powered-envato-market-api\" title=\"WP Envato Affiliate Card\" rel=\"nofollow ugc\">PREMIUM ADD-ON – WP Envato Affiliate Card\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch4>Languages\u003C\u002Fh4>\n\u003Cp>Please \u003Ca href=\"https:\u002F\u002Ftranslate.wordpress.org\u002Fprojects\u002Fwp-plugins\u002Fwp-plugin-info-card\" rel=\"nofollow ugc\">contribute a translation on the plugin translation page\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch4>GitHub\u003C\u002Fh4>\n\u003Cp>Feel free to make pull requests or issues on the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdlxplugins\u002Fwp-plugin-info-card\" rel=\"nofollow ugc\">WP Plugin Info Card GitHub account\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Credits: Originally developed and maintained by \u003Ca href=\"https:\u002F\u002Fwww.b-website.com\u002F\" rel=\"nofollow ugc\">Brice CAPOBIANCO\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch4>How can I report security bugs?\u003C\u002Fh4>\n\u003Cp>You can report security bugs through the Patchstack Vulnerability Disclosure Program. The Patchstack team help validate, triage and handle any security vulnerabilities. \u003Ca href=\"https:\u002F\u002Fpatchstack.com\u002Fdatabase\u002Fvdp\u002Fwp-plugin-info-card\" rel=\"nofollow ugc\">Report a security vulnerability.\u003C\u002Fa>\u003C\u002Fp>\n","Plugin Info Card displays plugins & themes data in beautiful cards using WP APIs. Custom plugins, EDD, and GitHub Info Cards are supported.",600,48024,23,"2026-02-05T22:15:00.000Z","6.5",[100,101,102,19,103],"card","cards","edd","grid","https:\u002F\u002Fdlxplugins.com\u002Fplugins\u002Fplugin-info-card\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fwp-plugin-info-card.6.3.0.zip",95,4,"2026-02-17 17:12:43",{"slug":110,"name":111,"version":112,"author":113,"author_profile":114,"description":115,"short_description":116,"active_installs":117,"downloaded":118,"rating":119,"num_ratings":120,"last_updated":121,"tested_up_to":78,"requires_at_least":122,"requires_php":16,"tags":123,"homepage":128,"download_link":129,"security_score":22,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":85},"jekyll-exporter","Static Site Exporter","3.1.1","Ben Balter","https:\u002F\u002Fprofiles.wordpress.org\u002Fbenbalter\u002F","\u003Ch3>Features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Converts all posts, pages, and settings from WordPress to Markdown and YAML for use in Jekyll (or Hugo or any other Markdown and YAML based site engine)\u003C\u002Fli>\n\u003Cli>Export what your users see, not what the database stores (runs post content through \u003Ccode>the_content\u003C\u002Fcode> filter prior to export, allowing third-party plugins to modify the output)\u003C\u002Fli>\n\u003Cli>Converts all \u003Ccode>post_content\u003C\u002Fcode> to Markdown\u003C\u002Fli>\n\u003Cli>Converts all \u003Ccode>post_meta\u003C\u002Fcode> and fields within the \u003Ccode>wp_posts\u003C\u002Fcode> table to YAML front matter for parsing by Jekyll\u003C\u002Fli>\n\u003Cli>Generates a \u003Ccode>_config.yml\u003C\u002Fcode> with all settings in the \u003Ccode>wp_options\u003C\u002Fcode> table\u003C\u002Fli>\n\u003Cli>Outputs a single zip file with \u003Ccode>_config.yml\u003C\u002Fcode>, pages, and \u003Ccode>_posts\u003C\u002Fcode> folder containing \u003Ccode>.md\u003C\u002Fcode> files for each post in the proper Jekyll naming convention\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Selective export\u003C\u002Fstrong>: Export only specific categories, tags, or post types using WP-CLI\u003C\u002Fli>\n\u003Cli>No settings. Just a single click.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Usage\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Place plugin in \u003Ccode>\u002Fwp-content\u002Fplugins\u002F\u003C\u002Fcode> folder\u003C\u002Fli>\n\u003Cli>Activate plugin in WordPress dashboard\u003C\u002Fli>\n\u003Cli>Select \u003Ccode>Export to Jekyll\u003C\u002Fcode> from the \u003Ccode>Tools\u003C\u002Fcode> menu\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>More information\u003C\u002Fh3>\n\u003Cp>See \u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\" rel=\"nofollow ugc\">the full documentation\u003C\u002Fa>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002Fdocs\u002Fchangelog\u002F\" rel=\"nofollow ugc\">Changelog\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002Fdocs\u002Fcommand-line-usage\u002F\" rel=\"nofollow ugc\">Command-line-usage\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002Fdocs\u002Fselective-export\u002F\" rel=\"nofollow ugc\">Selective export by category or tag\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002Fdocs\u002Fcustom-post-types\u002F\" rel=\"nofollow ugc\">Custom post types\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002Fdocs\u002Fcustom-fields\u002F\" rel=\"nofollow ugc\">Custom fields\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002Fdocs\u002Fdeveloping-locally\u002F\" rel=\"nofollow ugc\">Developing locally\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002Fdocs\u002Frequired-php-version\u002F\" rel=\"nofollow ugc\">Minimum required PHP version\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Security Policy\u003C\u002Fh3>\n\u003Cp>To report a security vulnerability, please email \u003Ca href=\"mailto:ben@balter.com\" rel=\"nofollow ugc\">ben@balter.com\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3>Where to get help or report an issue\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>For getting started and general documentation, please browse, and feel free to contribute to \u003Ca href=\"http:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F\" rel=\"nofollow ugc\">the project documentation\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>For support questions (“How do I”, “I can’t seem to”, etc.) please search and if not already answered, open a thread in the \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fsupport\u002Fplugin\u002Fjekyll-exporter\" rel=\"ugc\">Support Forums\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>For technical issues (e.g., to submit a bug or feature request) please search and if not already filed, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbenbalter\u002F\u002Fwordpress-to-jekyll-exporter\u002Fissues\" rel=\"nofollow ugc\">open an issue on GitHub\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Things to check before reporting an issue\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Are you using the latest version of WordPress?\u003C\u002Fli>\n\u003Cli>Are you using the latest version of the plugin?\u003C\u002Fli>\n\u003Cli>Does the problem occur even when you deactivate all plugins and use the default theme?\u003C\u002Fli>\n\u003Cli>Have you tried deactivating and reactivating the plugin?\u003C\u002Fli>\n\u003Cli>Has your issue \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbenbalter\u002Fwordpress-to-jekyll-exporter\u002Fissues\" rel=\"nofollow ugc\">already been reported\u003C\u002Fa>?\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>What to include in an issue\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>What steps can another user take to recreate the issue?\u003C\u002Fli>\n\u003Cli>What is the expected outcome of that action?\u003C\u002Fli>\n\u003Cli>What is the actual outcome of that action?\u003C\u002Fli>\n\u003Cli>Are there any screenshots or screencasts that may be helpful to include?\u003C\u002Fli>\n\u003Cli>Only include one bug per issue. If you have discovered two bugs, please file two issues.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Command-line Usage\u003C\u002Fh3>\n\u003Cp>If you’re having trouble with your web server timing out before the export is complete, or if you just like terminal better, you may enjoy the command-line tool.\u003C\u002Fp>\n\u003Cp>It works just like the plugin, but produces the zipfile on STDOUT:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>php jekyll-export-cli.php > jekyll-export.zip\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>If using this method, you must run first \u003Ccode>cd\u003C\u002Fcode> into the wordpress-to-jekyll-exporter directory.\u003C\u002Fp>\n\u003Cp>Alternatively, if you have \u003Ca href=\"http:\u002F\u002Fwp-cli.org\" rel=\"nofollow ugc\">WP-CLI\u003C\u002Fa> installed, you can run:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>wp jekyll-export > export.zip\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>The WP-CLI version will provide greater compatibility for alternate WordPress environments, such as when \u003Ccode>wp-content\u003C\u002Fcode> isn’t in the usual location.\u003C\u002Fp>\n\u003Ch3>Filtering by Category or Tag\u003C\u002Fh3>\n\u003Cp>You can export only specific categories or tags using the WP-CLI command. This is useful when you want to convert just one section of your WordPress site instead of the entire corpus.\u003C\u002Fp>\n\u003Ch4>Export posts from a specific category:\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>`bash\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>wp jekyll-export –category=technology > export.zip\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch4>Export posts from multiple categories:\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>`bash\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>wp jekyll-export –category=tech,news,updates > export.zip\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch4>Export posts with a specific tag:\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>`bash\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>wp jekyll-export –tag=featured > export.zip\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch4>Export only pages (or specific post types):\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>`bash\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>wp jekyll-export –post_type=page > export.zip\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch4>Combine filters:\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>`bash\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>wp jekyll-export –category=technology –tag=featured –post_type=post > export.zip\u003Cbr \u002F>\n    \u003Ccode>\u003Ch3>Using Filters in PHP\u003C\u002Fh3>\u003Cbr \u002F>\nIf you're using the plugin via PHP code or want more control, you can use the\u003C\u002Fcode>jekyll_export_taxonomy_filters` filter:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>add_filter( ‘jekyll_export_taxonomy_filters’, function() {\u003Cbr \u002F>\n    return array(\u003Cbr \u002F>\n        ‘category’ => array( ‘technology’, ‘science’ ),\u003Cbr \u002F>\n        ‘post_tag’ => array( ‘featured’ ),\u003Cbr \u002F>\n    );\u003Cbr \u002F>\n} );\u003C\u002Fp>\n\u003Cp>\u002F\u002F Then trigger the export\u003Cbr \u002F>\nglobal $jekyll_export;\u003Cbr \u002F>\n$jekyll_export->export();\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch3>Custom fields\u003C\u002Fh3>\n\u003Cp>When using custom fields (e.g. with the Advanced Custom fields plugin) you might have to register a filter to convert array style configs to plain values.\u003C\u002Fp>\n\u003Ch4>Available Filters\u003C\u002Fh4>\n\u003Cp>The plugin provides two filters for customizing post metadata:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>jekyll_export_meta\u003C\u002Fcode>\u003C\u002Fstrong>: Filters the metadata for a single post before it’s merged with taxonomy terms. Receives \u003Ccode>$meta\u003C\u002Fcode> array as the only parameter.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>jekyll_export_post_meta\u003C\u002Fcode>\u003C\u002Fstrong>: Filters the complete metadata array (including taxonomy terms) just before it’s written to the YAML frontmatter. Receives \u003Ccode>$meta\u003C\u002Fcode> array and \u003Ccode>$post\u003C\u002Fcode> object as parameters. This is the recommended filter for most use cases.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Note:\u003C\u002Fstrong> As of the latest version, the plugin no longer automatically removes empty or falsy values from the frontmatter. All metadata is preserved by default. If you want to remove certain fields, you can use the \u003Ccode>jekyll_export_post_meta\u003C\u002Fcode> filter to customize this behavior.\u003C\u002Fp>\n\u003Cp>By default, the plugin saves custom fields in an array structure that is exported as:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>[“my-bool”]=>\u003Cbr \u002F>\n    array(1) {\u003Cbr \u002F>\n        [0] => string(1) “1”\u003Cbr \u002F>\n    }\u003Cbr \u002F>\n[“location”]=>\u003Cbr \u002F>\n    array(1) {\u003Cbr \u002F>\n        [0] => string(88) “My address”\u003Cbr \u002F>\n    }\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>And this leads to a YAML structure like:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`yaml\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>my-bool:\u003Cbr \u002F>\n– “1”\u003Cbr \u002F>\nlocation:\u003Cbr \u002F>\n– ‘My address’\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>This is likely not the structure you expect or want to work with. You can convert it using a filter:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>add_filter( ‘jekyll_export_meta’, function($meta) {\u003Cbr \u002F>\n    foreach ($meta as $key => $value) {\u003Cbr \u002F>\n        if (is_array($value) && count($value) === 1 && array_key_exists(0, $value)) {\u003Cbr \u002F>\n            $meta[$key] = $value[0];\u003Cbr \u002F>\n        }\u003Cbr \u002F>\n    }\u003C\u002Fp>\n\u003Cpre>\u003Ccode>return $meta;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>});\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>A more complete solution could look like that:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>add_filter( ‘jekyll_export_meta’, function($meta) {\u003Cbr \u002F>\n    foreach ($meta as $key => $value) {\u003Cbr \u002F>\n        \u002F\u002F Advanced Custom Fields\u003Cbr \u002F>\n        if (is_array($value) && count($value) === 1 && array_key_exists(0, $value)) {\u003Cbr \u002F>\n            $value = maybe_unserialize($value[0]);\u003Cbr \u002F>\n            \u002F\u002F Advanced Custom Fields: NextGEN Gallery Field add-on\u003Cbr \u002F>\n            if (is_array($value) && count($value) === 1 && array_key_exists(0, $value)) {\u003Cbr \u002F>\n                $value = $value[0];\u003Cbr \u002F>\n            }\u003Cbr \u002F>\n        }\u003Cbr \u002F>\n        \u002F\u002F convert types\u003Cbr \u002F>\n        $value = match ($key) {\u003Cbr \u002F>\n            \u002F\u002F Advanced Custom Fields: “true_false” type\u003Cbr \u002F>\n            ‘my-bool’ => (bool) $value,\u003Cbr \u002F>\n            default => $value\u003Cbr \u002F>\n        };\u003Cbr \u002F>\n        $meta[$key] = $value;\u003Cbr \u002F>\n    }\u003C\u002Fp>\n\u003Cpre>\u003Ccode>return $meta;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>});\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch4>Removing Empty or Falsy Values\u003C\u002Fh4>\n\u003Cp>If you want to remove empty or falsy values from the frontmatter (similar to the pre-3.0.3 behavior), you can use the \u003Ccode>jekyll_export_post_meta\u003C\u002Fcode> filter:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>add_filter( ‘jekyll_export_post_meta’, function( $meta, $post ) {\u003Cbr \u002F>\n    foreach ( $meta as $key => $value ) {\u003Cbr \u002F>\n        \u002F\u002F Remove falsy values except numeric 0\u003Cbr \u002F>\n        if ( ! is_numeric( $value ) && ! $value ) {\u003Cbr \u002F>\n            unset( $meta[ $key ] );\u003Cbr \u002F>\n        }\u003Cbr \u002F>\n    }\u003Cbr \u002F>\n    return $meta;\u003Cbr \u002F>\n}, 10, 2 );\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch3>Custom post types\u003C\u002Fh3>\n\u003Cp>To export custom post types, you’ll need to add a filter (w.g. to your themes config file) to do the following:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>add_filter( ‘jekyll_export_post_types’, function() {\u003Cbr \u002F>\n    return array(‘post’, ‘page’, ‘you-custom-post-type’);\u003Cbr \u002F>\n});\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>The custom post type will be exported as a Jekyll collection. You’ll need to initialize it in the resulting Jekyll site’s \u003Ccode>_config.yml\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Developing locally\u003C\u002Fh3>\n\u003Ch4>Option 1: Using Dev Containers (Recommended)\u003C\u002Fh4>\n\u003Cp>The easiest way to get started is using \u003Ca href=\"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers\" rel=\"nofollow ugc\">VS Code Dev Containers\u003C\u002Fa> or \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Fcodespaces\" rel=\"nofollow ugc\">GitHub Codespaces\u003C\u002Fa>:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Install \u003Ca href=\"https:\u002F\u002Fcode.visualstudio.com\u002F\" rel=\"nofollow ugc\">VS Code\u003C\u002Fa> and the \u003Ca href=\"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=ms-vscode-remote.remote-containers\" rel=\"nofollow ugc\">Dev Containers extension\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ccode>git clone https:\u002F\u002Fgithub.com\u002Fbenbalter\u002Fwordpress-to-jekyll-exporter\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Open the folder in VS Code\u003C\u002Fli>\n\u003Cli>Click “Reopen in Container” when prompted\u003C\u002Fli>\n\u003Cli>Wait for the container to build and dependencies to install\u003C\u002Fli>\n\u003Cli>Access WordPress at \u003Ccode>http:\u002F\u002Flocalhost:8088\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>The devcontainer includes:\u003Cbr \u002F>\n– Pre-configured WordPress and MySQL\u003Cbr \u002F>\n– All PHP extensions and Composer dependencies\u003Cbr \u002F>\n– VS Code extensions for PHP development, debugging, and testing\u003Cbr \u002F>\n– WordPress coding standards configured\u003C\u002Fp>\n\u003Cp>See \u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F.\u002F.devcontainer\u002FREADME\u002F\" rel=\"nofollow ugc\">.devcontainer\u002FREADME.md\u003C\u002Fa> for more details.\u003C\u002Fp>\n\u003Ch4>Option 2: Manual Setup\u003C\u002Fh4>\n\u003Ch4>Prerequisites\u003C\u002Fh4>\n\u003Col>\n\u003Cli>\u003Ccode>sudo apt-get update\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install composer\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install php7.3-xml\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install php7.3-mysql\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install php7.3-zip\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install php-mbstring\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install subversion\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install mysql-server\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo apt-get install php-pear\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>sudo pear install PHP_CodeSniffer\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Bootstrap & Setup\u003C\u002Fh4>\n\u003Col>\n\u003Cli>\u003Ccode>git clone https:\u002F\u002Fgithub.com\u002Fbenbalter\u002Fwordpress-to-jekyll-exporter\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>cd wordpress-to-jekyll-exporter\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>script\u002Fbootstrap\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>script\u002Fsetup\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Option 3: Docker Compose Only\u003C\u002Fh4>\n\u003Col>\n\u003Cli>\u003Ccode>git clone https:\u002F\u002Fgithub.com\u002Fbenbalter\u002Fwordpress-to-jekyll-exporter\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>docker-compose up\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>open localhost:8088\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Running tests\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>script\u002Fcibuild\u003Ch3>Performance Optimizations\u003C\u002Fh3>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>This document describes the performance optimizations implemented in Static Site Exporter to improve export speed and reduce resource usage, especially for large WordPress sites.\u003C\u002Fp>\n\u003Ch3>Overview\u003C\u002Fh3>\n\u003Cp>The following optimizations have been implemented to address performance bottlenecks identified in the export process:\u003C\u002Fp>\n\u003Ch4>1. Optimized Database Queries\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Problem\u003C\u002Fstrong>: The original \u003Ccode>get_posts()\u003C\u002Fcode> method executed a separate SQL query for each post type, then merged the results using \u003Ccode>array_merge()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F Before (inefficient)\u003Cbr \u002F>\nforeach ( $post_types as $post_type ) {\u003Cbr \u002F>\n    $ids   = $wpdb->get_col( $wpdb->prepare( “SELECT ID FROM {$wpdb->posts} WHERE post_type = %s”, $post_type ) );\u003Cbr \u002F>\n    $posts = array_merge( $posts, $ids );\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Solution\u003C\u002Fstrong>: Changed to a single SQL query using an IN clause.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F After (optimized)\u003Cbr \u002F>\n$placeholders = implode( ‘, ‘, array_fill( 0, count( $post_types ), ‘%s’ ) );\u003Cbr \u002F>\n$query        = “SELECT ID FROM {$wpdb->posts} WHERE post_type IN ($placeholders)”;\u003Cbr \u002F>\n$posts        = $wpdb->get_col( $wpdb->prepare( $query, $post_types ) );\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Impact\u003C\u002Fstrong>: Reduces database round trips from N (number of post types, typically 3) to 1, significantly improving performance on sites with many posts.\u003C\u002Fp>\n\u003Ch4>2. User Data Caching\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Problem\u003C\u002Fstrong>: The \u003Ccode>convert_meta()\u003C\u002Fcode> method called \u003Ccode>get_userdata()\u003C\u002Fcode> for every post, resulting in redundant database queries for posts by the same author (N+1 query problem).\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F Before (inefficient)\u003Cbr \u002F>\n‘author’  => get_userdata( $post->post_author )->display_name,\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Solution\u003C\u002Fstrong>: Implemented a static cache to store user data across post conversions.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F After (optimized)\u003Cbr \u002F>\nstatic $user_cache = array();\u003Cbr \u002F>\nif ( ! isset( $user_cache[ $post->post_author ] ) ) {\u003Cbr \u002F>\n    $user_data                        = get_userdata( $post->post_author );\u003Cbr \u002F>\n    $user_cache[ $post->post_author ] = $user_data ? $user_data->display_name : ”;\u003Cbr \u002F>\n}\u003Cbr \u002F>\n‘author’ => $user_cache[ $post->post_author ],\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Impact\u003C\u002Fstrong>: Eliminates redundant database queries for author information. On a site with 1000 posts by 10 authors, this reduces queries from 1000 to 10.\u003C\u002Fp>\n\u003Ch4>3. HTML to Markdown Converter Reuse\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Problem\u003C\u002Fstrong>: A new \u003Ccode>HtmlConverter\u003C\u002Fcode> instance was created for every post, wasting memory and CPU cycles on object initialization.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F Before (inefficient)\u003Cbr \u002F>\n$converter = new HtmlConverter( $converter_options );\u003Cbr \u002F>\n$converter->getEnvironment()->addConverter( new TableConverter() );\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Solution\u003C\u002Fstrong>: Reuse a single static instance across all post conversions.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F After (optimized)\u003Cbr \u002F>\nstatic $converter = null;\u003Cbr \u002F>\nif ( null === $converter ) {\u003Cbr \u002F>\n    $converter_options = apply_filters( ‘jekyll_export_markdown_converter_options’, array( ‘header_style’ => ‘atx’ ) );\u003Cbr \u002F>\n    $converter         = new HtmlConverter( $converter_options );\u003Cbr \u002F>\n    $converter->getEnvironment()->addConverter( new TableConverter() );\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Impact\u003C\u002Fstrong>: Reduces object creation overhead. On a site with 1000 posts, this eliminates 999 unnecessary object instantiations.\u003C\u002Fp>\n\u003Ch4>4. Improved File Operations\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Problem\u003C\u002Fstrong>: The \u003Ccode>copy_recursive()\u003C\u002Fcode> method used the legacy \u003Ccode>dir()\u003C\u002Fcode> API which is slower than modern alternatives.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F Before (inefficient)\u003Cbr \u002F>\n$dir = dir( $source );\u003Cbr \u002F>\nwhile ( $entry = $dir->read() ) {\u003Cbr \u002F>\n    \u002F\u002F process files\u003Cbr \u002F>\n}\u003Cbr \u002F>\n$dir->close();\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Solution\u003C\u002Fstrong>: Replaced with \u003Ccode>scandir()\u003C\u002Fcode> which is faster and more memory-efficient.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F After (optimized)\u003Cbr \u002F>\n$entries = @scandir( $source );\u003Cbr \u002F>\nif ( false === $entries ) {\u003Cbr \u002F>\n    return false;\u003Cbr \u002F>\n}\u003Cbr \u002F>\nforeach ( $entries as $entry ) {\u003Cbr \u002F>\n    \u002F\u002F process files\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Impact\u003C\u002Fstrong>: Improves directory traversal speed, particularly noticeable when copying large upload directories.\u003C\u002Fp>\n\u003Ch4>5. Upload Directory Filtering\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>New Feature\u003C\u002Fstrong>: Added filters to allow skipping or excluding directories during the upload copy process.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Skip Entire Uploads\u003C\u002Fstrong>:\u003Cbr \u002F>\n    \u003Ccode>php\u003Cbr \u002F>\nadd_filter( 'jekyll_export_skip_uploads', '__return_true' );\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Exclude Specific Directories\u003C\u002Fstrong> (e.g., cache or temporary files):\u003Cbr \u002F>\n    \u003Ccode>php\u003Cbr \u002F>\nadd_filter( 'jekyll_export_excluded_upload_dirs', function( $excluded ) {\u003Cbr \u002F>\n    return array_merge( $excluded, array( '\u002Fcache\u002F', '\u002Ftmp\u002F', '\u002Fbackup\u002F' ) );\u003Cbr \u002F>\n} );\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Impact\u003C\u002Fstrong>: Allows large sites to:\u003Cbr \u002F>\n– Skip uploads entirely if they’re served from a CDN\u003Cbr \u002F>\n– Exclude cache directories that aren’t needed in the export\u003Cbr \u002F>\n– Reduce export time and file size for very large installations\u003C\u002Fp>\n\u003Ch3>Performance Benchmarks\u003C\u002Fh3>\n\u003Ch4>Estimated Improvements\u003C\u002Fh4>\n\u003Cp>Based on the optimizations, expected performance improvements for a typical WordPress site:\u003C\u002Fp>\n\u003Cp>  Site Size\u003Cbr \u002F>\n  Before\u003Cbr \u002F>\n  After\u003Cbr \u002F>\n  Improvement\u003C\u002Fp>\n\u003Cp>  Small (100 posts, 5 authors)\u003Cbr \u002F>\n  ~5s\u003Cbr \u002F>\n  ~3s\u003Cbr \u002F>\n  40% faster\u003C\u002Fp>\n\u003Cp>  Medium (1000 posts, 20 authors)\u003Cbr \u002F>\n  ~45s\u003Cbr \u002F>\n  ~20s\u003Cbr \u002F>\n  55% faster\u003C\u002Fp>\n\u003Cp>  Large (10000 posts, 50 authors)\u003Cbr \u002F>\n  ~8min\u003Cbr \u002F>\n  ~3min\u003Cbr \u002F>\n  63% faster\u003C\u002Fp>\n\u003Cp>\u003Cem>Note: Actual performance depends on server hardware, database configuration, and content complexity.\u003C\u002Fem>\u003C\u002Fp>\n\u003Ch4>Database Query Reduction\u003C\u002Fh4>\n\u003Cp>  Operation\u003Cbr \u002F>\n  Queries Before\u003Cbr \u002F>\n  Queries After\u003Cbr \u002F>\n  Reduction\u003C\u002Fp>\n\u003Cp>  Get posts (3 post types)\u003Cbr \u002F>\n  3\u003Cbr \u002F>\n  1\u003Cbr \u002F>\n  67%\u003C\u002Fp>\n\u003Cp>  User data (100 posts, 5 authors)\u003Cbr \u002F>\n  100\u003Cbr \u002F>\n  5\u003Cbr \u002F>\n  95%\u003C\u002Fp>\n\u003Cp>  \u003Cstrong>Total for 100 posts\u003C\u002Fstrong>\u003Cbr \u002F>\n  \u003Cstrong>103\u003C\u002Fstrong>\u003Cbr \u002F>\n  \u003Cstrong>6\u003C\u002Fstrong>\u003Cbr \u002F>\n  \u003Cstrong>94%\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch3>Backward Compatibility\u003C\u002Fh3>\n\u003Cp>All optimizations maintain backward compatibility:\u003Cbr \u002F>\n– All existing WordPress hooks and filters continue to work\u003Cbr \u002F>\n– No changes to the exported file format\u003Cbr \u002F>\n– No changes to the public API\u003Cbr \u002F>\n– New filters are opt-in and don’t affect default behavior\u003C\u002Fp>\n\u003Ch3>Additional Optimization Tips\u003C\u002Fh3>\n\u003Cp>For even better performance on large sites:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Increase PHP memory limit\u003C\u002Fstrong>: Add to \u003Ccode>wp-config.php\u003C\u002Fcode>:\u003Cbr \u002F>\n   \u003Ccode>php\u003Cbr \u002F>\ndefine( 'WP_MEMORY_LIMIT', '512M' );\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Use WP-CLI\u003C\u002Fstrong>: The command-line interface bypasses web server timeouts:\u003Cbr \u002F>\n   \u003Ccode>bash\u003Cbr \u002F>\nwp jekyll-export > export.zip\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Skip uploads if using CDN\u003C\u002Fstrong>: If your uploads are served from a CDN, you can skip copying them:\u003Cbr \u002F>\n   \u003Ccode>php\u003Cbr \u002F>\nadd_filter( 'jekyll_export_skip_uploads', '__return_true' );\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Enable object caching\u003C\u002Fstrong>: Use Redis or Memcached to speed up WordPress core queries.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Technical Notes\u003C\u002Fh3>\n\u003Ch4>Why Static Variables?\u003C\u002Fh4>\n\u003Cp>Static variables in PHP persist across function calls within the same request. This makes them ideal for caching data during a batch export process where the same function is called many times (once per post).\u003C\u002Fp>\n\u003Ch4>Thread Safety\u003C\u002Fh4>\n\u003Cp>These optimizations are safe for:\u003Cbr \u002F>\n– Single-threaded PHP execution (standard)\u003Cbr \u002F>\n– WordPress multisite installations\u003Cbr \u002F>\n– WP-CLI execution\u003C\u002Fp>\n\u003Cp>They are NOT designed for:\u003Cbr \u002F>\n– Multi-threaded or async PHP environments (not common in WordPress)\u003Cbr \u002F>\n– Long-running daemon processes (not the intended use case)\u003C\u002Fp>\n\u003Ch3>Future Optimization Opportunities\u003C\u002Fh3>\n\u003Cp>Potential areas for future improvement:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Bulk metadata loading\u003C\u002Fstrong>: Pre-load all post meta in a single query\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Taxonomy term caching\u003C\u002Fstrong>: Pre-load all terms to avoid per-post queries\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Streaming ZIP creation\u003C\u002Fstrong>: Write directly to ZIP instead of creating temp directory\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Parallel processing\u003C\u002Fstrong>: Use multiple processes for very large exports (WP-CLI only)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Questions?\u003C\u002Fh3>\n\u003Cp>For questions about these optimizations or to report performance issues:\u003Cbr \u002F>\n– \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbenbalter\u002Fwordpress-to-jekyll-exporter\u002Fissues\" rel=\"nofollow ugc\">Open an issue\u003C\u002Fa>\u003Cbr \u002F>\n– \u003Ca href=\"https:\u002F\u002Fben.balter.com\u002Fwordpress-to-jekyll-exporter\u002F\" rel=\"nofollow ugc\">View the documentation\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>Performance Tips for Large Sites\u003C\u002Fh3>\n\u003Cp>If you’re running a large WordPress site with thousands of posts or gigabytes of uploads, here are some tips to make the export process faster and more efficient.\u003C\u002Fp>\n\u003Ch3>Quick Wins\u003C\u002Fh3>\n\u003Ch4>1. Use WP-CLI Instead of Browser Export\u003C\u002Fh4>\n\u003Cp>Browser-based exports are subject to PHP execution time limits (typically 30-300 seconds). Use WP-CLI for unlimited execution time:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`bash\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>wp jekyll-export > export.zip\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch4>2. Skip Uploads if You Don’t Need Them\u003C\u002Fh4>\n\u003Cp>If your images and files are served from a CDN or you plan to handle them separately, you can skip the uploads directory entirely:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u002F\u002F Add to your theme’s functions.php or a custom plugin\u003Cbr \u002F>\nadd_filter( ‘jekyll_export_skip_uploads’, ‘__return_true’ );\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>This can save significant time and disk space, especially if you have gigabytes of media files.\u003C\u002Fp>\n\u003Ch4>3. Exclude Cache and Temporary Directories\u003C\u002Fh4>\n\u003Cp>Many sites accumulate cache files and temporary uploads that aren’t needed in the export:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>add_filter( ‘jekyll_export_excluded_upload_dirs’, function( $excluded ) {\u003Cbr \u002F>\n    return array_merge( $excluded, array(\u003Cbr \u002F>\n        ‘\u002Fcache\u002F’,\u003Cbr \u002F>\n        ‘\u002Ftmp\u002F’,\u003Cbr \u002F>\n        ‘\u002Fbackup\u002F’,\u003Cbr \u002F>\n        ‘\u002Fwc-logs\u002F’,  \u002F\u002F WooCommerce logs\u003Cbr \u002F>\n        ‘\u002Fwpml\u002F’,     \u002F\u002F WPML cache\u003Cbr \u002F>\n    ) );\u003Cbr \u002F>\n} );\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch3>Performance Improvements in Version 2.4.3+\u003C\u002Fh3>\n\u003Cp>Recent optimizations  &hellip;\u003C\u002Fp>\n","Features",500,41801,70,12,"2026-02-09T20:04:00.000Z","4.4",[124,19,125,126,127],"export","github-pages","jekyll","yaml","https:\u002F\u002Fgithub.com\u002Fbenbalter\u002Fwordpress-to-jekyll-exporter\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fjekyll-exporter.3.1.1.zip",{"attackSurface":131,"codeSignals":199,"taintFlows":208,"riskAssessment":209,"analyzedAt":212},{"hooks":132,"ajaxHandlers":195,"restRoutes":196,"shortcodes":197,"cronEvents":198,"entryPointCount":11,"unprotectedCount":11},[133,139,143,147,149,154,158,161,165,168,171,174,177,180,185,189],{"type":134,"name":135,"callback":136,"file":137,"line":138},"action","admin_menu","connections_menu","src\\Controllers\\Admin_Pages.php",8,{"type":134,"name":140,"callback":141,"file":137,"line":142},"admin_init","add_version_control_section",9,{"type":134,"name":144,"callback":145,"file":146,"line":138},"customize_controls_enqueue_scripts","enqueue_customizer_script","src\\Controllers\\Customizer.php",{"type":134,"name":144,"callback":148,"file":146,"line":41},"enqueue_customizer_style",{"type":134,"name":150,"callback":151,"file":152,"line":153},"admin_enqueue_scripts","enqueue_github_scripts","src\\Controllers\\Github.php",17,{"type":134,"name":155,"callback":156,"file":152,"line":157},"customize_controls_print_footer_scripts","github_params",20,{"type":134,"name":159,"callback":156,"file":152,"line":160},"admin_footer",22,{"type":134,"name":162,"callback":163,"priority":22,"file":152,"line":164},"admin_bar_menu","add_github_api_usage_menu",24,{"type":134,"name":150,"callback":166,"file":152,"line":167},"enqueue_admin_global_script",26,{"type":134,"name":169,"callback":169,"file":170,"line":76},"add_meta_boxes","src\\Controllers\\Meta_Box.php",{"type":134,"name":150,"callback":172,"file":170,"line":173},"enqueue_meta_box_script",15,{"type":134,"name":150,"callback":175,"file":170,"line":176},"enqueue_meta_box_style",16,{"type":134,"name":178,"callback":179,"file":170,"line":153},"save_post","save_meta_box",{"type":134,"name":181,"callback":182,"file":183,"line":184},"plugins_loaded","load_textdomain","src\\Controllers\\Plugin.php",108,{"type":134,"name":186,"callback":187,"file":188,"line":153},"rest_api_init","register_routes","src\\Controllers\\Rest_Api.php",{"type":190,"name":191,"callback":192,"priority":41,"file":193,"line":194},"filter","script_loader_tag","closure","src\\Controllers\\Scripts.php",53,[],[],[],[],{"dangerousFunctions":200,"sqlUsage":201,"outputEscaping":203,"fileOperations":11,"externalRequests":11,"nonceChecks":28,"capabilityChecks":206,"bundledLibraries":207},[],{"prepared":11,"raw":11,"locations":202},[],{"escaped":204,"rawEcho":11,"locations":205},28,[],2,[],[],{"summary":210,"deductions":211},"The \"version-control-your-content\" plugin v1.0.0 demonstrates a strong security posture based on the provided static analysis. The absence of any detected attack surface points, such as unprotected AJAX handlers, REST API routes, shortcodes, or cron events, indicates a well-designed plugin that limits potential entry points for attackers. Furthermore, the code analysis reveals no dangerous functions, all SQL queries are prepared, all output is properly escaped, and there are no file operations or external HTTP requests. The presence of nonce and capability checks further reinforces secure coding practices.\n\nThe taint analysis shows no identified flows with unsanitized paths, and the vulnerability history is clean, with zero known CVEs. This suggests that the plugin has either been developed with security in mind from the outset, or has undergone thorough security reviews without any issues being reported. The lack of common vulnerability types and recent vulnerabilities further solidifies this positive assessment.\n\nIn conclusion, the \"version-control-your-content\" plugin v1.0.0 appears to be a very secure plugin. Its strengths lie in its minimal attack surface, robust code practices like prepared statements and output escaping, and a clean vulnerability history. There are no specific security concerns or deductions to be made from the provided data, suggesting a highly reliable plugin.",[],"2026-03-17T05:56:08.767Z",{"wat":214,"direct":229},{"assetPaths":215,"generatorPatterns":221,"scriptPaths":222,"versionParams":223},[216,217,218,219,220],"\u002Fwp-content\u002Fplugins\u002Fversion-control-your-content\u002Fassets\u002Fcss\u002Fadmin-pages.css","\u002Fwp-content\u002Fplugins\u002Fversion-control-your-content\u002Fassets\u002Fjs\u002Fadmin-pages.js","\u002Fwp-content\u002Fplugins\u002Fversion-control-your-content\u002Fassets\u002Fjs\u002Fmain.js","\u002Fwp-content\u002Fplugins\u002Fversion-control-your-content\u002Fassets\u002Fcss\u002Fsettings.css","\u002Fwp-content\u002Fplugins\u002Fversion-control-your-content\u002Fassets\u002Fjs\u002Fsettings.js",[],[217,218,220],[224,225,226,227,228],"version-control-your-content\u002Fassets\u002Fcss\u002Fadmin-pages.css?ver=","version-control-your-content\u002Fassets\u002Fjs\u002Fadmin-pages.js?ver=","version-control-your-content\u002Fassets\u002Fjs\u002Fmain.js?ver=","version-control-your-content\u002Fassets\u002Fcss\u002Fsettings.css?ver=","version-control-your-content\u002Fassets\u002Fjs\u002Fsettings.js?ver=",{"cssClasses":230,"htmlComments":233,"htmlAttributes":234,"restEndpoints":236,"jsGlobals":237,"shortcodeOutput":238},[231,232],"vcyc-wrap","vcyc-options-pages-box",[],[235],"data-options_page",[],[],[]]