{"id":20860,"date":"2026-10-10T08:47:00","date_gmt":"2026-10-10T06:47:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=20860"},"modified":"2026-10-09T22:29:13","modified_gmt":"2026-10-09T20:29:13","slug":"readme-header-svn","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/","title":{"rendered":"readme.txt, header and SVN: how WordPress.org reads a plugin"},"content":{"rendered":"<p>A plugin in the WordPress.org directory is described by two plain text sources that answer different questions. The comment header at the top of the main PHP file is read by WordPress itself and by the directory; the <code>readme.txt<\/code> is read only by the directory. Which of the two counts is not obvious at first sight: the download button shows the version from the header, the one-line description under the plugin name comes from the readme, and for \u201cRequires at least\u201d both files may carry a value. On top of that, the SVN repository decides which copy of the readme is read at all.<\/p>\n<p>This article goes through both files with complete examples, uses the directory\u2019s import code to settle which field wins in a conflict, explains the <code>trunk\/<\/code>, <code>tags\/<\/code> and <code>assets\/<\/code> layout with a full command sequence, and lists the errors reported by the readme validator and the importer. <a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/plugin-directory-guidelines\/\">Review<\/a> and <a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/tutorials-en-wordpress-plugins-tricks\/plugin-check-ci\/\">Plugin Check<\/a> are covered in separate articles in this series.<\/p>\n<h2>The plugin header in the main file<\/h2>\n<p>WordPress recognises a plugin by a comment block that contains at least the line <code>Plugin Name:<\/code>. All other fields are optional, but several of them are evaluated by the directory. When a release is imported, the directory scans the PHP files in the root of the released folder and stops at the first file whose header contains a plugin name. That is why the plugin handbook insists that the main file sits directly in <code>trunk\/<\/code>: a path such as <code>trunk\/my-plugin\/my-plugin.php<\/code> breaks downloads. Subfolders are fine for included files.<\/p>\n<p>The following main file is complete and can be activated as it is. It belongs to a small sample plugin, \u201cLW Reading Time\u201d, that is used throughout the article:<\/p>\n<pre><code>&lt;?php\n\/**\n * Plugin Name:       LW Reading Time\n * Plugin URI:        https:\/\/lukaswojcik.com\/plugins\/lw-reading-time\/\n * Description:       Shows the estimated reading time above single posts.\n * Version:           1.2.0\n * Requires at least: 6.5\n * Requires PHP:      7.4\n * Author:            Lukas Wojcik\n * Author URI:        https:\/\/lukaswojcik.com\/\n * License:           GPLv2 or later\n * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n * Text Domain:       lw-reading-time\n *\n * @package LW_Reading_Time\n *\/\n\nif ( ! defined( 'ABSPATH' ) ) {\n\texit;\n}\n\n\/**\n * Prepends the estimated reading time to the content of single posts.\n *\n * @param string $content Post content.\n * @return string Filtered content.\n *\/\nfunction lw_reading_time_prepend( $content ) {\n\tif ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {\n\t\treturn $content;\n\t}\n\n\t$words   = str_word_count( wp_strip_all_tags( $content ) );\n\t$minutes = max( 1, (int) ceil( $words \/ 200 ) );\n\n\t$label = sprintf(\n\t\t\/* translators: %d: number of minutes. *\/\n\t\t_n( '%d minute read', '%d minutes read', $minutes, 'lw-reading-time' ),\n\t\t$minutes\n\t);\n\n\treturn '&lt;p class=\"lw-reading-time\"&gt;' . esc_html( $label ) . '&lt;\/p&gt;' . $content;\n}\nadd_filter( 'the_content', 'lw_reading_time_prepend' );<\/code><\/pre>\n<p>A few fields deserve a closer look:<\/p>\n<ul>\n<li><strong>Version<\/strong> is compared with PHP\u2019s <code>version_compare()<\/code>, so <code>1.02<\/code> counts as greater than <code>1.1<\/code>. The importer warns about anything other than digits, dots and an optional <code>-rc<\/code>, <code>-beta<\/code> or <code>-alpha<\/code> suffix, and it refuses version strings that would be unsafe as a folder path.<\/li>\n<li><strong>Requires at least<\/strong> and <strong>Requires PHP<\/strong> are the version requirements WordPress itself checks on activation; since WordPress 6.5 it also checks <strong>Requires Plugins<\/strong>. Since WordPress 5.8 the readme is no longer parsed for requirements; <code>validate_plugin_requirements()<\/code> in core reads the header through <code>get_plugin_data()<\/code> and nothing else.<\/li>\n<li><strong>Description<\/strong> appears in the admin plugin list (handbook: fewer than 140 characters); in the directory it is only a fallback.<\/li>\n<li><strong>Requires Plugins<\/strong> (since WordPress 6.5) takes a comma-separated list of directory slugs such as <code>woocommerce<\/code>, not paths like <code>my-plugin\/my-plugin.php<\/code>. Plugins hosted on WordPress.org may only depend on plugins that are also hosted there. The importer aborts the release when a slug cannot be resolved to a published plugin.<\/li>\n<li><strong>Update URI<\/strong> should not be used for a directory plugin. The importer accepts it only when it points to <code>wordpress.org\/plugins\/&lt;slug&gt;<\/code> of the same plugin and aborts the import otherwise.<\/li>\n<li><strong>Text Domain<\/strong> matches the slug; translations are the topic of <span class=\"lw-artikel-geplant\">a separate article in this series<\/span>.<\/li>\n<\/ul>\n<h2>The readme.txt: header fields, short description, sections<\/h2>\n<p>The readme uses a customised Markdown dialect with <code>==<\/code> headings. A complete readme for the sample plugin looks like this:<\/p>\n<pre><code>=== LW Reading Time ===\nContributors: lukaswojcik\nTags: reading time, posts, content\nRequires at least: 6.5\nTested up to: 7.1\nRequires PHP: 7.4\nStable tag: 1.2.0\nLicense: GPLv2 or later\nLicense URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n\nShows the estimated reading time above single posts, based on the word count of the post content.\n\n== Description ==\n\nLW Reading Time counts the words of a post and shows the estimated reading time above the content of single posts.\n\n* No settings page, no database tables.\n* The output is a single paragraph with the class `lw-reading-time`.\n* Translations are managed on translate.wordpress.org.\n\n== Installation ==\n\n1. Install the plugin via Plugins &gt; Add New, or upload the folder `lw-reading-time` to `\/wp-content\/plugins\/`.\n2. Activate the plugin.\n3. Open any single post; the reading time appears above the content.\n\n== Frequently Asked Questions ==\n\n= How is the reading time calculated? =\n\nThe word count of the post content is divided by 200 and rounded up to full minutes.\n\n= Does the plugin change pages? =\n\nNo. Only single posts of the post type `post` are changed.\n\n== Screenshots ==\n\n1. Reading time above a single post.\n2. The same post with the Polish translation active.\n\n== Changelog ==\n\n= 1.2.0 =\n* Plural forms for the reading time label.\n* WordPress 6.5 or later is required.\n\n= 1.1.0 =\n* Output limited to the main query.\n\n== Upgrade Notice ==\n\n= 1.2.0 =\nAdds plural forms. WordPress 6.5 or later is now required.<\/code><\/pre>\n<h3>Header fields<\/h3>\n<ul>\n<li><strong>Contributors<\/strong> must list WordPress.org usernames. The parser strips a leading <code>@<\/code>, looks each entry up as a login name and then as a profile slug, and drops anything it cannot find with a warning. The handbook describes the list as case sensitive.<\/li>\n<li><strong>Tags<\/strong> accepts at most five terms; the rest is ignored with a warning. The tags <code>plugin<\/code> and <code>wordpress<\/code> are removed outright, and the validator adds a note for tags used by fewer than five plugins. The handbook also rules out competitors\u2019 plugin names as tags.<\/li>\n<li><strong>Tested up to<\/strong> should contain numbers only, for example <code>7.1<\/code>. The directory ignores minor versions and adds the current one itself, which is why the Plugin Check page currently shows \u201cTested up to 7.0.6\u201d. A value higher than the current stable branch plus 0.1 is discarded: with WordPress 7.1.2 as the current release on 29.09.2026, <code>7.2<\/code> is accepted and <code>7.3<\/code> is not.<\/li>\n<li><strong>Requires PHP<\/strong> must look like <code>x.y<\/code> or <code>x.y.z<\/code>; anything else is ignored with a warning.<\/li>\n<li><strong>License<\/strong> is checked against keyword lists. Terms such as \u201cNonCommercial\u201d or \u201cproprietary\u201d produce an error in the validator; an unknown licence only produces a note.<\/li>\n<li><strong>Stable tag<\/strong> is the field that controls the whole SVN mechanism and gets its own section below.<\/li>\n<\/ul>\n<h3>Short description and sections<\/h3>\n<p>The text after the header fields up to the first section heading is the short description, shown directly under the plugin name; the parser joins several lines or paragraphs into one. The parser allows 150 characters, counted after Markdown and HTML have been removed. Longer text is cut at a full stop within the last fifth of the limit, otherwise with an ellipsis, and the validator warns. If the line is missing, the first line of the description takes its place.<\/p>\n<p>The expected sections are Description, Installation, Frequently Asked Questions, Screenshots, Changelog and Upgrade Notice. Unknown sections are not lost; they are appended to the description with their title as a subheading. Each section is limited to 2,500 words, FAQ and changelog to 5,000 words; longer text is truncated. FAQ entries written as <code>= Question =<\/code> become a definition list on the plugin page, and the numbered lines under Screenshots become the captions of <code>screenshot-1<\/code>, <code>screenshot-2<\/code> and so on. The handbook adds that readme files larger than 10 kB may cause errors and recommends moving older changelog entries into a separate <code>changelog.txt<\/code>.<\/p>\n<p>The Upgrade Notice is not a tab on the plugin page. The importer stores it separately, the directory API delivers it, and WordPress shows it as plain text on the Dashboard \u2192 Updates screen next to the pending update. The official sample readme recommends at most 300 characters; the parser does not enforce that.<\/p>\n<h2>Which value wins when header and readme disagree<\/h2>\n<p>The handbook only says in general terms that the version comes from the main file and everything else from the readme. The import code of the directory is more precise. The following table summarises what it does as of 29.09.2026:<\/p>\n<table>\n<thead>\n<tr>\n<th>Shown on the plugin page<\/th>\n<th>Value that wins<\/th>\n<th>Fallback<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Plugin name (page title)<\/td>\n<td>Readme title line <code>=== \u2026 ===<\/code>, unless it equals the slug<\/td>\n<td>Header <code>Plugin Name<\/code><\/td>\n<\/tr>\n<tr>\n<td>Line under the name<\/td>\n<td>Readme short description<\/td>\n<td>Header <code>Description<\/code><\/td>\n<\/tr>\n<tr>\n<td>Version, download button<\/td>\n<td>Header <code>Version<\/code><\/td>\n<td>none<\/td>\n<\/tr>\n<tr>\n<td>\u201cWordPress version \u2026 or higher\u201d<\/td>\n<td>Header <code>Requires at least<\/code>, if well formed<\/td>\n<td>Readme<\/td>\n<\/tr>\n<tr>\n<td>\u201cPHP version \u2026 or higher\u201d<\/td>\n<td>Header <code>Requires PHP<\/code>, if well formed<\/td>\n<td>Readme<\/td>\n<\/tr>\n<tr>\n<td>\u201cTested up to\u201d<\/td>\n<td>Header <code>Tested up to<\/code>, if present and well formed<\/td>\n<td>Readme<\/td>\n<\/tr>\n<tr>\n<td>Tags, contributors, donate link<\/td>\n<td>Readme<\/td>\n<td>none<\/td>\n<\/tr>\n<tr>\n<td>Plugin and author homepage<\/td>\n<td>Header <code>Plugin URI<\/code>, <code>Author URI<\/code><\/td>\n<td>none<\/td>\n<\/tr>\n<tr>\n<td>Released code<\/td>\n<td><code>Stable tag<\/code> in <code>trunk\/readme.txt<\/code><\/td>\n<td><code>trunk\/<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u201cWell formed\u201d means at least three characters consisting of digits and dots. The \u201cTested up to\u201d row is easy to miss: the importer registers <code>Tested up to<\/code> as an additional header for the main file, so a value there overrides the readme, and Plugin Check reports a mismatch between the two. Since core evaluates requirements from the header only, the requirement values are best kept identical in both files.<\/p>\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/wp-readme-svn-en.png?v=20260930\" width=\"1120\" height=\"580\" alt=\"Which file feeds which part of the WordPress.org plugin page\"><figcaption>The trunk readme only names the Stable tag; the tagged folder, the header and assets\/ fill the page<\/figcaption><\/figure>\n<h2>SVN layout: trunk, tags and assets<\/h2>\n<p>After approval every plugin gets a repository at <code>https:\/\/plugins.svn.wordpress.org\/&lt;slug&gt;<\/code> with three folders: <code>trunk\/<\/code> for the current code, <code>tags\/<\/code> for releases and <code>assets\/<\/code> for images and the blueprint. <code>branches\/<\/code> is no longer created. The handbook treats SVN as a release repository: every commit rebuilds the ZIP files of all versions, one reason why changes can take up to six hours to show.<\/p>\n<h3>How the Stable tag selects the code<\/h3>\n<p>The import starts with <code>trunk\/readme.txt<\/code> and reads only one line from it, <code>Stable tag<\/code>. With <code>Stable tag: 1.2.0<\/code>, the directory looks for <code>tags\/1.2.0\/<\/code>. If that folder exists and contains files, everything else comes from there: the readme shown on the page, the plugin header and the ZIP that users download. Edits to the description in <code>trunk\/readme.txt<\/code> have no effect on the page as long as the tag exists. The readme inside the tag must also carry the correct Stable tag; otherwise, according to the handbook, the plugin may stop updating.<\/p>\n<p>The folder name selects the code, but it does not set the version. The version on the download button comes from the <code>Version<\/code> header in the tagged main file. If <code>tags\/1.4\/<\/code> contains <code>Version: 1.3<\/code>, the page shows 1.3, and the importer reports that header and tag do not match. Quotes around the Stable tag value and a <code>tags\/<\/code> prefix are removed by the parser.<\/p>\n<h3>Assets: names, sizes and the blueprint<\/h3>\n<p>Everything in <code>assets\/<\/code> applies to all versions and is not part of the ZIP. Images placed in <code>trunk\/assets\/<\/code> or <code>tags\/1.0\/assets\/<\/code> are not used. The file names are fixed:<\/p>\n<table>\n<thead>\n<tr>\n<th>Purpose<\/th>\n<th>File name<\/th>\n<th>Maximum size<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Banner<\/td>\n<td><code>banner-772x250.png<\/code> or <code>.jpg<\/code><\/td>\n<td>4 MB<\/td>\n<\/tr>\n<tr>\n<td>Banner, high DPI<\/td>\n<td><code>banner-1544x500.png<\/code> or <code>.jpg<\/code><\/td>\n<td>4 MB<\/td>\n<\/tr>\n<tr>\n<td>Icon<\/td>\n<td><code>icon-128x128.png<\/code>, <code>.jpg<\/code> or <code>.gif<\/code><\/td>\n<td>1 MB<\/td>\n<\/tr>\n<tr>\n<td>Icon, high DPI<\/td>\n<td><code>icon-256x256.png<\/code>, <code>.jpg<\/code> or <code>.gif<\/code><\/td>\n<td>1 MB<\/td>\n<\/tr>\n<tr>\n<td>Icon, vector<\/td>\n<td><code>icon.svg<\/code> plus a PNG fallback<\/td>\n<td>1 MB<\/td>\n<\/tr>\n<tr>\n<td>Screenshots<\/td>\n<td><code>screenshot-1.png<\/code>, <code>screenshot-2.jpg<\/code> \u2026<\/td>\n<td>10 MB<\/td>\n<\/tr>\n<tr>\n<td>Playground preview<\/td>\n<td><code>blueprints\/blueprint.json<\/code><\/td>\n<td>100 kB (importer limit)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The pixel dimensions must match the names, and the high-DPI banner works only in addition to the normal one. File names must be lowercase. Banners and screenshots can be localised with suffixes such as <code>-de<\/code>, banners also with <code>-rtl<\/code>. Because of CDN caching, new images may take up to six hours to appear.<\/p>\n<p>For the blueprint the importer accepts only valid JSON and appends an <code>installPlugin<\/code> step with activation if the file does not install the plugin itself. The Preview button is visible to committers only until a committer switches the preview to public in the plugin\u2019s Advanced view. Writing the blueprint is covered in <span class=\"lw-artikel-geplant\">the article on Playground and Blueprints<\/span> in this series.<\/p>\n<h2>Complete command sequence for a first release and an update<\/h2>\n<p>The SVN username is the WordPress.org username, not the e-mail address, and it is case sensitive. A separate SVN password can be set in the WordPress.org profile. The following sequence covers the first release of version 1.2.0 including assets:<\/p>\n<pre><code># First release: check out the repository created after approval.\nsvn co https:\/\/plugins.svn.wordpress.org\/lw-reading-time lw-reading-time-svn\ncd lw-reading-time-svn\n\n# Main plugin file and readme.txt go directly into trunk\/, not into a subfolder.\ncp ..\/lw-reading-time\/lw-reading-time.php ..\/lw-reading-time\/readme.txt trunk\/\nsvn add trunk\/*\n\n# Banner, icon, screenshots and blueprint go into the top-level assets\/ folder.\ncp ..\/lw-reading-time-assets\/banner-772x250.png ..\/lw-reading-time-assets\/banner-1544x500.png assets\/\ncp ..\/lw-reading-time-assets\/icon-128x128.png ..\/lw-reading-time-assets\/icon-256x256.png assets\/\ncp ..\/lw-reading-time-assets\/screenshot-1.png ..\/lw-reading-time-assets\/screenshot-2.png assets\/\nmkdir assets\/blueprints\ncp ..\/lw-reading-time-assets\/blueprint.json assets\/blueprints\/\nsvn add assets\/*\n\n# Serve the images as images instead of application\/octet-stream.\nsvn propset svn:mime-type image\/png assets\/*.png\n\n# The username is case sensitive.\nsvn ci -m \"Add LW Reading Time 1.2.0 to trunk, add assets\" --username WPORG_USERNAME\n\n# Tag the release from trunk and commit the tag.\nsvn cp trunk tags\/1.2.0\nsvn ci -m \"Tag version 1.2.0\"<\/code><\/pre>\n<p>Between the two commits the Stable tag points to a tag that does not exist yet, so the directory briefly falls back to <code>trunk\/<\/code>; the handbook calls this harmless. The <code>svn propset<\/code> line is the documented fix for images that browsers download instead of displaying; for JPEG files the type is <code>image\/jpeg<\/code>.<\/p>\n<p>For every later release the handbook recommends editing <code>trunk\/<\/code> first, including the new Stable tag, then copying trunk to the new tag with <code>svn cp<\/code> and committing both in one step:<\/p>\n<pre><code># Next release: bring the working copy up to date.\ncd lw-reading-time-svn\nsvn up\n\n# Version header and Stable tag both say 1.3.0 in the copied files.\ncp ..\/lw-reading-time\/lw-reading-time.php ..\/lw-reading-time\/readme.txt trunk\/\nsvn add --force trunk\nsvn stat\nsvn diff\n\n# Copy trunk to the new tag and commit trunk and tag together.\nsvn cp trunk tags\/1.3.0\nsvn ci -m \"Release 1.3.0\"<\/code><\/pre>\n<p>Because <code>svn cp<\/code> works inside the working copy, SVN keeps the history, and the tag receives exactly the files of <code>trunk\/<\/code>, including the readme with the correct Stable tag. Everything committed ends up on user sites, <code>.gitignore<\/code> included; ZIP archives do not belong in SVN at all.<\/p>\n<h2>Typical errors and the readme validator<\/h2>\n<p>Most problems after a release trace back to a handful of causes:<\/p>\n<ul>\n<li><strong>Stable tag points to a tag that does not exist.<\/strong> The importer falls back to <code>trunk\/<\/code> with a warning, and users receive whatever is in trunk, possibly unfinished code.<\/li>\n<li><strong><code>Stable tag: trunk<\/code>.<\/strong> It still works, but the handbook calls it unsupported and prohibits it for new plugins. The validator flags every Stable tag containing \u201ctrunk\u201d, and with release confirmation enabled the importer rejects a release from trunk.<\/li>\n<li><strong>Tag created, header not updated.<\/strong> The page keeps showing the old version, and the importer reports a mismatch between Version header and tag.<\/li>\n<li><strong>Readme edited only in trunk.<\/strong> As long as the Stable tag points to an existing tag, the change does not appear.<\/li>\n<li><strong>Wrong asset names.<\/strong> Custom banner sizes, uppercase file names or assets inside <code>trunk\/<\/code> are ignored.<\/li>\n<li><strong>Dependencies outside the directory.<\/strong> A slug in <code>Requires Plugins<\/code> that is not a published directory plugin stops the import.<\/li>\n<\/ul>\n<p>The readme validator at <code>wordpress.org\/plugins\/developers\/readme-validator\/<\/code> runs the same parser as the directory. It accepts pasted text or a URL on <code>plugins.svn.wordpress.org<\/code>, <code>themes.svn.wordpress.org<\/code> or <code>raw.githubusercontent.com<\/code> up to 512 kB. Errors include a missing or placeholder name such as the literal <code>=== Plugin Name ===<\/code>, a trademark in the name and an incompatible licence. Warnings cover an invalid Stable tag, a missing or ignored \u201cTested up to\u201d, ignored contributors, surplus tags and truncated text. Notes list missing optional parts such as FAQ, changelog or screenshots. The validator sees only the readme; tag existence, version match and dependencies are checked during the import.<\/p>\n<h2>Limits and open points<\/h2>\n<p>The statements about precedence rely on the directory\u2019s source code in the GitHub mirror of the meta repository as of 29.09.2026. That code changes often; the import class alone received several commits in September 2026. Behaviour can shift without the handbook being updated.<\/p>\n<p>Some points remain open. The handbook statement that readmes are no longer parsed for requirements refers to WordPress core; the directory still uses readme values as a fallback. Which Upgrade Notice entry the update API selects for a given update was not traced. How strictly the contributor lookup treats upper and lower case was not tested.<\/p>\n<p>MIME type commands are documented for PNG and JPEG only, not for SVG icons, and the 10 kB readme size is a vague warning rather than a hard limit.<\/p>\n<p>The sample plugin has not been submitted. On a test installation with WordPress 7.1.2 it activates without notices, and Plugin Check 2.1.0 reports no errors for it. Both SVN command sequences ran without errors against a local repository. The validator behaviour described here comes from its source code.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>Does the plugin page take its description from trunk\/readme.txt or from the tag?<\/h3>\n<p>From the tag. In <code>trunk\/readme.txt<\/code> only the <code>Stable tag<\/code> line is read. If the named folder under <code>tags\/<\/code> exists and contains files, the readme, the plugin header and the ZIP all come from there. Changes that exist only in trunk do not appear as long as the tag exists.<\/p>\n<h3>Why does the plugin page show a different \u201cTested up to\u201d value than the readme?<\/h3>\n<p>There are two common reasons:<\/p>\n<ul>\n<li>The directory ignores minor versions and adds the current one itself, so <code>7.0<\/code> becomes something like <code>7.0.6<\/code>.<\/li>\n<li>A <code>Tested up to<\/code> line in the main file header overrides the readme when it is well formed.<\/li>\n<\/ul>\n<p>A value too far above the current stable branch is discarded by the parser altogether.<\/p>\n<h3>Can a directory plugin depend on a plugin that is sold outside WordPress.org?<\/h3>\n<p>No. Plugins hosted on WordPress.org may only list plugins in <code>Requires Plugins<\/code> that are hosted there as well, written as slugs, not as paths. If a slug cannot be resolved to a published plugin, the importer aborts the release.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/wordpress-org\/how-your-readme-txt-works\/\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Handbook: How your readme.txt works<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Handbook: Header Requirements<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/wordpress-org\/how-to-use-subversion\/\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Handbook: Using Subversion<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/wordpress-org\/plugin-assets\/\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Handbook: How Your Plugin Assets Work<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/wordpress-org\/previews-and-blueprints\/\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Handbook: Previews and Blueprints<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/developers\/readme-validator\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress.org: Readme Validator<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/readme.txt\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress.org: sample readme.txt<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress.org\/blob\/trunk\/wordpress.org\/public_html\/wp-content\/plugins\/plugin-directory\/readme\/class-parser.php\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub WordPress\/wordpress.org: readme parser (class-parser.php)<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress.org\/blob\/trunk\/wordpress.org\/public_html\/wp-content\/plugins\/plugin-directory\/readme\/class-validator.php\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub WordPress\/wordpress.org: readme validator (class-validator.php)<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress.org\/blob\/trunk\/wordpress.org\/public_html\/wp-content\/plugins\/plugin-directory\/cli\/class-import.php\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub WordPress\/wordpress.org: plugin importer (class-import.php)<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/trunk\/src\/wp-admin\/includes\/plugin.php\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub WordPress\/wordpress-develop: validate_plugin_requirements() in plugin.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/trunk\/src\/wp-admin\/update-core.php\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub WordPress\/wordpress-develop: upgrade notice in update-core.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/make.wordpress.org\/core\/2024\/03\/05\/introducing-plugin-dependencies-in-wordpress-6-5\/\" target=\"_blank\" rel=\"noopener noreferrer\">Make WordPress Core: Introducing Plugin Dependencies in WordPress 6.5<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/plugin-check\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress.org: Plugin Check (PCP), plugin page and changelog<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/api.wordpress.org\/core\/version-check\/1.7\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress.org API: core version check (current release 7.1.2)<\/a> (retrieved 29.09.2026)<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The plugin header, the readme.txt and the SVN tags decide together what the WordPress.org directory shows. The importer code settles which field wins.<\/p>\n","protected":false},"author":1,"featured_media":20899,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[91144,92757,91096],"class_list":["post-20860","post","type-post","status-publish","format-standard","hentry","category-wordpress-plugins-tricks","tag-devops","tag-web-development","tag-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>readme.txt, header and SVN: how WordPress.org reads a plugin | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Header or readme.txt: which value the WordPress.org plugin page shows, how the Stable tag picks the code, asset names and a full SVN command sequence.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"readme.txt, header and SVN: how WordPress.org reads a plugin | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Header or readme.txt: which value the WordPress.org plugin page shows, how the Stable tag picks the code, asset names and a full SVN command sequence.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-10T06:47:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20860-readme-header-svn.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"readme.txt, header and SVN: how WordPress.org reads a plugin\",\"datePublished\":\"2026-10-10T06:47:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/\"},\"wordCount\":2424,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20860-readme-header-svn.png\",\"keywords\":[\"DevOps\",\"Web Development\",\"WordPress\"],\"articleSection\":[\"WordPress Plugins &amp; Tricks\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/\",\"name\":\"readme.txt, header and SVN: how WordPress.org reads a plugin | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20860-readme-header-svn.png\",\"datePublished\":\"2026-10-10T06:47:00+00:00\",\"description\":\"Header or readme.txt: which value the WordPress.org plugin page shows, how the Stable tag picks the code, asset names and a full SVN command sequence.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20860-readme-header-svn.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20860-readme-header-svn.png\",\"width\":1200,\"height\":630,\"caption\":\"readme.txt, header and SVN: how WordPress.org reads a plugin\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/readme-header-svn\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"readme.txt, header and SVN: how WordPress.org reads a plugin\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"readme.txt, header and SVN: how WordPress.org reads a plugin | Lukas Wojcik","description":"Header or readme.txt: which value the WordPress.org plugin page shows, how the Stable tag picks the code, asset names and a full SVN command sequence.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/","og_locale":"en_US","og_type":"article","og_title":"readme.txt, header and SVN: how WordPress.org reads a plugin | Lukas Wojcik","og_description":"Header or readme.txt: which value the WordPress.org plugin page shows, how the Stable tag picks the code, asset names and a full SVN command sequence.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-10T06:47:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20860-readme-header-svn.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"readme.txt, header and SVN: how WordPress.org reads a plugin","datePublished":"2026-10-10T06:47:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/"},"wordCount":2424,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20860-readme-header-svn.png","keywords":["DevOps","Web Development","WordPress"],"articleSection":["WordPress Plugins &amp; Tricks"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/","name":"readme.txt, header and SVN: how WordPress.org reads a plugin | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20860-readme-header-svn.png","datePublished":"2026-10-10T06:47:00+00:00","description":"Header or readme.txt: which value the WordPress.org plugin page shows, how the Stable tag picks the code, asset names and a full SVN command sequence.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20860-readme-header-svn.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20860-readme-header-svn.png","width":1200,"height":630,"caption":"readme.txt, header and SVN: how WordPress.org reads a plugin"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/readme-header-svn\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"readme.txt, header and SVN: how WordPress.org reads a plugin"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=20860"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20860\/revisions"}],"predecessor-version":[{"id":21735,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20860\/revisions\/21735"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/20899"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=20860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}