✅ Notícias, temas e plug-ins da WEB e do WordPress. Aqui compartilhamos dicas e as melhores soluções para sites.

Crie um arquivo virtual no WordPress com suporte para WordPress Multisite

20

Recentemente, eu estava trabalhando em uma instância do WordPress Multisite e precisava que cada site (multilíngue nesta instância) tivesse seu próprio mapa de site gerado dinamicamente. Eu gerei esses sitemaps criando arquivos virtuais dentro do WordPress.

Este artigo mostra como criar um arquivo virtual e como garantir que esse arquivo virtual não seja acessível em todos os sites em sua instância do WordPress Multisite.

Configurando Regras de Reescrita

Para criar um arquivo virtual, a primeira coisa que precisamos fazer é criar algumas regras de reescrita, para que o WordPress saiba o que fazer com a URL virtual onde queremos que nosso arquivo apareça.

O exemplo a seguir cria dois URLs de mapa de site sitemap.xml e 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 );

Observe como adicionamos uma variável de consulta de ‘map’ e, em seguida, mapeamos o nome do nosso sitemap para essa consulta.

Impedir redirecionamentos canônicos

Às vezes, se você tiver redirecionamentos canônicos ativados (digamos, por meio de um plug-in como o Yoast SEO), o WordPress tentará adicionar uma barra ao final do seu URL. Podemos evitar isso usando esta função.

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' );

Criando o conteúdo do arquivo virtual

Agora, finalmente, precisamos configurar os próprios arquivos virtuais. Para fazer isso, podemos enganchar no template_includegancho. Aqui está uma versão muito simplificada de como nossos sitemaps podem ser.

Observe como usamos a variável map para determinar qual arquivo virtual desejamos exibir.

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' );

Bônus: inclua arquivos estáticos em seu URL virtual

O exemplo acima foi muito simples, mas você pode mapear arquivos estáticos para esses URLs virtuais puxando o conteúdo deles para o arquivo. Por exemplo, aqui estamos usando sitemaps no diretório raiz ‘maps’ e incluindo-os dinamicamente com base na variável 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' );

Liberando Regras de Reescrita

A última coisa que você precisará fazer, antes de ver seus arquivos virtuais, é liberar as regras de reescrita. Se você colou o direcionamento acima no functions.phpmelhor curso de ação é acessar Settings > Permalinksseu painel do WordPress e salvar novamente seus permalinks. Mas se você estiver construindo um plugin, você pode se conectar ao gancho de ativação para que ele seja ativado automaticamente quando você ativar seu plugin:

register_activation_hook( __FILE__, 'flush_rewrite_rules' );

Você pode ler mais sobre regras de liberação no WordPress Codex para outros métodos que podem ser relevantes para o seu cenário.

Nosso mapa do site francês

Isso funciona muito bem! Os arquivos virtuais são criados sem problemas, mas se eu visitar a versão francesa do site e procurar o mapa do site (por exemplo: mattwatson.codes/fr/sitemap.xml) eu conseguiria ver a versão em inglês do sitemap. Não é ideal.

Arquivos virtuais exclusivos no WordPress Multisite

A solução para evitar arquivos virtuais em suas outras instâncias do WordPress Multisite é muito simples. Tudo o que você precisa fazer ao configurar suas reescritas é verificar se o site que você está visualizando no momento é aquele em que deseja que o arquivo virtual apareça.

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 );

Se você tiver o WordPress Multisite desativado, a função acima será interrompida, portanto, verifique se a get_current_blog_idfunção existe antes de tentar usá-la.

Fonte de gravação: wholesomecode.ltd

Este site usa cookies para melhorar sua experiência. Presumiremos que você está ok com isso, mas você pode cancelar, se desejar. Aceitar Consulte Mais informação