{"id":241394,"date":"2025-08-04T08:53:06","date_gmt":"2025-08-04T08:53:06","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/llm-content-generator\/"},"modified":"2026-10-11T08:44:27","modified_gmt":"2026-10-11T08:44:27","slug":"meerkat-markdown-for-ai-visibility","status":"publish","type":"plugin","link":"https:\/\/srd.wordpress.org\/plugins\/meerkat-markdown-for-ai-visibility\/","author":23325258,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"5.1","stable_tag":"5.1","tested":"7.1.3","requires":"6.8","requires_php":"8.0","requires_plugins":null,"header_name":"Meerkat Markdown for AI Visibility","header_author":"Andy Brin","header_description":"Creates llms.txt in the root directory and optionally serves dynamic .html.md files to help AI-based systems better understand the website\u2019s content.","assets_banners_color":"3d654d","last_updated":"2026-10-11 08:44:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/curnaglias.com","rating":5,"author_block_rating":0,"active_installs":70,"downloads":2807,"num_ratings":2,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.55":{"tag":"1.55","author":"andybrin","date":"2025-08-05 07:39:49","revision":3339451},"2.0":{"tag":"2.0","author":"andybrin","date":"2025-09-08 15:00:31","revision":3358004},"3.0":{"tag":"3.0","author":"andybrin","date":"2026-01-21 10:23:17","revision":3443959},"4.2":{"tag":"4.2","author":"andybrin","date":"2026-07-12 10:41:16","revision":3604671},"5.0":{"tag":"5.0","author":"andybrin","date":"2026-10-09 05:00:50","revision":3735911},"5.1":{"tag":"5.1","author":"andybrin","date":"2026-10-11 08:44:27","revision":3739174},"5.1.":{"tag":"5.1.","author":"andybrin","date":"2026-10-11 08:42:45","revision":3739169}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3339084,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3443950,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3758441,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/options-general.php?page=meerkat-markdown-for-ai-visibility\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"meerkat-markdown-for-ai-visibility\"},\"options\":{\"activate\":true}},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/**\\n * Seed the WordPress Playground preview with content for the Meerkat plugin.\\n * This code runs only through assets\\\/blueprints\\\/blueprint.json, not on activation.\\n *\\\/\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\n$meerkat_terms = array(\\n    'category' => array(\\n        'meerkat-guides'       => 'Meerkat Guides',\\n        'meerkat-features'     => 'Meerkat Features',\\n        'meerkat-settings'     => 'Meerkat Settings',\\n        'meerkat-excluded'     => 'Meerkat Excluded Category',\\n    ),\\n    'post_tag' => array(\\n        'ai-visibility'         => 'AI Visibility',\\n        'markdown'              => 'Markdown',\\n        'llms-txt'              => 'llms.txt',\\n        'configuration'         => 'Configuration',\\n        'dynamic-markdown'      => 'Dynamic Markdown',\\n        'exclude-meerkat-tag'   => 'Exclude Meerkat Tag',\\n    ),\\n);\\n\\n$meerkat_term_ids = array( 'category' => array(), 'post_tag' => array() );\\nforeach ( $meerkat_terms as $taxonomy => $items ) {\\n    foreach ( $items as $slug => $name ) {\\n        $existing = term_exists( $slug, $taxonomy );\\n        if ( ! $existing ) {\\n            $existing = wp_insert_term( $name, $taxonomy, array( 'slug' => $slug ) );\\n        }\\n        if ( is_wp_error( $existing ) ) {\\n            throw new RuntimeException( $existing->get_error_message() );\\n        }\\n        $meerkat_term_ids[ $taxonomy ][ $slug ] = is_array( $existing )\\n            ? (int) $existing['term_id']\\n            : (int) $existing;\\n    }\\n}\\n\\n\\\/\\\/ Show demo checkboxes immediately and preselect the two test exclusions.\\nupdate_option( 'mrmrkdofa_excluded_categories', array( $meerkat_term_ids['category']['meerkat-excluded'] ) );\\nupdate_option( 'mrmrkdofa_excluded_tags', array( $meerkat_term_ids['post_tag']['exclude-meerkat-tag'] ) );\\n\"},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/**\\n * Create demo posts after WordPress terms have been registered.\\n * Only executed by the WordPress Playground preview.\\n *\\\/\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\n$meerkat_posts = array(\\n    array(\\n        'slug'       => 'meerkat-start-here',\\n        'title'      => 'Start Here: Markdown for AI Visibility',\\n        'category'   => 'meerkat-guides',\\n        'tags'       => array( 'ai-visibility', 'markdown' ),\\n        'content'    => <<<'HTML'\\n<h2>A practical demonstration<\\\/h2>\\n<p>This sample website contains published posts with meaningful categories and tags. Meerkat Markdown for AI Visibility can use this content to build an llms.txt index. Start on the plugin settings page, review the available controls, and create your first export using Generate Files Now.<\\\/p>\\n<p>All articles are demonstration content. Compare the WordPress post list with the generated index to see how content length, post type, and taxonomy exclusions affect the result. You can edit a sample post and regenerate the file to inspect the updated output.<\\\/p>\\nHTML\\n    ),\\n    array(\\n        'slug'       => 'meerkat-llms-index',\\n        'title'      => 'How the llms.txt Content Index Works',\\n        'category'   => 'meerkat-guides',\\n        'tags'       => array( 'llms-txt', 'ai-visibility' ),\\n        'content'    => <<<'HTML'\\n<h2>From published posts to a readable index<\\\/h2>\\n<p>The llms.txt file presents selected public content in a compact, text-based format. A typical entry includes a post title, its address, and an excerpt of the content. The plugin uses WordPress queries and respects the settings chosen by the site administrator.<\\\/p>\\n<p>In the demo, this article should be included in the index because it is published, longer than fifteen words, and does not use an excluded category or tag. Open llms.txt after generating it, then change the word count or sorting option and compare the results.<\\\/p>\\nHTML\\n    ),\\n    array(\\n        'slug'       => 'meerkat-exclusion-settings',\\n        'title'      => 'Configure Category and Tag Exclusions',\\n        'category'   => 'meerkat-settings',\\n        'tags'       => array( 'configuration', 'llms-txt' ),\\n        'content'    => <<<'HTML'\\n<h2>Targeted content selection<\\\/h2>\\n<p>Some public articles should stay out of a machine-readable export. Meerkat lets you exclude content by post ID, category, or tag without unpublishing the original article. This is useful for announcements, temporary campaigns, and other content that is not relevant to your primary knowledge index.<\\\/p>\\n<p>The demo includes a separate post in an excluded category and another post with an excluded tag. Both remain visible in the WordPress Posts screen, but should not appear in the generated llms.txt file. Toggle either checkbox in the plugin settings to test the difference.<\\\/p>\\nHTML\\n    ),\\n    array(\\n        'slug'       => 'meerkat-dynamic-markdown',\\n        'title'      => 'Dynamic Markdown URLs and Sitemap Options',\\n        'category'   => 'meerkat-features',\\n        'tags'       => array( 'dynamic-markdown', 'markdown' ),\\n        'content'    => <<<'HTML'\\n<h2>Readable Markdown versions<\\\/h2>\\n<p>Besides creating an llms.txt index, the plugin can optionally expose Markdown representations of public posts and pages. These endpoints use publication and exclusion rules so that private or password-protected material does not become public merely because a Markdown URL was requested.<\\\/p>\\n<p>To explore this feature, enable Generate .md-files on the settings screen, save your changes, and follow a Markdown link from the generated index. The output is intended for text consumers rather than regular browser navigation. A separate Markdown sitemap option is available for compatible installations.<\\\/p>\\nHTML\\n    ),\\n    array(\\n        'slug'       => 'meerkat-excluded-by-category',\\n        'title'      => 'Demo: Excluded by Category',\\n        'category'   => 'meerkat-excluded',\\n        'tags'       => array( 'ai-visibility' ),\\n        'content'    => <<<'HTML'\\n<h2>Category exclusion test<\\\/h2>\\n<p>This post is intentionally assigned to the Meerkat Excluded Category. The category is selected in the plugin exclusion settings when the preview starts. As a result, the post should be absent from the llms.txt export even though its publication status is public.<\\\/p>\\n<p>Remove the category checkbox, save the settings, and generate the export again to verify that the post becomes eligible. Restore the checkbox afterwards to test the excluded state. The WordPress post itself remains published throughout the demonstration.<\\\/p>\\nHTML\\n    ),\\n    array(\\n        'slug'       => 'meerkat-excluded-by-tag',\\n        'title'      => 'Demo: Excluded by Tag',\\n        'category'   => 'meerkat-guides',\\n        'tags'       => array( 'exclude-meerkat-tag' ),\\n        'content'    => <<<'HTML'\\n<h2>Tag exclusion test<\\\/h2>\\n<p>This published demo article carries the Exclude Meerkat Tag label. The matching tag is checked in the plugin settings from the start. The tag exclusion should remove this article from the generated llms.txt file without changing the visibility of the original WordPress post.<\\\/p>\\n<p>Clear the tag checkbox and regenerate the index to see the article included. Then select the tag again and regenerate to confirm it disappears. This example uses a different category than the category exclusion test, so the two controls can be examined independently.<\\\/p>\\nHTML\\n    ),\\n    array(\\n        'slug'       => 'meerkat-too-short-to-export',\\n        'title'      => 'Demo: Too Short for llms.txt',\\n        'category'   => 'meerkat-guides',\\n        'tags'       => array( 'configuration' ),\\n        'content'    => '<p>Short sample content should not appear in the exported index.<\\\/p>',\\n    ),\\n);\\n\\nforeach ( $meerkat_posts as $item ) {\\n    $existing_post = get_page_by_path( $item['slug'], OBJECT, 'post' );\\n    if ( $existing_post instanceof WP_Post ) {\\n        $post_id = (int) $existing_post->ID;\\n    } else {\\n        $post_id = wp_insert_post(\\n            array(\\n                'post_type'    => 'post',\\n                'post_status'  => 'publish',\\n                'post_author'  => 1,\\n                'post_name'    => $item['slug'],\\n                'post_title'   => $item['title'],\\n                'post_content' => $item['content'],\\n            ),\\n            true\\n        );\\n    }\\n    if ( is_wp_error( $post_id ) || ! $post_id ) {\\n        throw new RuntimeException( is_wp_error( $post_id ) ? $post_id->get_error_message() : 'Failed to create demo post.' );\\n    }\\n    $category = get_term_by( 'slug', $item['category'], 'category' );\\n    if ( ! ( $category instanceof WP_Term ) ) {\\n        throw new RuntimeException( 'Missing demo category: ' . $item['category'] );\\n    }\\n    $category_result = wp_set_post_terms( $post_id, array( (int) $category->term_id ), 'category' );\\n\\n    $tag_ids = array();\\n    foreach ( $item['tags'] as $slug ) {\\n        $tag = get_term_by( 'slug', $slug, 'post_tag' );\\n        if ( ! ( $tag instanceof WP_Term ) ) {\\n            throw new RuntimeException( 'Missing demo tag: ' . $slug );\\n        }\\n        $tag_ids[] = (int) $tag->term_id;\\n    }\\n    $tag_result = wp_set_post_terms( $post_id, $tag_ids, 'post_tag' );\\n    if ( is_wp_error( $category_result ) || is_wp_error( $tag_result ) ) {\\n        $error = is_wp_error( $category_result ) ? $category_result : $tag_result;\\n        throw new RuntimeException( $error->get_error_message() );\\n    }\\n}\\n\"}]}"}},"all_blocks":[],"tagged_versions":["1.55","2.0","3.0","4.2","5.0","5.1","5.1."],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3338990,"resolution":"1","location":"assets","locale":"","width":1753,"height":970}},"screenshots":{"1":"Settings page with Generate and Save Changes buttons plus cron frequency selection."}},"plugin_section":[],"plugin_tags":[2209,226124,4608,1557],"plugin_category":[55],"plugin_contributors":[254392],"plugin_business_model":[],"class_list":["post-241394","plugin","type-plugin","status-publish","hentry","plugin_tags-generator","plugin_tags-llm","plugin_tags-markdown","plugin_tags-sitemap","plugin_category-seo-and-marketing","plugin_contributors-andybrin","plugin_committers-andybrin"],"banners":{"banner":"https:\/\/ps.w.org\/meerkat-markdown-for-ai-visibility\/assets\/banner-772x250.png?rev=3443950","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/meerkat-markdown-for-ai-visibility\/assets\/icon-256x256.png?rev=3339084","icon_2x":"https:\/\/ps.w.org\/meerkat-markdown-for-ai-visibility\/assets\/icon-256x256.png?rev=3339084","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/meerkat-markdown-for-ai-visibility\/assets\/screenshot-1.png?rev=3338990","caption":"Settings page with Generate and Save Changes buttons plus cron frequency selection."}],"raw_content":"<!--section=description-->\n<p>Meerkat Markdown for AI Visibility collects URLs using WordPress queries and generates an llms.txt file (short for \u201cLarge Language Models\u201d) in the website\u2019s root directory \u2014 optionally providing dynamic .md files \u2014 to help AI-based systems better understand and make use of the site\u2019s content. The llms.txt is stored in the root directory. You can configure the number of URLs, set a minimum word count, and exclude specific categories or tags. File generation can be triggered manually or scheduled to run automatically.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Gathers URLs with WordPress queries; the <code>wp-sitemap.xml<\/code> URL is only added to <code>llms.txt<\/code> as metadata.<\/li>\n<li>Creates <code>llms.txt<\/code> with <code>[Title \u2022 host\/path](URL): content<\/code> entries.<\/li>\n<li>Add a custom site description to the file header.<\/li>\n<li>Limit export to 100 entries or process all URLs.<\/li>\n<li>Posts or pages with fewer than 15 words are skipped: they do not count toward\nthe 100-entry limit and are omitted from <code>llms.txt<\/code>.<\/li>\n<li>Choose 30, 50, 100 words or the full text per entry.<\/li>\n<li>Exclude categories and tags.<\/li>\n<li>Sort <code>llms.txt<\/code> entries by popularity or most recent first.<\/li>\n<li>Optionally serve dynamic <code>.md<\/code> files for published posts, pages and public custom post types. Responses include canonical, noindex and MIME-sniffing protection headers.<\/li>\n<li>Generates a valid XML sitemap for Markdown URLs without declaring <code>llms.txt<\/code> as a sitemap or blocking it in <code>robots.txt<\/code>.<\/li>\n<li>Manual generation via the <strong>Generate Files Now<\/strong> button.<\/li>\n<li>Timezone-aware WP-Cron schedule (hourly, daily, weekly, monthly or disabled) with configurable local run time and daylight-saving-safe rescheduling.<\/li>\n<li>Save settings with the <strong>Save Changes<\/strong> button.<\/li>\n<\/ul>\n\n<h3>License<\/h3>\n\n<p>This plugin is open source software licensed under the GPLv2 (or later). See LICENSE.txt for license information.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>meerkat-plugin<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu.<\/li>\n<li>Visit <strong>Settings \u2192 Markdown for AI<\/strong> and click <strong>Generate Files Now<\/strong> to create the first file.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20is%20%60llms.txt%60%20stored%3F\"><h3>Where is `llms.txt` stored?<\/h3><\/dt>\n<dd><p>It is written to the site root directory (same level as the top-level <code>index.php<\/code>).<\/p><\/dd>\n<dt id=\"how%20can%20i%20regenerate%20it%3F\"><h3>How can I regenerate it?<\/h3><\/dt>\n<dd><p>Use the <strong>Generate Files Now<\/strong> button or wait for the scheduled cron run.<\/p><\/dd>\n<dt id=\"how%20do%20i%20change%20the%20schedule%3F\"><h3>How do I change the schedule?<\/h3><\/dt>\n<dd><p>Select a new frequency and click <strong>Save Changes<\/strong> on the settings page.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%20the%20plugin%3F\"><h3>What happens when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>All plugin options and generated sitemap files are removed automatically. The plugin deletes <code>llms.txt<\/code> only when the file can be identified as plugin-generated. Existing files created manually or by another plugin are preserved.<\/p><\/dd>\n<dt id=\"how%20do%20i%20enable%20the%20dynamic%20sitemap%3F\"><h3>How do I enable the dynamic sitemap?<\/h3><\/dt>\n<dd><p>Add the following snippet to your theme's <code>functions.php<\/code> or a small helper plugin:<\/p>\n\n<pre><code>add_filter( 'mrmrkdofa_enable_dynamic_sitemap', '__return_true' );\n<\/code><\/pre>\n\n<p>Afterwards visit <strong>Settings \u2192 Permalinks<\/strong> and save changes once so WordPress refreshes the rewrite rules.<\/p><\/dd>\n<dt id=\"do%20exclusions%20protect%20every%20markdown%20endpoint%3F\"><h3>Do exclusions protect every Markdown endpoint?<\/h3><\/dt>\n<dd><p>Yes. IDs, categories and tags are excluded from llms.txt, home Markdown, direct Markdown URLs and Markdown sitemaps. The post\/page selection and the 15-word minimum still control llms.txt only.<\/p><\/dd>\n<dt id=\"how%20is%20cached%20output%20refreshed%3F\"><h3>How is cached output refreshed?<\/h3><\/dt>\n<dd><p>Dynamic output checks publication status before serving a cached body. Relevant content, metadata, taxonomy and setting changes invalidate the cache. Authenticated requests and requests with cookies or additional query parameters are not shared through the Markdown cache. Browser responses revalidate by default.<\/p><\/dd>\n<dt id=\"what%20are%20the%20generation%20limits%3F\"><h3>What are the generation limits?<\/h3><\/dt>\n<dd><p>Each HTTP response is limited to 10 MiB by default (filter: mrmrkdofa_http_response_size). A static Markdown sitemap is limited to 50,000 URLs and 50 MiB. Oversized or incomplete exports return an error and retain the previous generated files. The sitemap processing count is bounded by mrmrkdofa_max_sitemaps (default 1,000).<\/p><\/dd>\n<dt id=\"are%20membership%20restrictions%20automatically%20supported%3F\"><h3>Are membership restrictions automatically supported?<\/h3><\/dt>\n<dd><p>Core publication\/password rules and configured exclusions are enforced. Membership plugins may apply additional rules; use the mrmrkdofa_is_exportable_post filter to deny restricted posts. Verify custom shortcodes and membership content before publishing an export.<\/p><\/dd>\n<dt id=\"when%20do%20existing%20static%20files%20change%3F\"><h3>When do existing static files change?<\/h3><\/dt>\n<dd><p>llms.txt and the static XML sitemap are public snapshots. Edits and relevant setting changes queue regeneration through WP-Cron. They update when that job runs or when Generate Files Now is used. Use a reliable system cron if WP-Cron is disabled.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>5.1<\/h4>\n\n<ul>\n<li>Aligns the plugin header, runtime version, stable tag and translation template to version 5.1.<\/li>\n<li>Retains the direct PHP file access protection in the main plugin file.<\/li>\n<\/ul>\n\n<h4>5.0<\/h4>\n\n<ul>\n<li>Corrects the release package for Plugin Check: excludes development configuration and documents testing with WordPress 7.1.3.<\/li>\n<li>Filters excluded post IDs after cached batch queries; home Markdown fills its configured entry limit from subsequent batches.<\/li>\n<li>Documents the narrow coding-standard exception required to restore existing WordPress core globals.<\/li>\n<li>Uses an isolated guest identity and correct post context for public exports; restores the original request state afterwards.<\/li>\n<li>Applies ID, category and tag exclusions to llms.txt, direct Markdown URLs, home output and Markdown sitemaps.<\/li>\n<li>Protects HTTP Basic credentials across scheme, host, port and redirect changes; rejects oversized responses.<\/li>\n<li>Rejects sitemap DTD\/entity declarations, validates child XML, restores libxml settings and prevents recursive dynamic sitemap fetches.<\/li>\n<li>Adds a database generation lock, ownership-aware lock release and a visible last-run status.<\/li>\n<li>Adds authenticated POST-only JSON settings saves with nonce validation before manual generation.<\/li>\n<li>Uses versioned, locale-aware caches; invalidates on content, metadata, taxonomy and relevant setting changes.<\/li>\n<li>Supports HEAD and conditional GET; avoids sharing authenticated, cookie-dependent or extra-query responses.<\/li>\n<li>Queries complete post batches, primes metadata\/terms and uses deterministic ordering; parses child sitemaps once.<\/li>\n<li>Preserves existing files on child-sitemap failures and refuses invalid oversized single-sitemap exports.<\/li>\n<li>Reschedules cron after initial saves and timezone changes; schedules the next run before rendering.<\/li>\n<li>Fixes unknown query endpoints, HTML-suffix permalinks, XML query escaping, inline-code fences and uninstall cache cleanup.<\/li>\n<li>Synchronizes plugin, asset and translation versions to 5.0; retains every existing named function and method.<\/li>\n<\/ul>\n\n<h4>4.2<\/h4>\n\n<ul>\n<li>Protects existing <code>llms.txt<\/code> files: files not owned by this plugin are neither overwritten nor removed during uninstall.<\/li>\n<li>Manages only a clearly marked plugin block in <code>robots.txt<\/code> and preserves all unrelated directives.<\/li>\n<li>Supports dynamic Markdown URLs with plain WordPress permalinks through query-based endpoints.<\/li>\n<li>Propagates failed write, delete, permission and directory operations instead of reporting false success.<\/li>\n<li>Removes dynamic Markdown rewrite rules reliably when the feature or plugin is disabled.<\/li>\n<li>Corrects the settings description for canonical and X-Robots-Tag headers.<\/li>\n<li>Updates repository metadata and moves older release notes to changelog.txt.<\/li>\n<li>Regenerates the translation template from the current source.<\/li>\n<li>Renames plugin classes and methods to WordPress-compatible naming conventions and normalizes formatting.<\/li>\n<li>Prevents shortcodes from being executed twice during llms.txt generation.<\/li>\n<li>Validates sitemap XML before accepting a fallback endpoint.<\/li>\n<li>Stages and rolls back generated files so failed sitemap generation does not partially update llms.txt.<\/li>\n<\/ul>\n\n<h4>4.1<\/h4>\n\n<ul>\n<li>Adds a defensive DOMNode guard clause to the HTML-to-Markdown parser.<\/li>\n<li>Prevents PHP warnings when an unexpected or null node is passed to the recursive node processor.<\/li>\n<\/ul>\n\n<h4>4.0<\/h4>\n\n<p><strong>Major improvements<\/strong><\/p>\n\n<p><strong>Security<\/strong><\/p>\n\n<ul>\n<li>Limits dynamic Markdown output to published, publicly accessible and non-password-protected content.<\/li>\n<li>Drafts, private posts and password-protected content are no longer exposed through <code>.md<\/code> URLs.<\/li>\n<li>Unknown Markdown URLs return a real HTTP 404 response instead of homepage content.<\/li>\n<li>Uses safe remote requests, validates AJAX permissions and adds canonical, noindex and MIME-sniffing protection headers.<\/li>\n<\/ul>\n\n<p><strong>Generation, sitemaps and scheduling<\/strong><\/p>\n\n<ul>\n<li>Supports public custom post types and Elementor, Divi and Avada content.<\/li>\n<li>Generates a valid Markdown XML sitemap and removes obsolete robots.txt directives.<\/li>\n<li>Processes large sites in batches and validates root, upload and filter values.<\/li>\n<li>Uses timezone-aware calendar scheduling for hourly, daily, weekly and monthly runs.<\/li>\n<li>Cleans generated data, options, cron events and legacy robots.txt entries on uninstall.<\/li>\n<\/ul>\n\n<p>Earlier release notes are included in <code>changelog.txt<\/code>.<\/p>","raw_excerpt":"Generate a Markdown list of your URLs to help AI-driven tools understand your website.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/241394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=241394"}],"author":[{"embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/andybrin"}],"wp:attachment":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=241394"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=241394"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=241394"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=241394"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=241394"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=241394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}