Створіть віртуальний файл у WordPress із підтримкою WordPress Multisite
Нещодавно я працював над екземпляром WordPress Multisite, і мені потрібно було, щоб кожен сайт (у цьому випадку багатомовний) мав власну унікальну динамічно згенеровану карту сайту. Я створив ці карти сайту, створивши віртуальні файли в WordPress.
У цій статті показано, як створити віртуальний файл, а потім як переконатися, що цей віртуальний файл не буде доступним через усі сайти у вашому багатосайтовому екземплярі WordPress.
Налаштування правил перезапису
Щоб створити віртуальний файл, перше, що нам потрібно зробити, це створити деякі правила перезапису, щоб WordPress знав, що робити з віртуальною URL-адресою, де ми хочемо, щоб з’явився наш файл.
У наступному прикладі створюються дві URL-адреси карти сайту sitemap.xml і sitemap-fr.xml.
function wholesomecode_sitemap_rewrites() {
global $wp;
$wp->add_query_var( 'map' );
add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );
add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );
}
add_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );
Зверніть увагу, як ми додаємо змінну запиту ‘map’, а потім зіставляємо назву нашої карти сайту з цим запитом.
Запобігання канонічним перенаправленням
Іноді, якщо у вас увімкнено канонічне переспрямування (наприклад, через плагін, наприклад Yoast SEO), WordPress намагатиметься додати скісну риску в кінці вашої URL-адреси. Ми можемо запобігти цьому, використовуючи цю функцію.
function wholesomecode_prevent_slash_on_map_variable( $redirect) {
if (get_query_var( 'map')) {
return false;
}
return $redirect;
}
add_filter( 'redirect_canonical', 'wholesomecode_prevent_slash_on_map_variable' );
Створення вмісту віртуального файлу
Тепер, нарешті, нам потрібно налаштувати самі віртуальні файли. Для цього ми можемо зачепити template_includeгачок. Ось дуже спрощена версія того, як можуть виглядати наші карти сайту.
Зверніть увагу, як ми використовуємо змінну map, щоб визначити, який віртуальний файл ми хочемо відобразити.
function wholesomecode_sitemap_contents( $template) {
$map = get_query_var( 'map' );
if (! empty( $map)) {
header( 'Content-type: text/xml' );
if ('sitemap' === $map) {
?>
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https:
</sitemap>
</sitemapindex>
<?php
} elseif ('sitemap-fr' === $map) {
?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https:
</sitemap>
</sitemapindex>
<?php
}
die();
}
return $template;
}
add_action( 'template_include', 'wholesomecode_sitemap_contents' );
Бонус: додайте статичні файли до віртуальної URL-адреси
Наведений вище приклад був дуже простим, але ви могли зіставити статичні файли з цими віртуальними URL-адресами, перетягнувши їх вміст у файл. Наприклад, тут ми використовуємо карти сайту в кореневому каталозі «maps» і динамічно включаємо їх на основі змінної map.
function wholesomecode_sitemap_from_file( $template) {
$map = get_query_var( 'map' );
if (! empty( $map)) {
if (! function_exists( 'get_home_path')) {
include_once ABSPATH. '/wp-admin/includes/file.php';
}
header( 'Content-type: text/xml' );
include get_home_path(). 'maps/'. $map. '.xml';
die;
}
return $template;
}
add_action( 'template_include', 'wholesomecode_sitemap_from_file' );
Скидання правил перезапису
Останнє, що вам потрібно буде зробити, перш ніж ви побачите свої віртуальні файли, це скинути правила перезапису. Якщо ви вставили наведені вище вказівки в functions.phpнайкращий спосіб дій, це перейти на Settings > Permalinksінформаційну панель WordPress і повторно зберегти свої постійні посилання. Але якщо ви створюєте плагін, ви можете підключитися до гака активації, щоб він автоматично запускався, коли ви активуєте плагін:
register_activation_hook( __FILE__, 'flush_rewrite_rules' );
Ви можете прочитати більше про правила очищення в WordPress Codex для інших методів, які можуть бути доречними для вашого сценарію.
Наша французька карта сайту
Це чудово працює! Віртуальні файли створюються без проблем, але якщо я потім відвідаю французьку версію сайту та пошукаю карту сайту (наприклад: mattwatson.codes/fr/sitemap.xml ), я зможу побачити англійську версію карти сайту. Не ідеальний.
Унікальні віртуальні файли в WordPress Multisite
Рішення для запобігання віртуальним файлам в інших примірниках WordPress Multisite насправді досить просте. Усе, що вам потрібно зробити, коли ви налаштовуєте свої перезаписи, це перевірити, чи сайт, який ви зараз переглядаєте, є тим, на якому ви хочете, щоб цей віртуальний файл з’явився.
function wholesomecode_sitemap_rewrites() {
global $wp;
$wp->add_query_var( 'map' );
if (get_current_blog_id() == '1') {
add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );
}
if (get_current_blog_id() === get_id_from_blogname( 'fr')) {
add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );
}
}
add_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );
Якщо у вас вимкнено WordPress Multisite, зазначена вище функція не працюватиме, тому ви можете перевірити, чи get_current_blog_idіснує ця функція, перш ніж спробувати її використовувати.