[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fRG6c4kfSNg0Lxrlt0DgzFbjBpoCirT9k8p9hw5jmoyg":3,"$fzuPXwbmW8GBJ0GJcteGEmUlQRfAL_vQGACdUHXk3z18":339,"$ff005cBthi6OLsThUz0mc9Gu4zmW0oS7QaE_mspo3uBM":343},{"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":23,"download_link":24,"security_score":25,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27,"discovery_status":28,"vulnerabilities":29,"developer":30,"crawl_stats":26,"alternatives":36,"analysis":139,"fingerprints":317},"pushpull","PushPull","0.0.20","Jerome Steunenberg","https:\u002F\u002Fprofiles.wordpress.org\u002Fjeromesteunenberg\u002F","\u003Cp>PushPull stores selected WordPress content in a Git repository using a canonical JSON representation instead of raw database dumps.\u003C\u002Fp>\n\u003Cp>This project is also documented through a DevOps-focused article series that explains how to efficiently manage a WordPress stack with Bedrock and PushPull, starting here: https:\u002F\u002Fcreativemoods.pt\u002Fdevops-with-wordpress\u002F\u003C\u002Fp>\n\u003Ch3>Beta notice\u003C\u002Fh3>\n\u003Cp>This is a beta plugin. It is still under active development, has limited functionality, and currently supports only a narrow subset of the intended PushPull feature set.\u003C\u002Fp>\n\u003Cp>The current release supports these managed domains:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Primary domains:\u003Cbr \u002F>\n   generateblocks_global_styles\u003Cbr \u002F>\n   generateblocks_conditions\u003Cbr \u002F>\n   wordpress_block_patterns\u003Cbr \u002F>\n   wordpress_categories\u003Cbr \u002F>\n   wordpress_comments\u003Cbr \u002F>\n   wordpress_menus\u003Cbr \u002F>\n   wordpress_pages\u003Cbr \u002F>\n   wordpress_posts\u003Cbr \u002F>\n   wordpress_tags\u003Cbr \u002F>\n   wordpress_custom_css\u003Cbr \u002F>\n   generatepress_elements\u003Cbr \u002F>\n   wordpress_attachments (explicit opt-in only)\u003Cbr \u002F>\ngeneric discovered custom post types and taxonomies\u003C\u002Fli>\n\u003Cli>Config domains:\u003Cbr \u002F>\n   wordpress_core_configuration\u003Cbr \u002F>\n   wpml_configuration\u003C\u002Fli>\n\u003Cli>Overlay domains:\u003Cbr \u002F>\n   translation_management (WPML-backed)\u003Cbr \u002F>\n   media_organization (Real Media Library-backed)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>PushPull keeps a local Git-like repository inside WordPress database tables and supports the following workflow directly from WordPress admin:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Test the remote GitHub or GitLab connection\u003C\u002Fli>\n\u003Cli>Commit live managed content into the local repository\u003C\u002Fli>\n\u003Cli>Initialize an empty remote repository\u003C\u002Fli>\n\u003Cli>Fetch remote commits into a local tracking ref\u003C\u002Fli>\n\u003Cli>Diff live, local, and remote states\u003C\u002Fli>\n\u003Cli>Pull remote changes through fetch + merge\u003C\u002Fli>\n\u003Cli>Merge remote changes into the local branch\u003C\u002Fli>\n\u003Cli>Resolve conflicts when needed\u003C\u002Fli>\n\u003Cli>Apply repository content back into WordPress\u003C\u002Fli>\n\u003Cli>Push local commits to GitHub or GitLab\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>The plugin also includes:\u003C\u002Fp>\n\u003Col>\n\u003Cli>An audit log screen\u003C\u002Fli>\n\u003Cli>Local repository reset tooling\u003C\u002Fli>\n\u003Cli>Remote branch reset tooling that creates one commit removing all tracked files from the branch\u003C\u002Fli>\n\u003Cli>A dedicated Domains screen that separates WordPress core, installed plugin integrations, and discovered custom content\u003C\u002Fli>\n\u003Cli>Global and per-domain managed-content views in the admin UI\u003C\u002Fli>\n\u003Cli>A high-level PushPull status dropdown in the WordPress admin bar\u003C\u002Fli>\n\u003Cli>Menu structure export and apply with hierarchy and theme location assignment\u003C\u002Fli>\n\u003Cli>A scheduled lightweight remote-head check that highlights when \u003Ccode>Fetch\u003C\u002Fcode> likely has updates available\u003C\u002Fli>\n\u003Cli>Bulk \u003Ccode>Commit + Push All\u003C\u002Fcode> and \u003Ccode>Pull + Apply All\u003C\u002Fcode> workflows for whole-site bootstrap and deploy flows\u003C\u002Fli>\n\u003Cli>A \u003Ccode>wp pushpull\u003C\u002Fcode> WP-CLI command surface for status, configuration, domains, and sync operations\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Current scope\u003C\u002Fh3>\n\u003Cp>This is an early, focused release. At the moment, PushPull is intentionally limited to:\u003C\u002Fp>\n\u003Col>\n\u003Cli>GitHub and GitLab as implemented remote providers\u003C\u002Fli>\n\u003Cli>Managed domains across three families:\u003Cbr \u002F>\n   generateblocks\u002Fglobal-styles\u002F\u003Cbr \u002F>\n   generateblocks\u002Fconditions\u002F\u003Cbr \u002F>\n   wordpress\u002Fblock-patterns\u002F\u003Cbr \u002F>\n   wordpress\u002Fcategories\u002F\u003Cbr \u002F>\n   wordpress\u002Fcomments\u002F\u003Cbr \u002F>\n   wordpress\u002Fmenus\u002F\u003Cbr \u002F>\n   wordpress\u002Fpages\u002F\u003Cbr \u002F>\n   wordpress\u002Fposts\u002F\u003Cbr \u002F>\n   wordpress\u002Ftags\u002F\u003Cbr \u002F>\n   wordpress\u002Fcustom-css\u002F\u003Cbr \u002F>\n   wordpress\u002Fattachments\u002F\u003Cbr \u002F>\n   wordpress\u002Fconfiguration\u002F\u003Cbr \u002F>\n   wpml\u002Fconfiguration\u002F\u003Cbr \u002F>\n   wordpress\u002Fgeneratepress-elements\u002F\u003Cbr \u002F>\n   wordpress\u002Fcustom-post-types\u002F\u002F\u003Cbr \u002F>\n   wordpress\u002Fcustom-taxonomies\u002F\u002F\u003Cbr \u002F>\n   translations\u002Fmanagement\u002F\u003Cbr \u002F>\n   media\u002Forganization\u002F\u003C\u002Fli>\n\u003Cli>Canonical JSON storage with one file per managed item for manifest-backed sets, plus directory-backed storage for attachments using \u003Ccode>attachment.json\u003C\u002Fcode> and the binary file\u003C\u002Fli>\n\u003Cli>Explicit opt-in attachment sync through a media-library checkbox\u003C\u002Fli>\n\u003Cli>Overlay domains that scope themselves to enabled compatible base domains rather than exporting every backend row blindly\u003C\u002Fli>\n\u003Cli>A cached remote-head availability signal for \u003Ccode>Fetch\u003C\u002Fcode>, driven by a configurable recurring check instead of a live provider probe on every page load\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>It does not yet manage forms, users, arbitrary \u003Ccode>wp_options\u003C\u002Fcode>, or arbitrary plugin data.\u003C\u002Fp>\n\u003Ch3>How PushPull represents content\u003C\u002Fh3>\n\u003Cp>PushPull does not use WordPress post IDs as repository identity.\u003C\u002Fp>\n\u003Cp>For the currently supported managed sets it stores:\u003C\u002Fp>\n\u003Col>\n\u003Cli>One canonical JSON file per managed item\u003C\u002Fli>\n\u003Cli>One separate \u003Ccode>manifest.json\u003C\u002Fcode> file for manifest-backed sets that preserves logical ordering\u003C\u002Fli>\n\u003Cli>One directory per attachment for the attachments set, containing \u003Ccode>attachment.json\u003C\u002Fcode> and the binary file\u003C\u002Fli>\n\u003Cli>Stable logical keys instead of environment-specific database IDs\u003C\u002Fli>\n\u003Cli>Canonical logical-key references for cross-domain relationships such as reading settings, translation groups, media folders, GeneratePress condition targets, and menu object references\u003C\u002Fli>\n\u003Cli>Recursive placeholder normalization for current-site absolute URLs in post-type-backed content\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Configuration\u003C\u002Fh3>\n\u003Cp>PushPull currently supports GitHub and GitLab repositories.\u003C\u002Fp>\n\u003Cp>For GitHub, grant:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Repository metadata read access\u003C\u002Fli>\n\u003Cli>Repository contents read and write access\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>For GitLab fine-grained personal access tokens, grant:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>Project: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Branch: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Commit: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Commit: Create\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Repository: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>In PushPull > Settings:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Select \u003Ccode>GitHub\u003C\u002Fcode> or \u003Ccode>GitLab\u003C\u002Fcode> as the provider\u003C\u002Fli>\n\u003Cli>Enter the repository owner and repository name\u003C\u002Fli>\n\u003Cli>Enter the target branch\u003C\u002Fli>\n\u003Cli>Enter the API token\u003C\u002Fli>\n\u003Cli>Optionally set the remote fetch check interval in minutes\u003C\u002Fli>\n\u003Cli>Click \u003Ccode>Test connection\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Save the settings\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Domain selection\u003C\u002Fh4>\n\u003Cp>In PushPull > Domains:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Enable one or more managed domains\u003C\u002Fli>\n\u003Cli>Review WordPress core, installed plugin integrations, and discovered custom content separately\u003C\u002Fli>\n\u003Cli>Opt into generic discovered custom post types and taxonomies when you want them managed\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Workflow\u003C\u002Fh4>\n\u003Cp>The normal workflow is:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>Commit\u003C\u002Fcode> to snapshot the current live managed-set content into the local repository\u003C\u002Fli>\n\u003Cli>\u003Ccode>Fetch\u003C\u002Fcode> to import the current remote branch into \u003Ccode>refs\u002Fremotes\u002Forigin\u002F\u003Cbranch>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Inspect the live\u002Flocal and local\u002Fremote diff views if needed\u003C\u002Fli>\n\u003Cli>\u003Ccode>Pull\u003C\u002Fcode> for the common fetch + merge flow, or \u003Ccode>Merge\u003C\u002Fcode> manually after fetch when you want review first\u003C\u002Fli>\n\u003Cli>\u003Ccode>Apply repo to WordPress\u003C\u002Fcode> when you want the local branch state written back into WordPress\u003C\u002Fli>\n\u003Cli>\u003Ccode>Push\u003C\u002Fcode> when you want local commits published to GitHub or GitLab\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>PushPull also performs a lightweight recurring remote-head check and visually highlights \u003Ccode>Fetch\u003C\u002Fcode> when the latest scheduled check suggests the remote branch has advanced since the last fetch.\u003C\u002Fp>\n\u003Cp>For whole-site bootstrap flows, PushPull also supports:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>Commit + Push All\u003C\u002Fcode> to snapshot and publish all enabled domains\u003C\u002Fli>\n\u003Cli>\u003Ccode>Pull + Apply All\u003C\u002Fcode> to import and apply all enabled domains on a bare target site\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>If both local and remote changed, PushPull can persist conflicts, let you resolve them in the admin UI, and then finalize a merge commit.\u003C\u002Fp>\n\u003Cp>When pushing to GitLab, PushPull currently linearizes local merge results into a normal commit on the remote branch instead of preserving merge topology. The merged tree content is preserved; only the remote Git history shape is flattened.\u003C\u002Fp>\n\u003Ch4>WP-CLI\u003C\u002Fh4>\n\u003Cp>PushPull also exposes a \u003Ccode>wp pushpull\u003C\u002Fcode> command.\u003C\u002Fp>\n\u003Cp>Examples:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>wp pushpull status\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull domains\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull config list\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull config set branch main\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull config enable-domain wordpress_pages\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull commit wordpress_pages\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull push\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull commit-push-all\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull pull-apply-all\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Empty repositories\u003C\u002Fh4>\n\u003Cp>If the configured GitHub or GitLab repository exists but has no commits yet, \u003Ccode>Test connection\u003C\u002Fcode> will report that the repository is reachable but empty.\u003C\u002Fp>\n\u003Cp>In that case, click \u003Ccode>Initialize remote repository\u003C\u002Fcode>. PushPull will:\u003C\u002Fp>\n\u003Col>\n\u003Cli>create the first commit on the configured branch\u003C\u002Fli>\n\u003Cli>fetch that initial commit into the local remote-tracking ref\u003C\u002Fli>\n\u003Cli>make the repository ready for normal commit, fetch, merge, apply, and push workflows\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>You do not need to create the first commit manually on the provider before using PushPull.\u003C\u002Fp>\n\u003Ch3>TODO\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Cache the admin-bar PushPull status summary so the high-level live\u002Flocal and local\u002Fremote aggregation is not recomputed on every page view.\u003C\u002Fli>\n\u003Cli>Move chunked async provider resumability fully into the provider layer so \u003Ccode>AsyncBranchOperationRunner\u003C\u002Fcode> no longer needs provider-specific GitLab staging rehydration logic.\u003C\u002Fli>\n\u003Cli>Improve push progress and recap reporting to distinguish newly uploaded objects from objects reused from the remote history.\u003C\u002Fli>\n\u003Cli>Surface unresolved logical-reference mapping issues, such as GeneratePress condition IDs that could not be converted to logical placeholders, instead of silently leaving mixed raw IDs and canonical refs.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>External services\u003C\u002Fh3>\n\u003Cp>PushPull connects to the GitHub or GitLab API for the repository you configure in the plugin settings.\u003C\u002Fp>\n\u003Cp>The plugin uses the provider REST API to:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Read repository metadata and the default branch\u003C\u002Fli>\n\u003Cli>Read and update branch refs\u003C\u002Fli>\n\u003Cli>Read and create Git objects or provider-equivalent commit actions\u003C\u002Fli>\n\u003Cli>Test repository access before sync operations\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>PushPull sends the following information to the configured provider over HTTPS:\u003C\u002Fp>\n\u003Col>\n\u003Cli>The repository owner, repository name, branch, and API base URL\u003C\u002Fli>\n\u003Cli>Your configured API token in the provider-specific authentication header\u003C\u002Fli>\n\u003Cli>Canonical JSON representations of the managed content you choose to commit and push\u003C\u002Fli>\n\u003Cli>Commit metadata such as commit messages and, if configured, author name and email\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>In the current release, the managed content sent to the provider is limited to the enabled supported domains: GenerateBlocks Global Styles, GenerateBlocks Conditions, WordPress Block Patterns, WordPress Categories, WordPress Comments, WordPress Menus, WordPress Pages, WordPress Posts, WordPress Tags, WordPress Custom CSS, GeneratePress Elements, explicitly opted-in WordPress Attachments, WordPress core configuration, WPML configuration, generic discovered custom post types and taxonomies, WPML-backed translation management, and Real Media Library-backed media organization.\u003C\u002Fp>\n\u003Cp>PushPull does not send your whole WordPress database to the provider. It only sends the managed content represented by the enabled adapters.\u003C\u002Fp>\n\u003Cp>GitHub terms of service: https:\u002F\u002Fdocs.github.com\u002Fen\u002Fsite-policy\u002Fgithub-terms\u002Fgithub-terms-of-service\u003Cbr \u002F>\nGitHub privacy statement: https:\u002F\u002Fdocs.github.com\u002Fen\u002Fsite-policy\u002Fprivacy-policies\u002Fgithub-general-privacy-statement\u003Cbr \u002F>\nGitLab terms: https:\u002F\u002Fabout.gitlab.com\u002Fterms\u002F\u003Cbr \u002F>\nGitLab privacy statement: https:\u002F\u002Fabout.gitlab.com\u002Fprivacy\u002F\u003C\u002Fp>\n","Git-based content sync for WordPress. Project homepage: https:\u002F\u002Fcreativemoods.pt\u002Fpushpull\u002F",0,532,"2026-04-14T10:49:00.000Z","6.9.4","6.0","8.1",[18,19,20,21,22],"content-sync","devops","generateblocks","git","github","https:\u002F\u002Fgithub.com\u002Fcreativemoods\u002Fpushpull","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.20.zip",100,null,"2026-04-16T10:56:18.058Z","no_bundle",[],{"slug":31,"display_name":7,"profile_url":8,"plugin_count":32,"total_installs":11,"avg_security_score":25,"avg_patch_time_days":33,"trust_score":34,"computed_at":35},"jeromesteunenberg",1,30,94,"2026-05-20T02:51:32.851Z",[37,57,79,99,121],{"slug":38,"name":39,"version":40,"author":41,"author_profile":42,"description":43,"short_description":44,"active_installs":45,"downloaded":46,"rating":47,"num_ratings":48,"last_updated":49,"tested_up_to":14,"requires_at_least":50,"requires_php":51,"tags":52,"homepage":55,"download_link":56,"security_score":25,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"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,28639,78,14,"2025-12-02T09:44:00.000Z","6.2","",[53,22,54],"embed","oembed","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fgithub-embed\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fgithub-embed.2.2.1.zip",{"slug":58,"name":59,"version":60,"author":61,"author_profile":62,"description":63,"short_description":64,"active_installs":65,"downloaded":66,"rating":67,"num_ratings":68,"last_updated":69,"tested_up_to":14,"requires_at_least":70,"requires_php":71,"tags":72,"homepage":77,"download_link":78,"security_score":25,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"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",600,42128,70,12,"2026-02-09T20:04:00.000Z","4.4","7.2",[73,22,74,75,76],"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",{"slug":80,"name":81,"version":82,"author":83,"author_profile":84,"description":85,"short_description":86,"active_installs":87,"downloaded":88,"rating":89,"num_ratings":48,"last_updated":90,"tested_up_to":14,"requires_at_least":91,"requires_php":92,"tags":93,"homepage":51,"download_link":98,"security_score":25,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"pastacode","Pastacode","3.0.1","Willy Bahuaud","https:\u002F\u002Fprofiles.wordpress.org\u002Fwillybahuaud\u002F","\u003Cp>With Pastacode, you can easily add code into your posts with the awesome PrismJs coloration library.\u003Cbr \u002F>\nYou can insert source code into the post editor, wrinting it directly in the editor (using a gutenberg bloc or classic editor), from a file, or from webservices like GitHub, Gitlab, Gist, Pastebin, BitBucket or BitBucket snippets. Webservices responses are cached in order to avoid too many HTTP requests.\u003Cbr \u002F>\nIt also work in comments and bbPress topics and replies.\u003C\u002Fp>\n\u003Cp>Don’t worry about posts updates while upgrading codes!\u003C\u002Fp>\n\u003Cp>Pastacode allows to enhance your snippets using PrismJs plugins (highlightning lines, link functions…).\u003C\u002Fp>\n\u003Ch3>Third Party\u003C\u002Fh3>\n\u003Cp>Pastacode use some third party components\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPrismJS\u002Fprism\u002Fgraphs\u002Fcontributors\" rel=\"nofollow ugc\">PrismJS – by Lea Verou, Golmote, James DiGioia, Michael Schmidt & other contributors\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@wordpress\u002Fcreate-block\" rel=\"nofollow ugc\">WordPress create-block\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcodemirror\u002FCodeMirror\" rel=\"nofollow ugc\">CodeMirror 6\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fuiwjs.github.io\u002Freact-codemirror\u002F\" rel=\"nofollow ugc\">CodeMirror6 Component for React\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmathiasbynens\u002Fhe\" rel=\"nofollow ugc\">He.js – by Mathias Bynens\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n","Use Pastacode to add code into your posts with the awesome PrismJs coloration library. So, past'a code!",500,25068,98,"2026-03-12T11:16:00.000Z","4.0","7.0",[94,95,22,96,97],"block","code","sourcecode","syntax","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpastacode.3.0.1.zip",{"slug":100,"name":101,"version":102,"author":103,"author_profile":104,"description":105,"short_description":106,"active_installs":87,"downloaded":107,"rating":25,"num_ratings":108,"last_updated":109,"tested_up_to":92,"requires_at_least":110,"requires_php":51,"tags":111,"homepage":116,"download_link":117,"security_score":118,"vuln_count":119,"unpatched_count":11,"last_vuln_date":120,"fetched_at":27},"wp-plugin-info-card","WP Plugin Info Card","6.3.1","Brice Capobianco","https:\u002F\u002Fprofiles.wordpress.org\u002Fbrikou\u002F","\u003Cp>WP Plugin Info Card lets you display WordPress plugins, GitHub repositories, Easy Digital Downloads plugins, and third-party plugins in beautiful, customizable cards using blocks or shortcodes (compatible with most page builders).\u003C\u002Fp>\n\u003Cp>Whether you are showcasing your own plugins, highlighting recommended tools, or displaying GitHub projects, WP Plugin Info Card gives you more flexibility than the default WordPress blocks by supporting multiple data sources with consistent, beautiful layouts.\u003C\u002Fp>\n\u003Cp>It works with WordPress.org plugins and themes, GitHub repositories, Easy Digital Downloads (EDD) products, and third-party plugins, so you are not limited to a single ecosystem.\u003C\u002Fp>\n\u003Cp>This plugin is perfect for:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Reviewers and Developers wanting to showcase projects, whether hosted on GitHub, WordPress.org, or hosted else-where and custom created.\u003C\u002Fli>\n\u003Cli>WordPress contributors who’d like to display contribution badges or past contributions.\u003C\u002Fli>\n\u003Cli>Users wanting more design choice and layout variation than what is offered by the Core WordPress blocks.\u003C\u002Fli>\n\u003C\u002Ful>\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\u003Ch3>Why use WP Plugin Info Card?\u003C\u002Fh3>\n\u003Cp>The default WordPress Plugin\u002FTheme blocks are limited to WordPress.org listings with a limited design. WP Plugin Info Card expands on that by allowing you to display plugin cards and project cards from multiple sources in several beautiful cards.\u003C\u002Fp>\n\u003Cp>Use it to:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Display WordPress.org plugin cards and theme cards anywhere on your site. Customize the grids and layouts with ease, supporting both blocks and shortcodes.\u003C\u002Fli>\n\u003Cli>Showcase GitHub repositories in a card-like grid, highlighting your favorite GitHub projects, or showcasing your own. Depending on the permissions of your GitHub token, this works for private repos.\u003C\u002Fli>\n\u003Cli>Highlight premium or third-party plugins not listed on WordPress.org. For example, you’d like to feature a popular pro plugin. Simply fill in the plugin details, reference it by slug, and display it in a beautiful card.\u003C\u002Fli>\n\u003Cli>Display plugin screenshots from a WordPress.org plugin in a responsive card with carousel and lightbox suppport.\u003C\u002Fli>\n\u003Cli>Display a list of all WordPress.org plugins installed on your site, which is great for showing support and recognition towards plugin authors. This is perfect for About pages or “how it’s made” posts\u002Fpages.\u003C\u002Fli>\n\u003Cli>Display plugins or themes from WordPress.org based on a query, for example, only showing plugins by your .org username, where you’re able to curate a list of plugins you contribute to in a beautiful card grid.\u003C\u002Fli>\n\u003Cli>Show off your WordPress.org profile badges, which is perfect for team pages, profile pages, and about pages. Everyone loves flair.\u003C\u002Fli>\n\u003Cli>Keep track of your own WordPress.org plugins\u002Fthemes, with a convenient dashboard widget and friendly admin options allowing you to enter watched WordPress.org assets.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Major Features\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Multiple Data Sources\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Display plugin and project data from:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>WordPress.org plugins and themes\u003C\u002Fli>\n\u003Cli>GitHub repositories with metadata and stats\u003C\u002Fli>\n\u003Cli>Easy Digital Downloads products\u002Fplugins\u003C\u002Fli>\n\u003Cli>Third-party plugins and custom integrations\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Blocks and Shortcodes\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>WP Plugin Info Card works with the Block Editor\u002FGutenberg, Classic Editor, and your favorite page builder:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Use Gutenberg blocks for visual editing in the block editor.\u003C\u002Fli>\n\u003Cli>Use shortcodes for classic setups and page builders such as Elementor.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>GitHub Info Card \u002F GitHub Info Cards Grid Block\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Show GitHub repositories using a dedicated block or shortcode. Display repository details, stats, and links in a compact yet informative card format. This is perfect for highlighting your favorite GitHub repository, showcasing your own, or even consolidating a list of multiple GitHub repositories into a responsive grid.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Plugin Screenshots Block\u002FShortcode\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Display plugin screenshots from WordPress.org in a beautiful card featuring a responsive gallery\u002Fcarousel layout with lightbox support. This is ideal for plugin landing pages, tutorials, announcements, and documentation.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Profile Badges\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Display your WordPress.org profile badges to highlight contributions, plugins, and community involvement. It supports dynamic and custom (user-selected) badges. These are perfect for About, Team, and Profile pages.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Third-party Plugin Support with Optional REST Support\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Add plugins that are not hosted on WordPress.org, including premium and private plugins. Showcase these using the blocks\u002Fshortcodes that come with WP Plugin Info Card. Optional REST support means that if you’re a third-party plugin provider, you can add your custom plugin, enable a REST endpoint, and let others automatically download your details to their own install, and have it updated automatically.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Performance Friendly\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Uses transients for caching and lazy-loading where needed.\u003C\u002Fli>\n\u003Cli>Uses local options and post types for data storage\u002Feasier parsing\u002Fless custom tables.\u003C\u002Fli>\n\u003Cli>Optimized for front-end performance, with things only loading where needed.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Quick Links (Shortcode Documentation)\u003C\u002Fh3>\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] 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\u003Ch3>Quick Links (Block Documentation)\u003C\u002Fh3>\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\u003Ch3>When should I use this plugin?\u003C\u002Fh3>\n\u003Cp>WP Plugin Info Card is ideal if you want to:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Showcase your WordPress plugins on your website\u003C\u002Fli>\n\u003Cli>Display GitHub repositories on your site\u003C\u002Fli>\n\u003Cli>Display and highlight premium or third-party plugins\u003C\u002Fli>\n\u003Cli>Build consistent and beautiful cards with customizable layouts\u003C\u002Fli>\n\u003Cli>Add .org features like plugin screenshots or profile badges to your site\u003C\u002Fli>\n\u003C\u002Ful>\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\u003Ch3>GitHub\u003C\u002Fh3>\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\u003Ch3>How can I report security bugs?\u003C\u002Fh3>\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","Add beautiful, customizable cards to showcase plugins, themes, and projects from WordPress.org, GitHub, EDD, and third-party plugins.",48888,23,"2026-04-11T12:56:00.000Z","6.5",[112,113,114,22,115],"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.1.zip",95,4,"2026-02-17 17:12:43",{"slug":122,"name":123,"version":124,"author":125,"author_profile":126,"description":127,"short_description":128,"active_installs":129,"downloaded":130,"rating":131,"num_ratings":132,"last_updated":133,"tested_up_to":14,"requires_at_least":134,"requires_php":135,"tags":136,"homepage":137,"download_link":138,"security_score":25,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"embed-block-for-github","Embed Block for GitHub","0.3","Jb Audras","https:\u002F\u002Fprofiles.wordpress.org\u002Faudrasjb\u002F","\u003Cp>This plugin adds a GitHub Repository Embed Block to the Block Editor.\u003C\u002Fp>\n\u003Cp>It is developed on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faudrasjb\u002Fembed-block-for-github\" rel=\"nofollow ugc\">GitHub\u003C\u002Fa>. Contributions welcome!\u003C\u002Fp>\n\u003Cp>Special thanks:\u003Cbr \u002F>\n– \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpedro-mendonca\" rel=\"nofollow ugc\">@pedro-mendonca\u003C\u002Fa> for i18n\u002Fl10n fixes and portuguese translation.\u003Cbr \u002F>\n– \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fvsc55\" rel=\"nofollow ugc\">@vsc55\u003C\u002Fa> for Dark Mode Enhancement, full code refresh and spanish translation.\u003C\u002Fp>\n","Easily embed GitHub repositories in Gutenberg Editor.",400,10334,84,5,"2025-11-27T08:51:00.000Z","5.2","5.6",[94,53,22],"https:\u002F\u002Fjeanbaptisteaudras.com\u002Fembed-block-for-github-gutenberg-wordpress\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fembed-block-for-github.0.3.zip",{"attackSurface":140,"codeSignals":271,"taintFlows":288,"riskAssessment":309,"analyzedAt":316},{"hooks":141,"ajaxHandlers":257,"restRoutes":267,"shortcodes":268,"cronEvents":269,"entryPointCount":270,"unprotectedCount":270},[142,148,155,159,165,169,173,176,178,181,183,185,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,253,255],{"type":143,"name":144,"callback":145,"file":146,"line":147},"action","plugins_loaded","closure","pushpull.php",42,{"type":149,"name":150,"callback":151,"priority":152,"file":153,"line":154},"filter","attachment_fields_to_edit","addField",10,"src\u002FAdmin\u002FAttachmentSyncField.php",17,{"type":149,"name":156,"callback":157,"priority":152,"file":153,"line":158},"attachment_fields_to_save","saveField",18,{"type":143,"name":160,"callback":161,"priority":162,"file":163,"line":164},"admin_bar_menu","register",90,"src\u002FPlugin\u002FPlugin.php",209,{"type":149,"name":166,"callback":167,"file":163,"line":168},"cron_schedules","registerSchedule",210,{"type":143,"name":170,"callback":171,"file":163,"line":172},"init","ensureScheduled",211,{"type":143,"name":174,"callback":161,"file":163,"line":175},"admin_init",261,{"type":143,"name":174,"callback":161,"file":163,"line":177},262,{"type":143,"name":179,"callback":161,"file":163,"line":180},"admin_menu",263,{"type":143,"name":179,"callback":161,"file":163,"line":182},264,{"type":143,"name":179,"callback":161,"file":163,"line":184},265,{"type":143,"name":179,"callback":161,"file":163,"line":186},266,{"type":143,"name":188,"callback":189,"file":163,"line":190},"admin_post_pushpull_save_domains","handleSave",267,{"type":143,"name":192,"callback":193,"file":163,"line":194},"admin_post_pushpull_test_connection","handleTestConnection",268,{"type":143,"name":196,"callback":197,"file":163,"line":198},"admin_post_pushpull_reset_local_repository","handleResetLocalRepository",269,{"type":143,"name":200,"callback":201,"file":163,"line":202},"admin_post_pushpull_reset_remote_branch","handleResetRemoteBranch",270,{"type":143,"name":204,"callback":205,"file":163,"line":206},"admin_post_pushpull_initialize_remote_repository","handleInitializeRemoteRepository",271,{"type":143,"name":208,"callback":209,"file":163,"line":210},"admin_post_pushpull_commit_managed_set","handleCommit",272,{"type":143,"name":212,"callback":213,"file":163,"line":214},"admin_post_pushpull_pull_managed_set","handlePull",273,{"type":143,"name":216,"callback":217,"file":163,"line":218},"admin_post_pushpull_fetch_managed_set","handleFetch",274,{"type":143,"name":220,"callback":221,"file":163,"line":222},"admin_post_pushpull_merge_managed_set","handleMerge",275,{"type":143,"name":224,"callback":225,"file":163,"line":226},"admin_post_pushpull_apply_managed_set","handleApply",276,{"type":143,"name":228,"callback":229,"file":163,"line":230},"admin_post_pushpull_push_managed_set","handlePush",277,{"type":143,"name":232,"callback":233,"file":163,"line":234},"admin_post_pushpull_commit_push_all","handleCommitPushAll",278,{"type":143,"name":236,"callback":237,"file":163,"line":238},"admin_post_pushpull_pull_apply_all","handlePullApplyAll",279,{"type":143,"name":240,"callback":241,"file":163,"line":242},"admin_post_pushpull_resolve_conflict_managed_set","handleResolveConflict",282,{"type":143,"name":244,"callback":245,"file":163,"line":246},"admin_post_pushpull_finalize_merge_managed_set","handleFinalizeMerge",283,{"type":143,"name":248,"callback":249,"file":163,"line":250},"admin_enqueue_scripts","enqueueAssets",284,{"type":143,"name":248,"callback":249,"file":163,"line":252},285,{"type":143,"name":248,"callback":249,"file":163,"line":254},286,{"type":143,"name":248,"callback":249,"file":163,"line":256},287,[258,263],{"action":259,"nopriv":260,"callback":261,"hasNonce":260,"hasCapCheck":260,"file":163,"line":262},"pushpull_start_branch_action",false,"handleAjaxStartBranchAction",280,{"action":264,"nopriv":260,"callback":265,"hasNonce":260,"hasCapCheck":260,"file":163,"line":266},"pushpull_continue_branch_action","handleAjaxContinueBranchAction",281,[],[],[],2,{"dangerousFunctions":272,"sqlUsage":281,"outputEscaping":284,"fileOperations":270,"externalRequests":32,"nonceChecks":158,"capabilityChecks":108,"bundledLibraries":287},[273,277],{"fn":274,"file":275,"line":65,"context":276},"unserialize","src\u002FContent\u002FGenerateBlocks\u002FGenerateBlocksConditionsAdapter.php",": @unserialize($conditions, ['allowed_classes' => false]);",{"fn":274,"file":278,"line":279,"context":280},"src\u002FContent\u002FGenerateBlocks\u002FGenerateBlocksGlobalStylesAdapter.php",512,": @unserialize($styleData, ['allowed_classes' => false]);",{"prepared":282,"raw":11,"locations":283},27,[],{"escaped":285,"rawEcho":11,"locations":286},381,[],[],[289],{"entryPoint":290,"graph":291,"unsanitizedCount":11,"severity":308},"\u003CManagedContentPage> (src\u002FAdmin\u002FManagedContentPage.php:0)",{"nodes":292,"edges":305},[293,299],{"id":294,"type":295,"label":296,"file":297,"line":298},"n0","source","$_POST (x2)","src\u002FAdmin\u002FManagedContentPage.php",1414,{"id":300,"type":301,"label":302,"file":297,"line":303,"wp_function":304},"n1","sink","echo() [XSS]",2078,"echo",[306],{"from":294,"to":300,"sanitized":307},true,"low",{"summary":310,"deductions":311},"The 'pushpull' plugin v0.0.20 presents a mixed security posture. On the positive side, it demonstrates excellent adherence to secure coding practices by utilizing prepared statements for all SQL queries and ensuring 100% of its outputs are properly escaped. The plugin also incorporates a substantial number of nonce and capability checks, indicating an awareness of WordPress security best practices for authenticated actions.\n\nHowever, significant concerns arise from the identified attack surface. The plugin exposes two AJAX handlers, and critically, both of these lack any authentication checks. This creates a direct pathway for unauthenticated users to interact with plugin functionality, potentially leading to unintended consequences or exploitation of underlying vulnerabilities. While the static analysis and taint analysis found no immediate critical or high severity issues related to data sanitization or dangerous function usage (like unserialize), the unprotected entry points remain a significant risk.\n\nFurthermore, the complete absence of known vulnerabilities in its history is a positive indicator, suggesting a well-maintained codebase or limited exposure. Nevertheless, this does not negate the inherent risk posed by the unprotected AJAX endpoints. In conclusion, while the plugin excels in areas like SQL prepared statements and output escaping, the unauthenticated AJAX handlers represent a glaring security weakness that requires immediate attention. The overall risk is moderate, heavily influenced by the potential for exploitation of these unprotected entry points.",[312,314],{"reason":313,"points":152},"Unprotected AJAX handlers",{"reason":315,"points":132},"Dangerous function 'unserialize' used","2026-04-16T14:41:32.336Z",{"wat":318,"direct":325},{"assetPaths":319,"generatorPatterns":321,"scriptPaths":322,"versionParams":323},[320],"\u002Fwp-content\u002Fplugins\u002Fpushpull\u002Fplugin-assets\u002Fcss\u002Fadmin.css",[],[],[324],"pushpull\u002Fplugin-assets\u002Fcss\u002Fadmin.css?ver=",{"cssClasses":326,"htmlComments":330,"htmlAttributes":331,"restEndpoints":336,"jsGlobals":337,"shortcodeOutput":338},[327,328,329],"pushpull-admin","pushpull-intro","pushpull-domain-source-grid",[],[332,333,334,335],"name=\"action\"","value=\"pushpull_save_domains\"","name=\"_wpnonce\"","name=\"_wp_http_referer\"",[],[],[],{"error":307,"url":340,"statusCode":341,"statusMessage":342,"message":342},"http:\u002F\u002Flocalhost\u002Fapi\u002Fplugins\u002Fpushpull\u002Fbundle",404,"no bundle for this plugin yet",{"slug":4,"current_version":6,"total_versions":158,"versions":344},[345,350,357,364,371,378,385,392,399,406,413,420,427,434,441,448,455,462],{"version":6,"download_url":24,"svn_tag_url":346,"released_at":26,"has_diff":260,"diff_files_changed":347,"diff_lines":26,"trac_diff_url":348,"vulnerabilities":349,"is_current":307},"https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.20\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.19&new_path=%2Fpushpull%2Ftags%2F0.0.20",[],{"version":351,"download_url":352,"svn_tag_url":353,"released_at":26,"has_diff":260,"diff_files_changed":354,"diff_lines":26,"trac_diff_url":355,"vulnerabilities":356,"is_current":260},"0.0.19","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.19.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.19\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.18&new_path=%2Fpushpull%2Ftags%2F0.0.19",[],{"version":358,"download_url":359,"svn_tag_url":360,"released_at":26,"has_diff":260,"diff_files_changed":361,"diff_lines":26,"trac_diff_url":362,"vulnerabilities":363,"is_current":260},"0.0.18","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.18.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.18\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.17&new_path=%2Fpushpull%2Ftags%2F0.0.18",[],{"version":365,"download_url":366,"svn_tag_url":367,"released_at":26,"has_diff":260,"diff_files_changed":368,"diff_lines":26,"trac_diff_url":369,"vulnerabilities":370,"is_current":260},"0.0.17","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.17.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.17\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.16&new_path=%2Fpushpull%2Ftags%2F0.0.17",[],{"version":372,"download_url":373,"svn_tag_url":374,"released_at":26,"has_diff":260,"diff_files_changed":375,"diff_lines":26,"trac_diff_url":376,"vulnerabilities":377,"is_current":260},"0.0.16","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.16.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.16\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.15&new_path=%2Fpushpull%2Ftags%2F0.0.16",[],{"version":379,"download_url":380,"svn_tag_url":381,"released_at":26,"has_diff":260,"diff_files_changed":382,"diff_lines":26,"trac_diff_url":383,"vulnerabilities":384,"is_current":260},"0.0.15","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.15.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.15\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.14&new_path=%2Fpushpull%2Ftags%2F0.0.15",[],{"version":386,"download_url":387,"svn_tag_url":388,"released_at":26,"has_diff":260,"diff_files_changed":389,"diff_lines":26,"trac_diff_url":390,"vulnerabilities":391,"is_current":260},"0.0.14","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.14.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.14\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.13&new_path=%2Fpushpull%2Ftags%2F0.0.14",[],{"version":393,"download_url":394,"svn_tag_url":395,"released_at":26,"has_diff":260,"diff_files_changed":396,"diff_lines":26,"trac_diff_url":397,"vulnerabilities":398,"is_current":260},"0.0.13","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.13.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.13\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.12&new_path=%2Fpushpull%2Ftags%2F0.0.13",[],{"version":400,"download_url":401,"svn_tag_url":402,"released_at":26,"has_diff":260,"diff_files_changed":403,"diff_lines":26,"trac_diff_url":404,"vulnerabilities":405,"is_current":260},"0.0.12","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.12.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.12\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.11&new_path=%2Fpushpull%2Ftags%2F0.0.12",[],{"version":407,"download_url":408,"svn_tag_url":409,"released_at":26,"has_diff":260,"diff_files_changed":410,"diff_lines":26,"trac_diff_url":411,"vulnerabilities":412,"is_current":260},"0.0.11","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.11.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.11\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.10&new_path=%2Fpushpull%2Ftags%2F0.0.11",[],{"version":414,"download_url":415,"svn_tag_url":416,"released_at":26,"has_diff":260,"diff_files_changed":417,"diff_lines":26,"trac_diff_url":418,"vulnerabilities":419,"is_current":260},"0.0.10","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.10.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.10\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.9&new_path=%2Fpushpull%2Ftags%2F0.0.10",[],{"version":421,"download_url":422,"svn_tag_url":423,"released_at":26,"has_diff":260,"diff_files_changed":424,"diff_lines":26,"trac_diff_url":425,"vulnerabilities":426,"is_current":260},"0.0.9","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.9.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.9\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.8&new_path=%2Fpushpull%2Ftags%2F0.0.9",[],{"version":428,"download_url":429,"svn_tag_url":430,"released_at":26,"has_diff":260,"diff_files_changed":431,"diff_lines":26,"trac_diff_url":432,"vulnerabilities":433,"is_current":260},"0.0.8","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.8.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.8\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.7&new_path=%2Fpushpull%2Ftags%2F0.0.8",[],{"version":435,"download_url":436,"svn_tag_url":437,"released_at":26,"has_diff":260,"diff_files_changed":438,"diff_lines":26,"trac_diff_url":439,"vulnerabilities":440,"is_current":260},"0.0.7","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.7.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.7\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.6&new_path=%2Fpushpull%2Ftags%2F0.0.7",[],{"version":442,"download_url":443,"svn_tag_url":444,"released_at":26,"has_diff":260,"diff_files_changed":445,"diff_lines":26,"trac_diff_url":446,"vulnerabilities":447,"is_current":260},"0.0.6","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.6.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.6\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.5&new_path=%2Fpushpull%2Ftags%2F0.0.6",[],{"version":449,"download_url":450,"svn_tag_url":451,"released_at":26,"has_diff":260,"diff_files_changed":452,"diff_lines":26,"trac_diff_url":453,"vulnerabilities":454,"is_current":260},"0.0.5","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.5.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.5\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.4&new_path=%2Fpushpull%2Ftags%2F0.0.5",[],{"version":456,"download_url":457,"svn_tag_url":458,"released_at":26,"has_diff":260,"diff_files_changed":459,"diff_lines":26,"trac_diff_url":460,"vulnerabilities":461,"is_current":260},"0.0.4","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.4.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.4\u002F",[],"https:\u002F\u002Fplugins.trac.wordpress.org\u002Fchangeset?old_path=%2Fpushpull%2Ftags%2F0.0.3&new_path=%2Fpushpull%2Ftags%2F0.0.4",[],{"version":463,"download_url":464,"svn_tag_url":465,"released_at":26,"has_diff":260,"diff_files_changed":466,"diff_lines":26,"trac_diff_url":26,"vulnerabilities":467,"is_current":260},"0.0.3","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.3.zip","https:\u002F\u002Fplugins.svn.wordpress.org\u002Fpushpull\u002Ftags\u002F0.0.3\u002F",[],[]]