[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f4rgvHndFav3_oSJ0-O9lLSdqYgvej4b1mUpUZ90y_Ss":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":23,"download_link":24,"security_score":25,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27,"vulnerabilities":28,"developer":29,"crawl_stats":26,"alternatives":36,"analysis":137,"fingerprints":684},"praison-file-content-git","PraisonAI Git Posts","1.0.6","Mervin Praison","https:\u002F\u002Fprofiles.wordpress.org\u002Fmervinpraison\u002F","\u003Cp>\u003Cstrong>PraisonAI Git Posts\u003C\u002Fstrong> is a revolutionary WordPress plugin that enables file-based content management with Git version control integration. Store your posts, pages, and custom post types as Markdown files while maintaining full WordPress compatibility.\u003C\u002Fp>\n\u003Ch4>Key Features\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Cstrong>File-Based Content Management\u003C\u002Fstrong> – Store all content as Markdown files\u003C\u002Fli>\n\u003Cli>\u003Cstrong>No Database Writes\u003C\u002Fstrong> – Pure read-only approach for content\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Git Version Control\u003C\u002Fstrong> – Track changes with full Git integration\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Dynamic Post Type Discovery\u003C\u002Fstrong> – Automatically registers post types from directory structure\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Custom URL Routing\u003C\u002Fstrong> – Beautiful URLs for any post type (e.g., \u003Ccode>\u002Frecipes\u002Fsong-name\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>YAML Front Matter\u003C\u002Fstrong> – Rich metadata support\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Caching System\u003C\u002Fstrong> – Built-in performance optimization\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Auto-Update Detection\u003C\u002Fstrong> – Content updates automatically when files change\u003C\u002Fli>\n\u003Cli>\u003Cstrong>WordPress Compatible\u003C\u002Fstrong> – Works with themes, plugins, and filters\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Developer Friendly\u003C\u002Fstrong> – Clean, extensible architecture\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Perfect For\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Developers who prefer Git workflows\u003C\u002Fli>\n\u003Cli>Teams collaborating on content\u003C\u002Fli>\n\u003Cli>Sites requiring version control\u003C\u002Fli>\n\u003Cli>Static site generators transitioning to WordPress\u003C\u002Fli>\n\u003Cli>Content stored in version control repositories\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>How It Works\u003C\u002Fh4>\n\u003Col>\n\u003Cli>Create a \u003Ccode>content\u002F\u003C\u002Fcode> directory at your WordPress root\u003C\u002Fli>\n\u003Cli>Add Markdown files with YAML front matter\u003C\u002Fli>\n\u003Cli>Plugin automatically discovers and loads content\u003C\u002Fli>\n\u003Cli>Create new post types by simply adding directories\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Example Post\u003C\u002Fh4>\n\u003Cp>    `markdown\u003C\u002Fp>\n\u003Cp>title: “My Post Title”\u003Cbr \u002F>\nslug: “my-post-slug”\u003Cbr \u002F>\nauthor: “admin”\u003Cbr \u002F>\ndate: “2024-10-31 12:00:00”\u003Cbr \u002F>\nstatus: “publish”\u003Cbr \u002F>\ncategories:\u003Cbr \u002F>\n  – “General”\u003Cbr \u002F>\ntags:\u003C\u002Fp>\n\u003Cp>  – “example”\u003C\u002Fp>\n\u003Cp>Your content here\u003C\u002Fp>\n\u003Cp>Write your content in \u003Cstrong>Markdown\u003C\u002Fstrong> format.\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Ch4>Requirements\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>WordPress 5.0 or higher\u003C\u002Fli>\n\u003Cli>PHP 7.4 or higher\u003C\u002Fli>\n\u003Cli>Git (optional, for version control features)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>External Services\u003C\u002Fh3>\n\u003Cp>This plugin connects to external services for certain features:\u003C\u002Fp>\n\u003Ch4>GitHub API\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>What it is:\u003C\u002Fstrong> GitHub’s REST API (https:\u002F\u002Fapi.github.com) is used for version control and collaboration features.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>When it’s used:\u003C\u002Fstrong> The plugin connects to GitHub API when you:\u003Cbr \u002F>\n– Enable GitHub OAuth authentication\u003Cbr \u002F>\n– Create or manage pull requests\u003Cbr \u002F>\n– Sync content with a GitHub repository\u003Cbr \u002F>\n– View pull request details and changes\u003C\u002Fp>\n\u003Cp>\u003Cstrong>What data is sent:\u003C\u002Fstrong>\u003Cbr \u002F>\n– Repository information (owner, name)\u003Cbr \u002F>\n– Authentication tokens (OAuth)\u003Cbr \u002F>\n– Commit messages and file changes\u003Cbr \u002F>\n– Pull request data\u003C\u002Fp>\n\u003Cp>\u003Cstrong>User consent:\u003C\u002Fstrong> GitHub features are optional and only activated when you configure GitHub integration in the plugin settings. No data is sent to GitHub unless you explicitly enable and configure GitHub features.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Service information:\u003C\u002Fstrong>\u003Cbr \u002F>\n– Service provider: GitHub, Inc.\u003Cbr \u002F>\n– Terms of service: https:\u002F\u002Fdocs.github.com\u002Fen\u002Fsite-policy\u002Fgithub-terms\u002Fgithub-terms-of-service\u003Cbr \u002F>\n– Privacy policy: https:\u002F\u002Fdocs.github.com\u002Fen\u002Fsite-policy\u002Fprivacy-policies\u002Fgithub-privacy-statement\u003C\u002Fp>\n\u003Ch3>Development\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>GitHub Repository: https:\u002F\u002Fgithub.com\u002FMervinPraison\u002FPraisonAI-Git-Posts\u003C\u002Fli>\n\u003Cli>Report Issues: https:\u002F\u002Fgithub.com\u002FMervinPraison\u002FPraisonAI-Git-Posts\u002Fissues\u003C\u002Fli>\n\u003Cli>Author Website: https:\u002F\u002Fmer.vin\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Credits\u003C\u002Fh3>\n\u003Cp>Developed by MervinPraison\u003C\u002Fp>\n","Load WordPress content from files (Markdown, JSON, YAML) without database writes, with Git-based version control.",0,102,"2025-12-24T08:28:00.000Z","6.9.4","5.0","7.4",[18,19,20,21,22],"content-management","file-based","git","markdown","version-control","","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpraison-file-content-git.1.0.6.zip",100,null,"2026-03-15T15:16:48.613Z",[],{"slug":30,"display_name":7,"profile_url":8,"plugin_count":31,"total_installs":32,"avg_security_score":25,"avg_patch_time_days":33,"trust_score":34,"computed_at":35},"mervinpraison",7,2500,266,79,"2026-04-04T15:22:57.595Z",[37,56,79,100,117],{"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":16,"tags":51,"homepage":54,"download_link":55,"security_score":25,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"gitium","Gitium","1.2.2","Presslabs","https:\u002F\u002Fprofiles.wordpress.org\u002Fpresslabs\u002F","\u003Cp>Automatic git version control and deployment for your plugins and themes integrated into wp-admin.\u003C\u002Fp>\n\u003Ch3>About the makers\u003C\u002Fh3>\n\u003Cp>This plugin was developed by the crafty people at Presslabs—the Smart Managed WordPress Hosting Platform. Here we bring high-performance hosting and business intelligence for WordPress sites. In our spare time, we contribute to the global open-source community with our code.\u003C\u002Fp>\n\u003Cp>We’ve built Gitium back in 2013 to provide our clients a more simple and error-free method to integrate a new git version control into their code management flow.\u003C\u002Fp>\n\u003Ch3>What is Gitium?\u003C\u002Fh3>\n\u003Cp>This plugin enables continuous deployment for WordPress, integrating with tools such as Github, Bitbucket or Travis-CI. Theme or plugin updates, installs and removals are all automatically versioned. Ninja code edits from the WordPress editor are also tracked by the version control system.\u003C\u002Fp>\n\u003Ch3>Why is Gitium?\u003C\u002Fh3>\n\u003Cp>Gitium is designed with responsible development environments in mind, allowing staging and production to follow different branches of the same repository. You can also deploy code by simply using git push.\u003C\u002Fp>\n\u003Cp>Gitium requires git command line tool with a minimum version of 1.7 installed on the server and the proc_open PHP function enabled.\u003C\u002Fp>\n\u003Ch3>Gitium features:\u003C\u002Fh3>\n\u003Cp>-preserves the WordPress behavior\u003Cbr \u002F>\n-accountability for code changes\u003Cbr \u002F>\n-safe code storage—gets all code edits in Git\u003C\u002Fp>\n\u003Ch3>Development\u003C\u002Fh3>\n\u003Cp>For more details about Gitium, head here: http:\u002F\u002Fdocs.presslabs.com\u002Fgitium\u002Fusage\u002F\u003C\u002Fp>\n\u003Ch3>Receiving is nicer when giving\u003C\u002Fh3>\n\u003Cp>We’ve built this to make our lives easier and we’re happy to do that for other developers, too. We’d really appreciate it if you could contribute with code, tests, documentation or just share your experience with Gitium.\u003C\u002Fp>\n\u003Cp>Development of Gitium happens at http:\u002F\u002Fgithub.com\u002FPressLabs\u002Fgitium\u003Cbr \u002F>\nIssues are tracked at http:\u002F\u002Fgithub.com\u002FPressLabs\u002Fgitium\u002Fissues\u003Cbr \u002F>\nThis WordPress plugin can be found at https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fgitium\u002F\u003C\u002Fp>\n","Automatic git version control and deployment for your plugins and themes integrated into wp-admin.",400,21917,82,10,"2025-12-10T10:26:00.000Z","4.7",[20,38,52,53,22],"presslabs","revision","https:\u002F\u002Fwww.presslabs.com\u002Fgitium\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fgitium.1.2.2.zip",{"slug":57,"name":58,"version":59,"author":60,"author_profile":61,"description":62,"short_description":63,"active_installs":64,"downloaded":65,"rating":25,"num_ratings":66,"last_updated":67,"tested_up_to":68,"requires_at_least":69,"requires_php":70,"tags":71,"homepage":76,"download_link":77,"security_score":78,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"documents-from-git","Documents from Git","2.2.0","nilsnolde","https:\u002F\u002Fprofiles.wordpress.org\u002Fnilsnolde\u002F","\u003Cp>Official documentation: https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Fwordpress-markdown-git\u003C\u002Fp>\n\u003Cp>This WordPress Plugin lets you easily publish, collaborate on and version control your [\u003Cstrong>Markdown, Jupyter notebook\u003C\u002Fstrong>] documents directly from your favorite remote Git platform, \u003Cstrong>even if it’s self-hosted\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>The advantages are:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Write documents in your favorite editor and just push to your remote repository to update your blog instantly\u003C\u002Fli>\n\u003Cli>Use the power of version control: publish different versions of the document in different posts, i.e. from another branch or commit than latest \u003Ccode>master\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Easy to update by your readers via pull requests, minimizing the chance of stale tutorials\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The following document types are currently supported:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Markdown\u003C\u002Fli>\n\u003Cli>Jupyter notebooks (\u003Cstrong>only for public repositories\u003C\u002Fstrong>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The following platforms are currently supported:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Github\u003C\u002Fli>\n\u003Cli>Bitbucket\u003C\u002Fli>\n\u003Cli>Gitlab\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Usage\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Note\u003C\u002Fstrong>, this plugin uses Github’s wonderful \u003Ca href=\"https:\u002F\u002Fdeveloper.github.com\u002Fv3\u002Fmarkdown\u002F\" rel=\"nofollow ugc\">\u003Ccode>\u002Fmarkdown\u003C\u002Fcode> API\u003C\u002Fa> to render to HTML. This comes with 2 caveats:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Unless authenticated, the rate limit is set at 60 requests per minute. Since v1.1.0 the plugin is capable of statically \u003Ca href=\"#caching\" rel=\"nofollow ugc\">caching content\u003C\u002Fa>. In case that’s not dynamic enough for you, your only option currently is to not use any cache in which case every document will be pulled from your provider every time someone opens it on your site. Then it’s \u003Cstrong>strongly recommended\u003C\u002Fstrong> to create a Github access token and register it with the plugin. Then the rate limit will be set to 5000 requests per hour. See \u003Ca href=\"#global-attributes\" rel=\"nofollow ugc\">Global attributes section\u003C\u002Fa> for details on how to do that.\u003C\u002Fli>\n\u003Cli>The Markdown content cannot exceed 400 KB, so roughly 400 000 characters incl whitespace. If not a monographic dissertation, this should not be an applicable limit though.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Shortcodes\u003C\u002Fh3>\n\u003Cp>The plugin features a variety of shortcodes.\u003C\u002Fp>\n\u003Ch4>Publish documents\u003C\u002Fh4>\n\u003Cp>The document-specific shortcodes follow a pattern of \u003Ccode>[git-\u003Cplatform>-\u003Caction>]\u003C\u002Fcode>, where\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u003Cplatform>\u003C\u002Fcode> can be one of\n\u003Cul>\n\u003Cli>\u003Ccode>github\u003C\u002Fcode>: if you use Github as your VCS platform\u003C\u002Fli>\n\u003Cli>\u003Ccode>bitbucket\u003C\u002Fcode>: if you use Bitbucket as your VCS platform\u003C\u002Fli>\n\u003Cli>\u003Ccode>gitlab\u003C\u002Fcode>: if you use Gitlab as your VCS platform\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u003Caction>\u003C\u002Fcode> can be one of\n\u003Cul>\n\u003Cli>\u003Ccode>markdown\u003C\u002Fcode>: Render your Markdown files hosted on your VCS platform in Github’s rendering style\u003C\u002Fli>\n\u003Cli>\u003Ccode>jupyter\u003C\u002Fcode>: Render your Jupyter notebook hosted on your VCS platfrom (\u003Cstrong>only for public repositories\u003C\u002Fstrong>)\u003C\u002Fli>\n\u003Cli>\u003Ccode>checkout\u003C\u002Fcode>: Renders a small badge-like box with a link to the document and the date of the last commit\u003C\u002Fli>\n\u003Cli>\u003Ccode>history\u003C\u002Fcode>:  Renders a \u003Ccode>\u003Ch2>\u003C\u002Fcode> section with the last commit dates, messages and authors\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Manipulate rendering style\u003C\u002Fh4>\n\u003Cp>Additionally, there’s an enclosing shortcode \u003Ccode>[git-add-css]\u003C\u002Fcode> which adds a \u003Ccode>\u003Cdiv id=\"git-add-css\" class=\"\u003Cclasses_attribute>\"\u003C\u002Fcode> to wrap its contents. That way you can manipulate the style freely with additional CSS classes. Follow these steps:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Add a CSS file to your theme’s root folder, which contains some classes, e.g. \u003Ccode>class1\u003C\u002Fcode>, \u003Ccode>class2\u003C\u002Fcode>, \u003Ccode>class3\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Enqueue the CSS file by adding \u003Ccode>wp_enqueue_style('my-style', get_template_directory_uri().'\u002Fmy-style.css');\u003C\u002Fcode> to the theme’s \u003Ccode>functions.php\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Add the enclosing \u003Ccode>git-add-css\u003C\u002Fcode> shortcode to your post with the custom CSS classes in the \u003Ccode>classes\u003C\u002Fcode> attribute, e.g.:\u003C\u002Fp>\n\u003Cp>\u003Ccode>[git-add-css classes=\"class1 class2 class3\"]\u003Cbr \u002F>\n[git-gitlab-checkout url=...]\u003Cbr \u002F>\n[git-gitlab-markdown url=...]\u003Cbr \u002F>\n[git-gitlab-history url=...]\u003Cbr \u002F>\n[\u002Fgit-add-css]\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Attributes\u003C\u002Fh3>\n\u003Cp>Each shortcode takes a few attributes, indicating if it’s required for public or private repositories:\u003C\u002Fp>\n\u003Cp>  Attribute\u003Cbr \u002F>\n  Action\u003Cbr \u002F>\n  Public repo\u003Cbr \u002F>\n  Private repo\u003Cbr \u002F>\n  Type\u003Cbr \u002F>\n  Description\u003C\u002Fp>\n\u003Cp>  \u003Ccode>url\u003C\u002Fcode>\u003Cbr \u002F>\n  all except \u003Ccode>git-add-css\u003C\u002Fcode>\u003Cbr \u002F>\n  :ballot_box_with_check:\u003Cbr \u002F>\n  :ballot_box_with_check:\u003Cbr \u002F>\n  string\u003Cbr \u002F>\n  The browser URL of the document, e.g. https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Fwordpress-markdown-git\u002Fblob\u002Fmaster\u002FREADME.md\u003C\u002Fp>\n\u003Cp>  \u003Ccode>user\u003C\u002Fcode>\u003Cbr \u002F>\n  all except \u003Ccode>git-add-css\u003C\u002Fcode>\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  :ballot_box_with_check:\u003Cbr \u002F>\n  string\u003Cbr \u002F>\n  The \u003Cstrong>user name\u003C\u002Fstrong> (not email) of an authorized user\u003C\u002Fp>\n\u003Cp>  \u003Ccode>token\u003C\u002Fcode>\u003Cbr \u002F>\n  all except \u003Ccode>git-add-css\u003C\u002Fcode>\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  :ballot_box_with_check:\u003Cbr \u002F>\n  string\u003Cbr \u002F>\n  The access token\u002Fapp password for the authorized user\u003C\u002Fp>\n\u003Cp>  \u003Ccode>cache_ttl\u003C\u002Fcode>\u003Cbr \u002F>\n  all except \u003Ccode>git-add-css\u003C\u002Fcode>\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  integer\u003Cbr \u002F>\n  The time in seconds that the plugin will cache, \u003Cstrong>only for \u003Ccode>cache_strategy=static\u003C\u002Fcode>\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>  \u003Ccode>cache_strategy\u003C\u002Fcode>\u003Cbr \u002F>\n  all except \u003Ccode>git-add-css\u003C\u002Fcode>\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  integer\u003Cbr \u002F>\n  Only \u003Ccode>static\u003C\u002Fcode> caching is implemented so far. \u003Ccode>dynamic\u003C\u002Fcode> caching is on the way!\u003C\u002Fp>\n\u003Cp>  \u003Ccode>limit\u003C\u002Fcode>\u003Cbr \u002F>\n  \u003Ccode>history\u003C\u002Fcode>\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  :negative_squared_cross_mark:\u003Cbr \u002F>\n  integer\u003Cbr \u002F>\n  Limits the history of commits to this number. Default 5.\u003C\u002Fp>\n\u003Cp>  \u003Ccode>classes\u003C\u002Fcode>\u003Cbr \u002F>\n  \u003Ccode>git-add-css\u003C\u002Fcode>\u003Cbr \u002F>\n  :ballot_box_with_check:\u003Cbr \u002F>\n  :ballot_box_with_check:\u003Cbr \u002F>\n  string\u003Cbr \u002F>\n  The additional CSS classes to render the content with\u003C\u002Fp>\n\u003Ch4>Global attributes\u003C\u002Fh4>\n\u003Cp>Since most attributes will be the same across the entire system, this plugin offers the possibility to set all attributes globally except for \u003Ccode>url\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cp>In the menu \u003Cem>Plugins\u003C\u002Fem> ► \u003Cem>Plugin Editor\u003C\u002Fem>, choose “Documents from Git” and enter your preferences in the \u003Ccode>includes\u002Fconfig.json\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Note\u003C\u002Fstrong>, setting the attributes manually in the shortcode has always precedence over any settings in \u003Ccode>includes\u002Fconfig.json\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch4>Caching\u003C\u002Fh4>\n\u003Cp>Often we need to prioritize speed when loading content and, in addition, it is very costly to fetch, load and format the content every time we need to read the content of the post.\u003C\u002Fp>\n\u003Cp>This plugin soon offers 2 methods for caching, \u003Ccode>static\u003C\u002Fcode> and \u003Ccode>dynamic\u003C\u002Fcode> which can be set via the \u003Ccode>cache_strategy\u003C\u002Fcode> property.\u003C\u002Fp>\n\u003Cp>Static caching (\u003Ccode>cache_strategy=static\u003C\u002Fcode>)\u003C\u002Fp>\n\u003Cp>This is the default strategy, as it doesn’t require any user action.\u003C\u002Fp>\n\u003Cp>The property \u003Ccode>cache_ttl\u003C\u002Fcode> sets how many \u003Cstrong>seconds\u003C\u002Fstrong> the content cache will keep alive.\u003C\u002Fp>\n\u003Cp>Currently there’s no way to flush the cache manually. However, changing \u003Ccode>cache_ttl\u003C\u002Fcode> or the history \u003Ccode>limit\u003C\u002Fcode> will create a new cache.\u003C\u002Fp>\n\u003Cp>Dynamic caching (\u003Ccode>cache_strategy=dynamic\u003C\u002Fcode>)\u003C\u002Fp>\n\u003Cp>\u003Cstrong>This is not implemented yet\u003C\u002Fstrong>. See \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Fwordpress-markdown-git\u002Fissues\u002F20\" rel=\"nofollow ugc\">#20\u003C\u002Fa> for details.\u003C\u002Fp>\n\u003Ch4>\u003Ccode>Token\u003C\u002Fcode> authorization\u003C\u002Fh4>\n\u003Cp>You \u003Cstrong>need to\u003C\u002Fstrong> authorize via \u003Ccode>user\u003C\u002Fcode> and \u003Ccode>token\u003C\u002Fcode> if you intend to publish from a private repository. You \u003Cstrong>don’t need to\u003C\u002Fstrong> authorize if the repository is open.\u003C\u002Fp>\n\u003Cp>However, keep in mind that some platforms have stricter API limits for anonymous requests which are greatly extended if you provide your credentials. So even for public repos it could make sense. And unless you use this plugin’s \u003Ca href=\"#caching\" rel=\"nofollow ugc\">caching capabilities\u003C\u002Fa>, it’s strongly recommended to register a Github access token regardless of the VCS hosting platform, see the \u003Ca href=\"#usage\" rel=\"nofollow ugc\">beginning of the chapter\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>How to generate the \u003Ccode>token\u003C\u002Fcode> depends on your platform:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Github: Generate a Personal Access Token following \u003Ca href=\"https:\u002F\u002Fhelp.github.com\u002Fen\u002Fgithub\u002Fauthenticating-to-github\u002Fcreating-a-personal-access-token-for-the-command-line\" rel=\"nofollow ugc\">these instructions\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>Bitbucket: Generate a App Password following \u003Ca href=\"https:\u002F\u002Fconfluence.atlassian.com\u002Fbitbucket\u002Fapp-passwords-828781300.html#Apppasswords-Createanapppassword\" rel=\"nofollow ugc\">these instructions\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>Gitlab: Generate a Personal Access Token following \u003Ca href=\"https:\u002F\u002Fdocs.gitlab.com\u002Fee\u002Fuser\u002Fprofile\u002Fpersonal_access_tokens.html#creating-a-personal-access-token\" rel=\"nofollow ugc\">these instructions\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>This plugin needs only \u003Cstrong>Read access\u003C\u002Fstrong> to your repositories. Keep that in mind when creating an access token.\u003C\u002Fp>\n\u003Ch3>Examples\u003C\u002Fh3>\n\u003Cp>We publish our own tutorials with this plugin: https:\u002F\u002Fgis-ops.com\u002Ftutorials\u002F.\u003C\u002Fp>\n\u003Ch4>Publish Markdown from Github\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>[git-github-markdown url=\"https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Ftutorials\u002Fblob\u002Fmaster\u002Fqgis\u002FQGIS_SimplePlugin.md\"]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Publish Markdown from Github with 1 hour cache\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>[git-github-markdown url=\"https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Ftutorials\u002Fblob\u002Fmaster\u002Fqgis\u002FQGIS_SimplePlugin.md\" cache_ttl=\"3600\" cache_strategy=\"static\"]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Publish Jupyter notebook from Github\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>[git-github-jupyter url=\"https:\u002F\u002Fgithub.com\u002FGIScience\u002Fopenrouteservice-examples\u002Fblob\u002Fmaster\u002Fpython\u002Fortools_pubcrawl.ipynb\"]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Publish from a private repository\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>[git-bitbucket-jupyter user=nilsnolde token=3292_2p3a_84-2af url=\"https:\u002F\u002Fbitbucket.org\u002Fnilsnolde\u002Ftest-wp-plugin\u002Fsrc\u002Fmaster\u002FREADME.md\"]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Display last commit and document URL from Bitbucket\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>[git-bitbucket-checkout url=\"https:\u002F\u002Fbitbucket.org\u002Fnilsnolde\u002Ftest-wp-plugin\u002Fsrc\u002Fmaster\u002FREADME.md\"]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Display commit history from Gitlab\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>git-gitlab-history limit=5 url=\"https:\u002F\u002Fgitlab.com\u002Fnilsnolde\u002Fesy-osm-pbf\u002F-\u002Fblob\u002Fmaster\u002FREADME.md\"]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Use additional CSS classes to style\u003C\u002Fh4>\n\u003Cp>The following example will put a dashed box around the whole post:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>[git-add-css classes=”md-dashedbox”]\u003Cbr \u002F>\n    [git-github-checkout url=”https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Ftutorials\u002Fblob\u002Fmaster\u002Fqgis\u002FQGIS_SimplePlugin.md”]\u003Cbr \u002F>\n    [git-github-markdown url=”https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Ftutorials\u002Fblob\u002Fmaster\u002Fqgis\u002FQGIS_SimplePlugin.md”]\u003Cbr \u002F>\n    [git-github-history url=”https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Ftutorials\u002Fblob\u002Fmaster\u002Fqgis\u002FQGIS_SimplePlugin.md”]\u003Cbr \u002F>\n[\u002Fgit-add-css]\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cp>With the following CSS file contents enqueued to your theme:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>`css\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>div.md_dashedbox {\u003Cbr \u002F>\n    position: relative;\u003Cbr \u002F>\n    font-size: 0.75em;\u003Cbr \u002F>\n    border: 3px dashed;\u003Cbr \u002F>\n    padding: 10px;\u003Cbr \u002F>\n    margin-bottom:15px\u003Cbr \u002F>\n}\u003C\u002Fp>\n\u003Cp>div.md_dashedbox div.markdown-github {\u003Cbr \u002F>\n    color:white;\u003Cbr \u002F>\n    line-height: 20px;\u003Cbr \u002F>\n    padding: 0px 5px;\u003Cbr \u002F>\n    position: absolute;\u003Cbr \u002F>\n    background-color: #345;\u003Cbr \u002F>\n    top: -3px;\u003Cbr \u002F>\n    left: -3px;\u003Cbr \u002F>\n    text-transform:none;\u003Cbr \u002F>\n    font-size:1em;\u003Cbr \u002F>\n    font-family: “Helvetica Neue”,Helvetica,Arial,sans-serif;\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n","A plugin to inject and render files in a WordPress post or page directly from most popular Git platforms. Currently supported file types: Markdown, J &hellip;",200,7394,3,"2021-10-09T16:44:00.000Z","5.8.13","5.0.0","7.0",[72,73,74,21,75],"bitbucket","github","jupyter","notebook","https:\u002F\u002Fgithub.com\u002Fgis-ops\u002Fwordpress-markdown-git","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fdocuments-from-git.2.2.0.zip",85,{"slug":80,"name":81,"version":82,"author":83,"author_profile":84,"description":85,"short_description":86,"active_installs":25,"downloaded":87,"rating":88,"num_ratings":31,"last_updated":89,"tested_up_to":90,"requires_at_least":91,"requires_php":92,"tags":93,"homepage":97,"download_link":98,"security_score":99,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"git-it-write","Git it Write – Write posts from GitHub","2.0","vaakash","https:\u002F\u002Fprofiles.wordpress.org\u002Fvaakash\u002F","\u003Cp>Git it Write allows to publish the markdown files present in a GitHub repository to your WordPress site. So with this plugin, whenever the files are added, updated in the repository the WordPress post will be added, updated accordingly.\u003C\u002Fp>\n\u003Cp>This plugin is inspired from static site generators like \u003Ccode>Jekyll\u003C\u002Fcode>, \u003Ccode>Next.js\u003C\u002Fcode>, \u003Ccode>Gatsby.js\u003C\u002Fcode> on how content is written is markdown. This is a similar idea for WordPress where markdown files are parsed from GitHub and published as posts.\u003C\u002Fp>\n\u003Cp>👓 \u003Cstrong>Live example:\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fvaakash\u002Faakash-web\" rel=\"nofollow ugc\">Source github repository\u003C\u002Fa> (\u003Ccode>\u002Fdocs\u002F\u003C\u002Fcode> folder) to \u003Ca href=\"https:\u002F\u002Fwww.aakashweb.com\u002Fdocs\u002F\" rel=\"nofollow ugc\">Posts published\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>⚡ \u003Cstrong>Getting started:\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fwww.aakashweb.com\u002Fdocs\u002Fgit-it-write\u002Fgetting-started\u002F\" rel=\"nofollow ugc\">Get started\u003C\u002Fa> with Git it write. Learn how to write \u003Ccode>.md\u003C\u002Fcode> files and publish posts on WordPress.\u003C\u002Fp>\n\u003Cp>This allows people to collaborate with the post, share edits and suggestions in GitHub which when pulled the WordPress post will be updated automatically.\u003C\u002Fp>\n\u003Cp>If a repository has files in the below structure,\u003C\u002Fp>\n\u003Cpre>\u003Ccode>docs\u002F\n    guide\u002F\n        introduction.md\n        getting-started.md\nhelp\u002F\n    faq.md\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Then below posts will be created like below (if permalinks are configured and the post type supports “hierarchy” i.e creating posts level by level (example: pages))\u003C\u002Fp>\n\u003Cpre>\u003Ccode>https:\u002F\u002Fexample.com\u002Fdocs\u002Fguide\u002Fintroduction\u002F\nhttps:\u002F\u002Fexample.com\u002Fdocs\u002Fguide\u002Fgetting-started\u002F\nhttps:\u002F\u002Fexample.com\u002Fhelp\u002Ffaq\u002F\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>🎲 What is the use of this plugin ?\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Publish posts using the files in your GitHub repository.\u003C\u002Fli>\n\u003Cli>Write your posts in Markdown format.\u003C\u002Fli>\n\u003Cli>Write your posts on your desktop application (Notepad++, Sublime Text, Visual studio code).\u003C\u002Fli>\n\u003Cli>Collaborate, involve communities on the files in GitHub and publish them on WordPress.\u003C\u002Fli>\n\u003Cli>All the advantages of Git and it’s version management system.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>🚀 Some use cases\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Can be used for documentation posts, FAQs, Wikis etc.\u003C\u002Fli>\n\u003Cli>Write blog posts.\u003C\u002Fli>\n\u003Cli>Any articles which may need community involvement.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>✨ Features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Markdown will be processed and post will be published as HTML.\u003C\u002Fli>\n\u003Cli>Images used in the source file will be uploaded to WordPress.\u003C\u002Fli>\n\u003Cli>Relative links are supported.\u003C\u002Fli>\n\u003Cli>Set post properties like post status, title, order, category, tags etc, in the source file itself.\u003C\u002Fli>\n\u003Cli>Webhook support (whenever repository is changed, it updates the plugin to pull the latest changes and publish the posts)\u003C\u002Fli>\n\u003Cli>Add multiple repositories.\u003C\u002Fli>\n\u003Cli>Publish to any post type.\u003C\u002Fli>\n\u003Cli>Posts are published in hierarchial manner if they are under folders. Example: a file \u003Ccode>dir1\u002Fhello.md\u003C\u002Fcode> will be posted as \u003Ccode>dir1\u002Fhello\u002F\u003C\u002Fcode> in WordPress if the post type supports hierarchy.\u003C\u002Fli>\n\u003Cli>Support for post metadata like setting tags, categories, custom fields.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>ℹ Note\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Only Markdown files will be pulled and published right now\u003C\u002Fli>\n\u003Cli>Posts won’t be deleted when it’s source file is deleted on GitHub.\u003C\u002Fli>\n\u003Cli>It is preferred to have a permalink structure.\u003C\u002Fli>\n\u003Cli>It is preferred to select a post type which supports hierarchy.\u003C\u002Fli>\n\u003Cli>Images have to present only in \u003Ccode>_images\u003C\u002Fcode> folder in the repository root. Markdown files have to relatively use them in the file.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>🥗 Recommendation\u003C\u002Fh3>\n\u003Cp>It is recommended that a permalink structure is enabled in the WordPress site so that, if you have file under \u003Ccode>docs\u002Freference\u002Fmy-post.md\u003C\u002Fcode> then a post is published like \u003Ccode>https:\u002F\u002Fexample.com\u002Fdocs\u002Freference\u002Fmy-post\u002F\u003C\u002Fcode>. This will be the result when post type has hierarchy support. They will be posted level by level for every folder in the repository. The folder’s post will be taken from the \u003Ccode>index.md\u003C\u002Fcode> file if exists under that folder.\u003C\u002Fp>\n\u003Ch3>🏃‍♂️ Using the plugin\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Have a GitHub repository where all the source files (markdown files) are maintained (organized in folders if needed the exact structure)\u003C\u002Fli>\n\u003Cli>In the plugin settings page, click add a new repository.\u003C\u002Fli>\n\u003Cli>Enter the details of the repository to pull the posts from and under what post type to publish them.\u003C\u002Fli>\n\u003Cli>Save the settings\u003C\u002Fli>\n\u003Cli>Click “Pull the posts” and then “Pull only” changes. This will publish posts for all the markdown files.\u003C\u002Fli>\n\u003Cli>To automatically update posts whenever repository is updated, configure webhook as mentioned in the settings page.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Links\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwww.aakashweb.com\u002Fdocs\u002Fgit-it-write\u002F\" rel=\"nofollow ugc\">Documentation\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwww.aakashweb.com\u002Fforum\u002F\" rel=\"nofollow ugc\">Support forum\u002FReport bugs\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwww.paypal.me\u002Fvaakash\u002F\" rel=\"nofollow ugc\">Donate\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fvaakash\u002Fgit-it-write\" rel=\"nofollow ugc\">Contribute on GitHub\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n","Publish markdown files present in a GitHub repository as posts to WordPress automatically",7244,94,"2024-08-03T13:38:00.000Z","6.6.5","4.4","5.3",[94,73,21,95,96],"editor","posts","publish","https:\u002F\u002Fwww.aakashweb.com\u002Fwordpress-plugins\u002Fgit-it-write\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fgit-it-write.2.0.zip",92,{"slug":101,"name":102,"version":103,"author":104,"author_profile":105,"description":106,"short_description":107,"active_installs":108,"downloaded":109,"rating":25,"num_ratings":110,"last_updated":111,"tested_up_to":112,"requires_at_least":23,"requires_php":23,"tags":113,"homepage":23,"download_link":116,"security_score":78,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"mytory-markdown","Mytory Markdown","1.6.5","An, Hyeong-woo","https:\u002F\u002Fprofiles.wordpress.org\u002Fmytory\u002F","\u003Cp>The plugin get markdown file URL like github raw content url. The plugin convert markdown file to html, and put it to post content.\u003C\u002Fp>\n\u003Cp>It also provide text mode that write markdown in post edit page. Markdown text converted to html is put to editor. Text mode don’t use url.\u003C\u002Fp>\n\u003Cp>이 플러그인은 마크다운 파일의 URL을 받아서 html로 변환하고 그걸 포스트 내용으로 집어넣습니다.\u003Cbr \u002F>\n기트허브 원본 내용 URL 같은 것을 활용할 수 있습니다.\u003C\u002Fp>\n\u003Cp>포스트 편집 페이지에서 마크다운 텍스트를 작성하는 방법도 제공합니다. 마크다운 텍스트는 html로 변환돼 에디터에 들어갑니다.\u003Cbr \u002F>\n텍스트 모드를 사용하는 경우 URL은 사용하지 않습니다.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=wKcrIvlGVfo\" rel=\"nofollow ugc\">See intro video.\u003C\u002Fa>\u003C\u002Fstrong>\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\u002FwKcrIvlGVfo?version=3&rel=1&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>Now you can migrate from Public link to Dropbox API\u003C\u002Fh4>\n\u003Cp>I made up Mytory Markdown for Dropbox plugin. The plugin access Dropbox using API. So I divide the plugin to Mytory Markdown for Dropbox.\u003Cbr \u002F>\nNow you can install it in plugin page. This video describe how to migrate Public link to Dropbox API.\u003C\u002Fp>\n\u003Cp>Install Mytory Markdown for Dropbox and activate it. Then see a video below.\u003C\u002Fp>\n\u003Cp>[Youtube https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ZmPWMBvGuS4]\u003C\u002Fp>\n\u003Cp>If the video doesn’t be show, \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ZmPWMBvGuS4\" rel=\"nofollow ugc\">click this to go to how to migration video\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch4>이제 Public 링크를 드롭박스 API로 이전할 수 있습니다\u003C\u002Fh4>\n\u003Cp>Mytory Markdown for Dropbox 플러그인을 만들었습니다. API를 이용해서 드롭박스에 접속하는 플러그인입니다. 별도로 만들었습니다.\u003Cbr \u002F>\n지금 플러그인 페이지에서 검색해 설치할 수 있습니다. 아래 비디오는 퍼블릭 링크를 드롭박스 API로 이전하는 방법을 설명합니다.\u003C\u002Fp>\n\u003Cp>Mytory Markdown for Dropbox 플러그인을 설치한 뒤, 활성화하고 아래 비디오를 보세요.\u003C\u002Fp>\n\u003Cp>(비디오는 위에서 보세요.)\u003C\u002Fp>\n\u003Ch4>Features\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>This plugin get markdown file url like github raw content url. It convert markdown file to html, and put it to post content.\u003C\u002Fli>\n\u003Cli>You can update post \u003Cstrong>by editing file on your computer\u003C\u002Fstrong>. e.g. \u003Cstrong>By push your content to github\u003C\u002Fstrong>. Of course, you can edit directly from github website.\u003C\u002Fli>\n\u003Cli>If post was updated once, plugin check only URL server’s ETAG not full content. It is for speed.\u003Cbr \u002F>\nIf ETAG was changed, plugin get new content and update post content. Or do nothing.\u003C\u002Fli>\n\u003Cli>The plugin only pass converted html content to editor. Saving is WordPress’s work. So revision history is preserved.\u003C\u002Fli>\n\u003Cli>The plugin is compatible with other plugins. Because the plugin updates only post content html. This doesn’t touch \u003Ccode>the_content\u003C\u002Fcode> process(vary plugins touch the process).\u003C\u002Fli>\n\u003Cli>You can use \u003Ca href=\"http:\u002F\u002Fmichelf.ca\u002Fprojects\u002Fphp-markdown\u002Fextra\u002F\" rel=\"nofollow ugc\">markdown extra syntax\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>It provide markdown editor that can use in post editing page instead of url.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Logic\u003C\u002Fh4>\n\u003Ch4>On admin page\u003C\u002Fh4>\n\u003Cp>On admin write page, put markdown url path. And click ‘update editor’ button. So markdown content converted to html is putted to editor. \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fmytory-markdown\u002Fscreenshots\u002F\" rel=\"ugc\">See screenshot 1\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch4>On view page\u003C\u002Fh4>\n\u003Cp>This plugin get file url(Github raw content url is recommended). And save header’s etag to postmeta and converted html to post_content.\u003Cbr \u002F>\nNext time on request same post, first this plugin olny get http etag.\u003Cbr \u002F>\nIf changed etag, get md content and save again, or get html from post_content.\u003C\u002Fp>\n\u003Ch4>This plugin divide title and content from md file\u003C\u002Fh4>\n\u003Cp>If markdown file has \u003Ccode>h1\u003C\u002Fcode> this plugin puts first \u003Ccode>h1\u003C\u002Fcode> string to post_title. Of course, remove the \u003Ccode>h1\u003C\u002Fcode> from post_content so don’t print title twice.\u003C\u002Fp>\n\u003Ch4>Source Code\u003C\u002Fh4>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmytory\u002Fmytory-markdown\" rel=\"nofollow ugc\">Mytory Markdown Github\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch4>You can use Multimarkdown 6\u003C\u002Fh4>\n\u003Cp>You can use the Muitimarkdown if you install it on your server. ((Website)[https:\u002F\u002Ffletcher.github.io\u002FMultiMarkdown-6\u002F])\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>Multimarkdown option will be enabled if a multimarkdown execution is on OS PATH and web server can run it.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Otherwise, you can define \u003Ccode>MYTORY_MARKDOWN_MULTIMARKDOWN_EXECUTION\u003C\u002Fcode> constant on \u003Ccode>wp-config.php\u003C\u002Fcode>.\u003Cbr \u002F>\nex) \u003Ccode>define('MYTORY_MARKDOWN_MULTIMARKDOWN_EXECUTION', '\u002Fopt\u002Fmultimarkdown\u002Fbin\u002Fmultimarkdown');\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n","The plugin get markdown file URL like github raw content url. It convert markdown file to html, and put it to post content.",50,10192,8,"2022-11-23T16:37:00.000Z","6.1.10",[73,21,114,115],"markdown-editor","md","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fmytory-markdown.1.6.5.zip",{"slug":118,"name":119,"version":120,"author":121,"author_profile":122,"description":123,"short_description":124,"active_installs":125,"downloaded":126,"rating":25,"num_ratings":127,"last_updated":128,"tested_up_to":129,"requires_at_least":130,"requires_php":23,"tags":131,"homepage":135,"download_link":136,"security_score":78,"vuln_count":11,"unpatched_count":11,"last_vuln_date":26,"fetched_at":27},"github-readme","Github README","0.2.0","Jason Stallings","https:\u002F\u002Fprofiles.wordpress.org\u002Foctalmage\u002F","\u003Cp>Github README is a plugin that allows you to embed markdown from GitHub in a page or post using a simple shortcode.\u003C\u002Fp>\n\u003Cp>Usage:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>github_readme\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>This shortcode embeds the project’s readme.\u003C\u002Fp>\n\u003Cp>[github_readme repo=”octalmage\u002FMarknote”]\u003C\u002Fp>\n\u003Cp>You can also trim lines from the top of the readme using the “trim” option:\u003C\u002Fp>\n\u003Cp>[github_readme repo=”octalmage\u002FMarknote” trim=”3″]\u003C\u002Fp>\n\u003Cp>This is useful for removing titles since your page\u002Fpost will most likely already have one.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>github_markdown\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>This shortcode embeds any markdown file found in the repository.\u003C\u002Fp>\n\u003Cp>[github_markdown repo=”octalmage\u002FMarknote” file=”README.md”]\u003C\u002Fp>\n\u003Cp>trim, branch, and cache (seconds to cache) also supported.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>github_wikipage\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>This shortcode embeds pages from a project’s wiki.\u003C\u002Fp>\n\u003Cp>[github_wikipage repo=”octalmage\u002FMarknote” page=”Syntax”]\u003C\u002Fp>\n\u003Cp>trim and cache also supported.\u003C\u002Fp>\n","Easily embed GitHub READMEs in pages\u002Fposts.",20,3237,4,"2016-06-07T15:07:00.000Z","4.5.33","3.0.1",[132,73,21,133,134],"embed","readme","shortcode","https:\u002F\u002Fgithub.com\u002Foctalmage\u002Fgithub-readme","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fgithub-readme.zip",{"attackSurface":138,"codeSignals":281,"taintFlows":481,"riskAssessment":671,"analyzedAt":683},{"hooks":139,"ajaxHandlers":234,"restRoutes":263,"shortcodes":271,"cronEvents":275,"entryPointCount":48,"unprotectedCount":11},[140,147,153,157,161,163,168,172,175,177,181,186,190,192,196,199,203,207,211,214,217,220,225,229,230],{"type":141,"name":142,"callback":143,"priority":144,"file":145,"line":146},"action","plugins_loaded","closure",1,"praisonpressgit.php",46,{"type":141,"name":148,"callback":149,"priority":150,"file":151,"line":152},"admin_menu","addMenuPage",15,"src\\Admin\\ExportPage.php",17,{"type":141,"name":154,"callback":155,"file":151,"line":156},"admin_enqueue_scripts","enqueueScripts",18,{"type":141,"name":158,"callback":159,"priority":48,"file":151,"line":160},"praison_background_export","backgroundExport",22,{"type":141,"name":154,"callback":155,"file":162,"line":152},"src\\Admin\\HistoryPage.php",{"type":141,"name":148,"callback":164,"priority":165,"file":166,"line":167},"addAdminMenu",25,"src\\Admin\\PullRequestsPage.php",48,{"type":141,"name":169,"callback":170,"file":166,"line":171},"admin_post_praisonpress_merge_pr","handleMergePR",49,{"type":141,"name":173,"callback":174,"file":166,"line":108},"admin_post_praisonpress_close_pr","handleClosePR",{"type":141,"name":154,"callback":155,"file":166,"line":176},51,{"type":141,"name":178,"callback":179,"file":180,"line":156},"rest_api_init","registerRoute","src\\API\\WebhookEndpoint.php",{"type":141,"name":182,"callback":183,"file":184,"line":185},"init","registerPostType","src\\Core\\Bootstrap.php",43,{"type":187,"name":188,"callback":189,"priority":48,"file":184,"line":146},"filter","posts_pre_query","injectFilePosts",{"type":141,"name":148,"callback":164,"file":184,"line":191},54,{"type":141,"name":193,"callback":194,"file":184,"line":195},"wp_dashboard_setup","addDashboardWidget",57,{"type":141,"name":148,"callback":197,"priority":125,"file":184,"line":198},"addHistoryMenu",60,{"type":141,"name":200,"callback":201,"priority":25,"file":184,"line":202},"admin_bar_menu","addAdminBarItems",93,{"type":141,"name":204,"callback":205,"file":184,"line":206},"admin_post_praison_clear_cache","handleClearCache",96,{"type":141,"name":208,"callback":209,"file":184,"line":210},"admin_post_praison_rollback","handleRollback",99,{"type":141,"name":212,"callback":213,"file":184,"line":12},"admin_notices","showAdminNotices",{"type":141,"name":148,"callback":143,"priority":215,"file":184,"line":216},16,310,{"type":141,"name":182,"callback":143,"file":218,"line":219},"src\\Core\\PostTypeManager.php",35,{"type":141,"name":221,"callback":222,"file":223,"line":224},"wp_enqueue_scripts","enqueueAssets","src\\Frontend\\MySubmissionsPage.php",30,{"type":141,"name":226,"callback":227,"file":228,"line":152},"wp_footer","renderButton","src\\Frontend\\ReportErrorButton.php",{"type":141,"name":221,"callback":222,"file":228,"line":125},{"type":187,"name":231,"callback":232,"priority":48,"file":228,"line":233},"script_loader_tag","addDeferStrategy",23,[235,241,244,248,252,256,258,262],{"action":236,"nopriv":237,"callback":238,"hasNonce":239,"hasCapCheck":239,"file":151,"line":240},"praison_start_export",false,"ajaxStartExport",true,19,{"action":242,"nopriv":237,"callback":243,"hasNonce":239,"hasCapCheck":239,"file":151,"line":125},"praison_export_status","ajaxExportStatus",{"action":245,"nopriv":237,"callback":246,"hasNonce":239,"hasCapCheck":239,"file":151,"line":247},"praison_cancel_export","ajaxCancelExport",21,{"action":249,"nopriv":237,"callback":250,"hasNonce":239,"hasCapCheck":239,"file":223,"line":251},"praison_merge_pr_frontend","ajaxMergePR",33,{"action":253,"nopriv":237,"callback":254,"hasNonce":239,"hasCapCheck":237,"file":228,"line":255},"praisonpress_get_content","ajaxGetContent",26,{"action":253,"nopriv":239,"callback":254,"hasNonce":239,"hasCapCheck":237,"file":228,"line":257},27,{"action":259,"nopriv":237,"callback":260,"hasNonce":239,"hasCapCheck":237,"file":228,"line":261},"praisonpress_submit_edit","ajaxSubmitEdit",29,{"action":259,"nopriv":239,"callback":260,"hasNonce":239,"hasCapCheck":237,"file":228,"line":224},[264],{"namespace":265,"route":266,"methods":267,"callback":269,"permissionCallback":270,"file":180,"line":165},"praisonpress\u002Fv1","\u002Fwebhook\u002Fgithub",[268],"POST","handleWebhook","verifyWebhook",[272],{"tag":273,"callback":274,"file":223,"line":257},"praisonpress_my_submissions","renderPage",[276,277,279],{"hook":158,"callback":158,"file":151,"line":64},{"hook":158,"callback":158,"file":151,"line":278},273,{"hook":158,"callback":158,"file":151,"line":280},282,{"dangerousFunctions":282,"sqlUsage":385,"outputEscaping":391,"fileOperations":403,"externalRequests":127,"nonceChecks":479,"capabilityChecks":31,"bundledLibraries":480},[283,287,291,294,297,299,302,304,306,309,312,315,317,320,323,325,328,331,334,337,340,343,345,347,350,353,356,359,362,365,368,371,374,376,379,382],{"fn":284,"file":285,"line":167,"context":286},"preg_replace(\u002Fe)","scripts\\export-to-markdown.php","preg_replace('\u002F\u003Cem[^>]*>(.*?)\u003C\\\u002Fe",{"fn":288,"file":184,"line":289,"context":290},"exec",526,"exec('git --version 2>&1', $gitVersionOutput, $gitVersionReturn);",{"fn":288,"file":292,"line":261,"context":293},"src\\Git\\GitManager.php","exec('git --version 2>&1', $output, $return);",{"fn":288,"file":292,"line":295,"context":296},47,"exec('git init 2>&1', $output, $return);",{"fn":288,"file":292,"line":191,"context":298},"exec('git add .');",{"fn":288,"file":292,"line":300,"context":301},55,"exec('git commit -m \"Initial commit - PraisonPress content\" 2>&1');",{"fn":288,"file":292,"line":34,"context":303},"exec('git add ' . escapeshellarg($relativePath) . ' 2>&1', $output, $return);",{"fn":288,"file":292,"line":47,"context":305},"exec('git commit -m ' . escapeshellarg($message) . ' 2>&1', $output, $return);",{"fn":288,"file":292,"line":307,"context":308},103,"exec($command, $output, $return);",{"fn":288,"file":292,"line":310,"context":311},141,"exec('git show ' . escapeshellarg($hash . ':' . $relativePath) . ' 2>&1', $output, $return);",{"fn":288,"file":292,"line":313,"context":314},165,"exec('git reset --hard ' . escapeshellarg($hash) . ' 2>&1', $output, $return);",{"fn":288,"file":292,"line":316,"context":311},173,{"fn":288,"file":292,"line":318,"context":319},180,"exec('git add ' . escapeshellarg($relativePath));",{"fn":288,"file":292,"line":321,"context":322},181,"exec('git commit -m \"Rollback ' . basename($file) . ' to ' . substr($hash, 0, 7) . '\"');",{"fn":288,"file":292,"line":324,"context":308},224,{"fn":288,"file":292,"line":326,"context":327},240,"exec($filesCommand, $filesOutput, $filesReturn);",{"fn":288,"file":292,"line":329,"context":330},245,"exec($diffCommand, $diffOutput, $diffReturn);",{"fn":288,"file":332,"line":310,"context":333},"src\\GitHub\\PullRequestManager.php","exec('git checkout main 2>&1', $output, $return);",{"fn":288,"file":332,"line":335,"context":336},142,"exec('git pull origin main 2>&1', $output, $return);",{"fn":288,"file":332,"line":338,"context":339},145,"exec('git checkout -b ' . escapeshellarg($branchName) . ' 2>&1', $output, $return);",{"fn":288,"file":332,"line":341,"context":342},169,"exec('git checkout ' . escapeshellarg($branchName) . ' 2>&1', $output, $return);",{"fn":288,"file":332,"line":344,"context":303},218,{"fn":288,"file":332,"line":346,"context":305},229,{"fn":288,"file":332,"line":348,"context":349},254,"exec('git push -u origin ' . escapeshellarg($branchName) . ' 2>&1', $output, $return);",{"fn":288,"file":351,"line":34,"context":352},"src\\GitHub\\SyncManager.php","exec('git clone ' . escapeshellarg($this->repoUrl) . ' ' . escapeshellarg($dirName) . ' 2>&1', $outp",{"fn":288,"file":351,"line":354,"context":355},110,"exec('git remote -v 2>&1', $output, $return);",{"fn":288,"file":351,"line":357,"context":358},122,"exec('git remote add origin ' . escapeshellarg($this->repoUrl) . ' 2>&1', $output, $return);",{"fn":288,"file":351,"line":360,"context":361},125,"exec('git remote set-url origin ' . escapeshellarg($this->repoUrl) . ' 2>&1', $output, $return);",{"fn":288,"file":351,"line":363,"context":364},148,"exec('git fetch origin ' . escapeshellarg($this->mainBranch) . ' 2>&1', $fetchOutput, $fetchReturn);",{"fn":288,"file":351,"line":366,"context":367},159,"exec('git rev-list HEAD..origin\u002F' . escapeshellarg($this->mainBranch) . ' --count 2>&1', $countOutpu",{"fn":288,"file":351,"line":369,"context":370},172,"exec('git pull origin ' . escapeshellarg($this->mainBranch) . ' 2>&1', $pullOutput, $pullReturn);",{"fn":288,"file":351,"line":372,"context":373},207,"exec('git push origin ' . escapeshellarg($this->mainBranch) . ' 2>&1', $output, $return);",{"fn":288,"file":351,"line":375,"context":364},241,{"fn":288,"file":351,"line":377,"context":378},253,"exec('git rev-list HEAD..origin\u002F' . escapeshellarg($this->mainBranch) . ' --count 2>&1', $incomingOu",{"fn":288,"file":351,"line":380,"context":381},257,"exec('git rev-list origin\u002F' . escapeshellarg($this->mainBranch) . '..HEAD --count 2>&1', $outgoingOu",{"fn":288,"file":351,"line":383,"context":384},261,"exec('git log -1 --format=%at origin\u002F' . escapeshellarg($this->mainBranch) . ' 2>&1', $timeOutput);",{"prepared":233,"raw":144,"locations":386},[387],{"file":388,"line":389,"context":390},"src\\Database\\SubmissionsTable.php",190,"$wpdb->get_var() with variable interpolation",{"escaped":392,"rawEcho":167,"locations":393},313,[394,397,399,401,404,406,407,408,409,410,412,414,416,418,420,422,423,425,427,429,431,433,435,436,437,439,441,442,444,446,448,450,452,454,456,458,460,461,462,463,465,467,469,471,472,473,475,477],{"file":162,"line":395,"context":396},105,"raw output",{"file":162,"line":398,"context":396},133,{"file":166,"line":400,"context":396},336,{"file":402,"line":403,"context":396},"views\\export-page.php",9,{"file":402,"line":405,"context":396},14,{"file":402,"line":215,"context":396},{"file":402,"line":156,"context":396},{"file":402,"line":240,"context":396},{"file":402,"line":257,"context":396},{"file":402,"line":411,"context":396},32,{"file":402,"line":413,"context":396},36,{"file":402,"line":415,"context":396},40,{"file":402,"line":417,"context":396},45,{"file":402,"line":419,"context":396},52,{"file":402,"line":421,"context":396},56,{"file":402,"line":195,"context":396},{"file":402,"line":424,"context":396},58,{"file":402,"line":426,"context":396},59,{"file":402,"line":428,"context":396},62,{"file":402,"line":430,"context":396},68,{"file":402,"line":432,"context":396},72,{"file":402,"line":434,"context":396},78,{"file":402,"line":47,"context":396},{"file":402,"line":78,"context":396},{"file":402,"line":438,"context":396},91,{"file":402,"line":440,"context":396},98,{"file":402,"line":395,"context":396},{"file":402,"line":443,"context":396},112,{"file":402,"line":445,"context":396},117,{"file":402,"line":447,"context":396},132,{"file":402,"line":449,"context":396},136,{"file":402,"line":451,"context":396},140,{"file":402,"line":453,"context":396},144,{"file":402,"line":455,"context":396},152,{"file":402,"line":457,"context":396},155,{"file":402,"line":459,"context":396},162,{"file":402,"line":313,"context":396},{"file":402,"line":369,"context":396},{"file":402,"line":316,"context":396},{"file":402,"line":464,"context":396},178,{"file":402,"line":466,"context":396},182,{"file":402,"line":468,"context":396},186,{"file":402,"line":470,"context":396},194,{"file":402,"line":64,"context":396},{"file":402,"line":372,"context":396},{"file":402,"line":474,"context":396},209,{"file":402,"line":476,"context":396},212,{"file":402,"line":478,"context":396},215,24,[],[482,504,519,529,542,560,569,585,595,621,636,650],{"entryPoint":483,"graph":484,"unsanitizedCount":144,"severity":503},"\u003CExportPage> (src\\Admin\\ExportPage.php:0)",{"nodes":485,"edges":500},[486,490,494],{"id":487,"type":488,"label":489,"file":151,"line":348},"n0","source","$_POST",{"id":491,"type":492,"label":493,"file":151,"line":348},"n1","transform","→ export_post_to_markdown()",{"id":495,"type":496,"label":497,"file":285,"line":498,"wp_function":499},"n2","sink","file_put_contents() [File Write]",232,"file_put_contents",[501,502],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":237},"medium",{"entryPoint":505,"graph":506,"unsanitizedCount":144,"severity":503},"render (src\\Admin\\HistoryPage.php:51)",{"nodes":507,"edges":516},[508,510,512],{"id":487,"type":488,"label":509,"file":162,"line":300},"$_GET['hash']",{"id":491,"type":492,"label":511,"file":162,"line":300},"→ renderCommitDetails()",{"id":495,"type":496,"label":513,"file":162,"line":514,"wp_function":515},"echo() [XSS]",230,"echo",[517,518],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":237},{"entryPoint":520,"graph":521,"unsanitizedCount":144,"severity":503},"\u003CHistoryPage> (src\\Admin\\HistoryPage.php:0)",{"nodes":522,"edges":526},[523,524,525],{"id":487,"type":488,"label":509,"file":162,"line":300},{"id":491,"type":492,"label":511,"file":162,"line":300},{"id":495,"type":496,"label":513,"file":162,"line":514,"wp_function":515},[527,528],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":237},{"entryPoint":530,"graph":531,"unsanitizedCount":144,"severity":503},"renderPage (src\\Admin\\PullRequestsPage.php:95)",{"nodes":532,"edges":539},[533,535,537],{"id":487,"type":488,"label":534,"file":166,"line":25},"$_GET['pr']",{"id":491,"type":492,"label":536,"file":166,"line":25},"→ renderPRDetail()",{"id":495,"type":496,"label":513,"file":166,"line":538,"wp_function":515},376,[540,541],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":237},{"entryPoint":543,"graph":544,"unsanitizedCount":144,"severity":503},"\u003CPullRequestsPage> (src\\Admin\\PullRequestsPage.php:0)",{"nodes":545,"edges":556},[546,549,551,552,554],{"id":487,"type":488,"label":547,"file":166,"line":548},"$_GET (x3)",157,{"id":491,"type":496,"label":513,"file":166,"line":550,"wp_function":515},158,{"id":495,"type":488,"label":534,"file":166,"line":25},{"id":553,"type":492,"label":536,"file":166,"line":25},"n3",{"id":555,"type":496,"label":513,"file":166,"line":538,"wp_function":515},"n4",[557,558,559],{"from":487,"to":491,"sanitized":239},{"from":495,"to":553,"sanitized":237},{"from":553,"to":555,"sanitized":237},{"entryPoint":561,"graph":562,"unsanitizedCount":11,"severity":568},"renderPRList (src\\Admin\\PullRequestsPage.php:112)",{"nodes":563,"edges":566},[564,565],{"id":487,"type":488,"label":547,"file":166,"line":548},{"id":491,"type":496,"label":513,"file":166,"line":550,"wp_function":515},[567],{"from":487,"to":491,"sanitized":239},"low",{"entryPoint":570,"graph":571,"unsanitizedCount":144,"severity":568},"renderSettingsPage (src\\Core\\Bootstrap.php:496)",{"nodes":572,"edges":582},[573,576,578],{"id":487,"type":488,"label":574,"file":184,"line":575},"$_GET",566,{"id":491,"type":492,"label":577,"file":184,"line":575},"→ storeAccessToken()",{"id":495,"type":496,"label":579,"file":580,"line":34,"wp_function":581},"update_option() [Settings Manipulation]","src\\GitHub\\OAuthHandler.php","update_option",[583,584],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":237},{"entryPoint":586,"graph":587,"unsanitizedCount":11,"severity":568},"showAdminNotices (src\\Core\\Bootstrap.php:856)",{"nodes":588,"edges":593},[589,591],{"id":487,"type":488,"label":574,"file":184,"line":590},863,{"id":491,"type":496,"label":513,"file":184,"line":592,"wp_function":515},866,[594],{"from":487,"to":491,"sanitized":239},{"entryPoint":596,"graph":597,"unsanitizedCount":11,"severity":568},"renderPage (src\\Frontend\\MySubmissionsPage.php:68)",{"nodes":598,"edges":616},[599,601,603,607,609,611],{"id":487,"type":488,"label":574,"file":223,"line":600},129,{"id":491,"type":492,"label":602,"file":223,"line":600},"→ getUserSubmissionsCount()",{"id":495,"type":496,"label":604,"file":388,"line":605,"wp_function":606},"get_var() [SQLi]",138,"get_var",{"id":553,"type":488,"label":574,"file":223,"line":608},130,{"id":555,"type":492,"label":610,"file":223,"line":608},"→ getUserSubmissions()",{"id":612,"type":496,"label":613,"file":388,"line":614,"wp_function":615},"n5","get_results() [SQLi]",111,"get_results",[617,618,619,620],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":239},{"from":553,"to":555,"sanitized":237},{"from":555,"to":612,"sanitized":239},{"entryPoint":622,"graph":623,"unsanitizedCount":11,"severity":568},"\u003CMySubmissionsPage> (src\\Frontend\\MySubmissionsPage.php:0)",{"nodes":624,"edges":631},[625,626,627,628,629,630],{"id":487,"type":488,"label":574,"file":223,"line":600},{"id":491,"type":492,"label":602,"file":223,"line":600},{"id":495,"type":496,"label":604,"file":388,"line":605,"wp_function":606},{"id":553,"type":488,"label":574,"file":223,"line":608},{"id":555,"type":492,"label":610,"file":223,"line":608},{"id":612,"type":496,"label":613,"file":388,"line":614,"wp_function":615},[632,633,634,635],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":239},{"from":553,"to":555,"sanitized":237},{"from":555,"to":612,"sanitized":239},{"entryPoint":637,"graph":638,"unsanitizedCount":144,"severity":649},"handleRollback (src\\Core\\Bootstrap.php:823)",{"nodes":639,"edges":646},[640,642,644],{"id":487,"type":488,"label":574,"file":184,"line":641},836,{"id":491,"type":492,"label":643,"file":184,"line":641},"→ rollback()",{"id":495,"type":496,"label":645,"file":292,"line":316,"wp_function":288},"exec() [RCE]",[647,648],{"from":487,"to":491,"sanitized":237},{"from":491,"to":495,"sanitized":237},"critical",{"entryPoint":651,"graph":652,"unsanitizedCount":670,"severity":649},"\u003CBootstrap> (src\\Core\\Bootstrap.php:0)",{"nodes":653,"edges":664},[654,655,656,657,658,659,660,662],{"id":487,"type":488,"label":574,"file":184,"line":590},{"id":491,"type":496,"label":513,"file":184,"line":592,"wp_function":515},{"id":495,"type":488,"label":574,"file":184,"line":575},{"id":553,"type":492,"label":577,"file":184,"line":575},{"id":555,"type":496,"label":579,"file":580,"line":34,"wp_function":581},{"id":612,"type":488,"label":574,"file":184,"line":641},{"id":661,"type":492,"label":643,"file":184,"line":641},"n6",{"id":663,"type":496,"label":645,"file":292,"line":316,"wp_function":288},"n7",[665,666,667,668,669],{"from":487,"to":491,"sanitized":239},{"from":495,"to":553,"sanitized":237},{"from":553,"to":555,"sanitized":237},{"from":612,"to":661,"sanitized":237},{"from":661,"to":663,"sanitized":237},2,{"summary":672,"deductions":673},"The \"praison-file-content-git\" plugin v1.0.6 demonstrates several good security practices, including a strong emphasis on prepared statements for SQL queries and a high percentage of properly escaped output. The absence of known CVEs and a history of vulnerabilities is a positive indicator.  Furthermore, all identified entry points (AJAX handlers, REST API routes, shortcodes, and cron events) appear to have appropriate authentication and permission checks, which significantly reduces the attack surface from unauthorized access.\n\nHowever, the static analysis reveals concerning signals. A significant number of \"dangerous functions\" are present, including `preg_replace(\u002Fe)` and `exec`. While the specific context of their use isn't detailed here, these functions can be exploited for remote code execution or other malicious activities if not handled with extreme care and robust sanitization. The taint analysis also highlights a critical concern: 8 flows with unsanitized paths, including 2 of critical severity. This indicates potential vulnerabilities where user-supplied input, when not properly sanitized, could lead to directory traversal or other file system manipulation attacks. The presence of file operations and external HTTP requests, coupled with these unsanitized path flows, warrants careful review to ensure these operations are secure.\n\nIn conclusion, while the plugin benefits from a clean vulnerability history and robust access control on its entry points, the presence of dangerous functions and, more importantly, critical severity taint flows involving unsanitized paths represent significant potential risks. These areas require thorough investigation to confirm they are not exploitable and to implement necessary hardening. The plugin's overall security posture is mixed, with strong foundational elements undermined by specific, potentially high-impact code-level risks.",[674,676,678,680],{"reason":675,"points":150},"Critical severity taint flows detected",{"reason":677,"points":48},"Multiple flows with unsanitized paths",{"reason":679,"points":110},"Presence of dangerous functions (exec, preg_replace(\u002Fe)",{"reason":681,"points":682},"Potential risk with file operations",5,"2026-03-17T07:01:29.609Z",{"wat":685,"direct":700},{"assetPaths":686,"generatorPatterns":692,"scriptPaths":693,"versionParams":694},[687,688,689,690,691],"\u002Fwp-content\u002Fplugins\u002Fpraison-file-content-git\u002Fassets\u002Fcss\u002Fexport.css","\u002Fwp-content\u002Fplugins\u002Fpraison-file-content-git\u002Fassets\u002Fjs\u002Fexport.js","\u002Fwp-content\u002Fplugins\u002Fpraison-file-content-git\u002Fassets\u002Fcss\u002Fadmin.css","\u002Fwp-content\u002Fplugins\u002Fpraison-file-content-git\u002Fassets\u002Fjs\u002Fadmin.js","\u002Fwp-content\u002Fplugins\u002Fpraison-file-content-git\u002Fassets\u002Fjs\u002Fcontent.js",[],[688,690,691],[695,696,697,698,699],"praison-file-content-git\u002Fassets\u002Fcss\u002Fexport.css?ver=","praison-file-content-git\u002Fassets\u002Fjs\u002Fexport.js?ver=","praison-file-content-git\u002Fassets\u002Fcss\u002Fadmin.css?ver=","praison-file-content-git\u002Fassets\u002Fjs\u002Fadmin.js?ver=","praison-file-content-git\u002Fassets\u002Fjs\u002Fcontent.js?ver=",{"cssClasses":701,"htmlComments":709,"htmlAttributes":733,"restEndpoints":741,"jsGlobals":742,"shortcodeOutput":744},[702,703,704,705,706,707,708],"praison-export-container","praison-export-status","praison-progress-bar","praison-export-controls","praison-admin-notice","praison-content-list","praison-content-item",[710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,723,726,727,726,728,729,730,731,732],"\u003C!-- Admin UI for exporting content to Markdown -->","\u003C!-- Export Page - Admin UI for exporting content to Markdown -->","\u003C!-- AJAX: Start export process -->","\u003C!-- AJAX: Check export status -->","\u003C!-- AJAX: Cancel export process -->","\u003C!-- Background Export Task -->","\u003C!-- Render the export page content -->","\u003C!-- Render the main export form -->","\u003C!-- Render export status and progress -->","\u003C!-- Render export controls -->","\u003C!-- Render export log (if any) -->","\u003C!-- Add submenu page -->","\u003C!-- Bootstrap the plugin -->","\u003C!-- Plugin activation hook -->","\u003C!-- Content directory - Hybrid approach for maximum flexibility -->","\u003C!-- Simple autoloader -->","\u003C!-- Render admin page content -->","\u003C!-- Initialize admin pages -->","\u003C!-- Render plugin settings page -->","\u003C!-- Render the Content Import page -->","\u003C!-- Render the Content List page -->","\u003C!-- Plugin Name: PraisonAI Git Posts -->","\u003C!-- Description: Load WordPress content from files (Markdown, JSON, YAML) without database writes, with Git-based version control -->",[734,735,736,737,738,739,740],"data-action=\"praison_start_export\"","data-action=\"praison_export_status\"","data-action=\"praison_cancel_export\"","data-nonce=\"\u003C?php echo wp_create_nonce('praison_export_nonce'); ?>\"","data-post-type=\"all\"","data-batch-size=\"100\"","data-push-to-github=\"1\"",[],[743],"praisonExport",[745],"[praisonpress_my_submissions]"]