✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Создайте виртуальный файл в WordPress с поддержкой WordPress Multisite

25

Недавно я работал над экземпляром WordPress Multisite, и мне нужно было, чтобы каждый сайт (многоязычный в данном случае) имел собственную уникальную динамически генерируемую карту сайта. Я сгенерировал эти карты сайта, создав виртуальные файлы в WordPress.

В этой статье показано, как создать виртуальный файл, а затем как сделать так, чтобы этот виртуальный файл не был доступен через каждый сайт в вашем экземпляре WordPress Multisite.

Настройка правил перезаписи

Чтобы создать виртуальный файл, первое, что нам нужно сделать, это создать некоторые правила перезаписи, чтобы 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 );

Обратите внимание, как мы добавляем переменную запроса «карта», а затем сопоставляем имя нашей карты сайта с этим запросом.

Предотвратить каноническую переадресацию

Иногда, если у вас включены канонические перенаправления (скажем, через плагин, такой как 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крючок. Вот очень упрощенная версия того, как могут выглядеть наши карты сайта.

Обратите внимание, как мы используем переменную карты, чтобы определить, какой виртуальный файл мы хотим отобразить.

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-адресами, перетащив их содержимое в файл. Например, здесь мы используем карты сайта в корневом каталоге «карты» и динамически включаем их на основе переменной карты.

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 для других методов, которые могут иметь отношение к вашему сценарию.

Наша карта сайта на французском языке

Это отлично работает! Виртуальные файлы создаются без проблем, но если я затем зайду на французскую версию сайта и поищу карту сайта (например: mattwatson.codes/fr/sitemap.xml ), я смогу увидеть английскую версию карты сайта. Не идеально.

Уникальные виртуальные файлы в мультисайте WordPress

Решение для предотвращения виртуальных файлов в других экземплярах 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, вышеуказанная функция не работает, поэтому вы можете проверить, get_current_blog_idсуществует ли эта функция, прежде чем пытаться ее использовать.

Источник записи: wholesomecode.ltd

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее