{"id":228152,"date":"2022-10-15T10:31:00","date_gmt":"2022-10-15T07:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228152"},"modified":"2022-11-09T00:59:17","modified_gmt":"2022-11-08T21:59:17","slug":"utworz-wirtualny-plik-w-wordpress-z-obsluga-wordpress-multisite","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/utworz-wirtualny-plik-w-wordpress-z-obsluga-wordpress-multisite\/","title":{"rendered":"Utw\u00f3rz wirtualny plik w WordPress z obs\u0142ug\u0105 WordPress Multisite"},"content":{"rendered":"\n<p>Ostatnio pracowa\u0142em nad instancj\u0105 WordPress Multisite i potrzebowa\u0142em, aby ka\u017cda witryna (w tym przypadku wieloj\u0119zyczna) mia\u0142a w\u0142asn\u0105 unikaln\u0105, dynamicznie generowan\u0105 map\u0119 witryny. Wygenerowa\u0142em te mapy witryn, tworz\u0105c <strong>wirtualne pliki<\/strong> w WordPressie.<\/p>\n<p>W tym artykule pokazano, jak utworzy\u0107 plik wirtualny, a nast\u0119pnie jak upewni\u0107 si\u0119, \u017ce ten plik wirtualny nie jest dost\u0119pny przez ka\u017cd\u0105 witryn\u0119 w instancji WordPress Multisite.<\/p>\n<h2>Konfigurowanie regu\u0142 przepisywania<\/h2>\n<p>Aby utworzy\u0107 wirtualny plik, pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 musimy zrobi\u0107, to stworzy\u0107 kilka regu\u0142 przepisywania, aby WordPress wiedzia\u0142, co zrobi\u0107 z wirtualnym adresem URL, w kt\u00f3rym chcemy, aby pojawi\u0142 si\u0119 nasz plik.<\/p>\n<p>Poni\u017cszy przyk\u0142ad tworzy dwa adresy URL mapy witryny sitemap.xml i sitemap-fr.xml.<\/p>\n<pre><code>function wholesomecode_sitemap_rewrites() {\n    global $wp;\n    $wp-&gt;add_query_var( 'map' );\n\n    add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );\n    add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );\n}\nadd_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );\n<\/code><\/pre>\n<p>Zwr\u00f3\u0107 uwag\u0119, jak dodajemy zmienn\u0105 zapytania \u201emap&quot;, a nast\u0119pnie mapujemy nazw\u0119 naszej mapy witryny na to zapytanie.<\/p>\n<h2>Zapobiegaj przekierowaniom kanonicznym<\/h2>\n<p>Czasami, je\u015bli masz w\u0142\u0105czone przekierowania kanoniczne (np. przez wtyczk\u0119, tak\u0105 jak Yoast SEO), WordPress spr\u00f3buje doda\u0107 uko\u015bnik na ko\u0144cu adresu URL. Mo\u017cemy temu zapobiec, korzystaj\u0105c z tej funkcji.<\/p>\n<pre><code>function wholesomecode_prevent_slash_on_map_variable( $redirect) {\n    if (get_query_var( 'map')) {\n        return false;\n    }\n    return $redirect;\n}\nadd_filter( 'redirect_canonical', 'wholesomecode_prevent_slash_on_map_variable' );\n<\/code><\/pre>\n<h2>Tworzenie wirtualnej zawarto\u015bci pliku<\/h2>\n<p>Teraz w ko\u0144cu musimy skonfigurowa\u0107 same pliki wirtualne. W tym celu mo\u017cemy zaczepi\u0107 si\u0119 o <code>template_include<\/code>haczyk. Oto bardzo uproszczona wersja tego, jak mog\u0105 wygl\u0105da\u0107 nasze mapy witryn.<\/p>\n<p>Zwr\u00f3\u0107 uwag\u0119, jak u\u017cywamy zmiennej map do okre\u015blenia, kt\u00f3ry plik wirtualny chcemy wy\u015bwietli\u0107.<\/p>\n<pre><code>function wholesomecode_sitemap_contents( $template) {\n    $map = get_query_var( 'map' );\n    if (! empty( $map)) {\n        header( 'Content-type: text\/xml' );\n        if ('sitemap' === $map) {\n            ?&gt;\n            &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n            &lt;sitemapindex xmlns=\"http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9\"&gt;\n                &lt;sitemap&gt;\n                    &lt;loc&gt;https:\n                &lt;\/sitemap&gt;\n            &lt;\/sitemapindex&gt;\n            &lt;?php\n        } elseif ('sitemap-fr' === $map) {\n            ?&gt;\n            &lt;sitemapindex xmlns=\"http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9\"&gt;\n                &lt;sitemap&gt;\n                    &lt;loc&gt;https:\n                &lt;\/sitemap&gt;\n            &lt;\/sitemapindex&gt;\n            &lt;?php\n        }\n        die();\n    }\n    return $template;\n}\nadd_action( 'template_include', 'wholesomecode_sitemap_contents' );\n<\/code><\/pre>\n<h3>Bonus: Do\u0142\u0105cz pliki statyczne do swojego wirtualnego adresu URL<\/h3>\n<p>Powy\u017cszy przyk\u0142ad by\u0142 bardzo prosty, ale mo\u017cna by\u0142o mapowa\u0107 pliki statyczne na te wirtualne adresy URL, przeci\u0105gaj\u0105c ich zawarto\u015b\u0107 do pliku. Na przyk\u0142ad tutaj u\u017cywamy map witryn w katalogu g\u0142\u00f3wnym \u201emaps&#8221; i dynamicznie do\u0142\u0105czamy je na podstawie zmiennej mapy.<\/p>\n<pre><code>function wholesomecode_sitemap_from_file( $template) {\n    $map = get_query_var( 'map' );\n    if (! empty( $map)) {\n        if (! function_exists( 'get_home_path')) {\n            include_once ABSPATH. '\/wp-admin\/includes\/file.php';\n        }\n        header( 'Content-type: text\/xml' );\n        include get_home_path(). 'maps\/'. $map. '.xml';\n        die;\n    }\n    return $template;\n}\nadd_action( 'template_include', 'wholesomecode_sitemap_from_file' );\n<\/code><\/pre>\n<h2>Flushing Rewrite Rules<\/h2>\n<p>Ostatni\u0105 rzecz\u0105, kt\u00f3r\u0105 musisz zrobi\u0107, zanim zobaczysz swoje wirtualne pliki, jest opr\u00f3\u017cnienie regu\u0142 przepisywania. Je\u015bli wklei\u0142e\u015b powy\u017csze wskaz\u00f3wki <code>functions.php<\/code>, najlepszym sposobem dzia\u0142ania jest przej\u015bcie do <code>Settings &gt; Permalinks<\/code>pulpitu WordPress i ponowne zapisanie permalink\u00f3w. Ale je\u015bli budujesz wtyczk\u0119, mo\u017cesz pod\u0142\u0105czy\u0107 si\u0119 do haka aktywacji, aby automatycznie uruchomi\u0142 si\u0119, gdy aktywujesz wtyczk\u0119:<\/p>\n<pre><code>register_activation_hook( __FILE__, 'flush_rewrite_rules' );\n<\/code><\/pre>\n<p>Mo\u017cesz <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/flush_rewrite_rules\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przeczyta\u0107 wi\u0119cej o regu\u0142ach opr\u00f3\u017cniania w Kodeksie WordPress<\/a>, aby pozna\u0107 inne metody, kt\u00f3re mog\u0105 by\u0107 odpowiednie dla twojego scenariusza.<\/p>\n<p>Nasza francuska mapa witryny<\/p>\n<p>To dzia\u0142a \u015bwietnie! Tworzenie wirtualnych plik\u00f3w nie stanowi problemu, ale gdybym nast\u0119pnie odwiedzi\u0142 francusk\u0105 wersj\u0119 witryny i poszuka\u0142 mapy witryny (np. <a href=\"https:\/\/mattwatson.codes\/fr\/sitemap.xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mattwatson.codes\/fr\/sitemap.xml<\/a> ), by\u0142bym w stanie zobaczy\u0107 angielsk\u0105 wersj\u0119 mapy witryny. Nieidealny.<\/p>\n<h2>Unikalne pliki wirtualne w WordPress Multisite<\/h2>\n<p>Rozwi\u0105zanie zapobiegaj\u0105ce wirtualnym plikom w innych instancjach WordPress Multisite jest po prostu naprawd\u0119. Wszystko, co musisz zrobi\u0107 podczas konfigurowania przepisywania, to sprawdzi\u0107, czy witryna, kt\u00f3r\u0105 aktualnie przegl\u0105dasz, jest t\u0105, w kt\u00f3rej chcesz, aby pojawi\u0142 si\u0119 ten wirtualny plik.<\/p>\n<pre><code>function wholesomecode_sitemap_rewrites() {\n    global $wp;\n    $wp-&gt;add_query_var( 'map' );\n\n    if (get_current_blog_id() == '1') {\n        add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );\n    }\n\n    if (get_current_blog_id() === get_id_from_blogname( 'fr')) {\n        add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );\n    }\n}\nadd_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );\n<\/code><\/pre>\n<p>Je\u015bli masz wy\u0142\u0105czony WordPress Multisite, powy\u017csza funkcja zepsuje si\u0119, wi\u0119c mo\u017cesz chcie\u0107 sprawdzi\u0107, czy <code>get_current_blog_id<\/code>funkcja istnieje, zanim spr\u00f3bujesz jej u\u017cy\u0107.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ostatnio pracowa\u0142em nad instancj\u0105 WordPress Multisite i potrzebowa\u0142em, aby ka\u017cda witryna (w tym przypadku wieloj\u0119zyczna) mia\u0142a w\u0142asn\u0105 unikaln\u0105, dynamicznie generowan\u0105 map\u0119 witryny. wygenerowa\u0142em&#8230;<\/p>\n","protected":false},"author":1,"featured_media":223984,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,805,845],"tags":[1169,1169],"class_list":["post-228152","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-php-7","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=228152"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228152\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}