✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Створіть віртуальний файл у WordPress із підтримкою WordPress Multisite

18

Нещодавно я працював над екземпляром 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існує ця функція, перш ніж спробувати її використовувати.

Джерело запису: wholesomecode.ltd

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі