'aeohelper-markdown'], $args), admin_url('admin.php')); } private static function field(string $name, string $default = ''): string { // All calls occur after check_admin_referer() in save(). $v = isset($_POST[$name]) && is_scalar($_POST[$name]) ? wp_unslash((string) $_POST[$name]) : $default; return sanitize_text_field($v); } private static function textarea_field(string $name): string { // All calls occur after check_admin_referer() in save(). $v = isset($_POST[$name]) && is_scalar($_POST[$name]) ? wp_unslash((string) $_POST[$name]) : ''; return sanitize_textarea_field($v); } private static function start(string $task, int $id = 0): void { echo '
'; echo 'Add one of these attributes to an existing HTML element. They do not change its front-end appearance.
'; echo 'data-aeohelper-excludeExclude this one element and everything inside it.
<div class="existing-visual-class" data-aeohelper-exclude>...</div>
data-aeohelper-tableConvert a visual grid made from divs into a Markdown table. Use it on the outer grid wrapper; native <table> elements work automatically.
<div class="existing-grid-class" data-aeohelper-table>...</div>
data-aeohelper-context="..."Add a short public note to Markdown only—for example, to label fictional interface data.
<div class="existing-visual-class" data-aeohelper-context="Illustrative example; figures are fictional.">...</div>
For visual tables, the first direct child is the header row and each following direct child is a row. Direct child elements become cells. Checkmarks become Included and dashes become Not included. Always check the resulting columns before publishing.
See when published Markdown and llms.txt endpoints are requested.
Stored locally. Crawler names come from unverified user-agent strings and can be spoofed.
| Time | Endpoint | Page | Claimed crawler | Method | Status |
|---|---|---|---|---|---|
| ' . esc_html(self::display_time($row['requested_at'])) . ' | ' . esc_html($row['endpoint']) . ' | ' . esc_html($page) . ' | ' . esc_html($row['agent_label']) . ' | ' . esc_html($row['request_method']) . ' | ' . (int) $row['response_status'] . ' |
No matching requests ' . ($s['logging'] ? 'Open a published Markdown endpoint in a private browser to test the log.' : 'Enable local request logging using the controls on this page.') . ' | |||||
Shows the latest 100 matching observations. Identical requests are collapsed into 15-minute observations and storage is capped at 10,000 records. It does not verify crawler IP addresses or record visits that only request the original HTML page.
Control which public Pages and Posts are eligible for reviewed Markdown.
Every first publication still requires a generated preview and manual approval.
'; self::start('settings'); echo ''; echo 'Background updates use WP-Cron and may be delayed on low-traffic sites. Page caches can also delay changes in the fetched public HTML.
'; submit_button('Save publishing settings', 'primary', 'submit', false); echo 'Off by default. Keep this off if Rank Math, another plugin or a physical file already manages llms.txt.
The page list is maintained automatically: approved, currently eligible Markdown appears using each page\'s llms.txt section. Link titles and descriptions use the page\'s rendered SEO metadata when manual overrides are blank. Withdrawing or invalidating Markdown removes it from the generated file.
'; self::start('llms'); echo ''; foreach (['title'=>'Website name','summary'=>'One-line website summary'] as $key=>$label) { echo '
Listed sections appear first in this order. Any unlisted sections keep their existing fallback order.
Approved Markdown responses use clean /index.md URLs and send an HTTP Link canonical pointing to the original HTML page. Successful Markdown responses do not carry noindex. Unpublished, missing and error responses remain noindex. The original HTML remains the primary indexable page and advertises its Markdown version using rel="alternate".
Legacy query-based Markdown URLs redirect permanently to their corresponding clean URL. Markdown endpoints send no-store while this feature is being tested. Do not block the clean Markdown URLs in robots.txt if you want AI crawlers to retrieve them. The plugin does not add Markdown URLs to XML sitemaps. A physical llms.txt file can be advertised using rel="describedby" without allowing the plugin to overwrite or serve that file.
Only published Pages and Posts are supported. Shortcodes are blocked unless explicitly allowed on each page after confirming they render only public content. Passwords, common account routes and known SEO noindex settings remain blocked. Membership sites require a separate access-control review before use. The renderer does not run JavaScript or compute external CSS; use previews and content selectors. Use the per-page exclusion field to remove every matching .class or #id, or use the HTML attributes panel for one exact wrapper, visual grids or Markdown-only context.
All eligible mode widens eligibility only; every first publication still needs review. Source edits withdraw stale Markdown immediately. Optional background modes can prepare a review draft or automatically replace Markdown that was approved previously. WP-Cron and page caches may delay updates. Theme-only changes need manual withdrawal or regeneration.
Request Activity is optional and records requests to the separate Markdown and llms.txt endpoints only. Crawler labels are taken from user-agent strings and are not verified identities. The Access & extraction probe is a simulation and is excluded from this log because it requests the original HTML. Use server/CDN logs and provider IP-verification guidance when verified crawler evidence is required.
A request, HTTP 200 response or smaller Markdown document does not demonstrate indexing, provider token savings or citation uplift.
No telemetry, external AI calls or API keys. Generation makes a public HTTP request to your own site. Optional activity records stay in the local WordPress database and contain no IP addresses, cookies or referrers. Previews, approved copies and settings are also stored locally. Deactivation stops plugin routes but preserves settings; deleting the plugin removes its stored data and request table. Purge external caches after withdrawal, deactivation or deletion.