Como dividir publicações longas do WordPress em páginas sem afetar o SEO

 
Como dividir publicações longas do WordPress em páginas sem afetar o SEO

Quando comecei a escrever um blogue, não segui nenhuma regra de SEO ou de otimização, nem nada disso. Limitava-me a publicar e pronto. Isto levou-me a acumular milhares de imagens não optimizadas e centenas de artigos longos, muito longos.

Depois, continuei a publicar outros artigos longos que optimizei apenas o suficiente. Assim, até à data, existem cerca de 100 artigos com mais de 1500 palavras, várias dezenas com mais de 3500 palavras. E muitos outros com mais de 1000 palavras.

Como dividir publicações longas do WordPress em páginas sem afetar o SEO 1

Muitos destes textos são os chamados artigos"evergreen" ou intemporais. Como são textos mais completos do que o típico post rápido, são normalmente os links que se classificam melhor e recebem mais tráfego orgânico constante. Essa é a boa notícia, a má notícia é que eram também os posts que carregavam pior e que davam más métricas porque o Google processa os URL's por grupos.

E isto tinha de ser corrigido, por muitas razões.

Porquê dividir mensagens longas?

A principal razão pela qual é aconselhável dividir posts longos em páginas é para aliviar a carga, especialmente aqueles que têm muitas imagens e/ou vídeos e outros elementos.

Para além da necessária melhoria da velocidade de carregamento, aumentará as hipóteses de conseguir um melhor posicionamento, ou pelo menos de o manter, e aumentará o tempo despendido pelos visitantes e o número de páginas visitadas por sessão, reduzindo a taxa de rejeição.

No entanto, há alguns aspectos a ter em conta. Mantenha o URL original para não criar novos URLs que possam diluir o SEO e para que o Google e outros navegadores continuem a indexar o conteúdo como um único artigo.

O mais importante é utilizar rel="next" e rel="prev" em para indicar ao Google que se trata de uma série.

Por exemplo, numa publicação dividida em três páginas, ao visitar a segunda página, terá de encontrar isto no código fonte dentro da etiqueta

<link rel="canonical" href="https://jrmora.com/post-ejemplo/2/" />
<link rel="prev" href="https://jrmora.com/post-ejemplo/" />
<link rel="next" href="https://jrmora.com/post-ejemplo/3/" />

Algumas considerações

Não basta simplesmente dividir os artigos ou obter mais visualizações de páginas. A paginação deve ter uma certa lógica baseada numa navegação natural. Para isso, tem de se colocar no lugar do visitante ou navegar no seu sítio como se fosse o sítio de outra pessoa.

Cada subpágina deve poder funcionar como uma página autónoma ou, pelo menos, ser precedida de informações sobre o que nela se encontra e de uma introdução lógica à nova subpágina. Deve ter conteúdo suficiente para não ser considerada pobre ou de pouco valor. O Google penaliza o"conteúdo pobre".

A paginação deve indicar claramente que o artigo está dividido em páginas. Também não é mau acrescentar, pelo menos na primeira página, um índice.

Embora não exista uma regra "oficial", evite a paginação excessiva. Geralmente, é aconselhável dividir as mensagens de 1500/1800 palavras ou mais em duas ou três páginas, no máximo.

Dividir a publicação com o bloco de quebra de página nativo do Gutenberg

Existem diferentes formas de o fazer com plugins, mas, como sabe, prefiro utilizar o menor número possível de plugins.

O bloco"Quebra de Página" do Gutenberg é a melhor opção.

Como dividir publicações longas do WordPress em páginas sem afetar o SEO 2

O bloco adiciona as etiquetas rel="next" e rel="prev" e "canonical" às páginas divididas, mas se quiser certificar-se de que são apresentadas, pode incluir esta função no ficheiro functions.php do seu modelo.

// Añadir etiquetas rel="next" y rel="prev" para paginación con Bloque Page Break <!--nextpage--> o Salto de Página
function gp_add_pagination_rel_tags() {
    if (is_singular() && !is_front_page()) {
        global $page, $numpages, $post;
        
        // Solo si hay paginación
        if ($numpages > 1) {
            // Etiqueta rel="prev" (página anterior)
            if ($page > 1) {
                echo '<link rel="prev" href="' . get_permalink($post) . ($page - 1) . '/" />' . "\n";
            }
            
            // Etiqueta rel="next" (página siguiente)
            if ($page < $numpages) {
                echo '<link rel="next" href="' . get_permalink($post) . ($page + 1) . '/" />' . "\n";
            }
        }
    }
}
add_action('wp_head', 'gp_add_pagination_rel_tags');

A conceção é importante

O aspeto e os elementos da paginação são muito importantes porque permitem ao visitante compreender imediatamente que o artigo continua nas páginas seguintes e saber em quantas páginas consiste.

2- O bloco "Quebra de página" apresenta um esquema muito básico. Tem o seguinte aspeto:

Como dividir publicações longas do WordPress em páginas sem afetar o SEO 3

E o que procuramos é algo mais descritivo e visualmente apelativo.

Como dividir publicações longas do WordPress em páginas sem afetar o SEO 4

A primeira imagem é a que será apresentada no fundo da primeira página e a segunda nas páginas seguintes.

Como dividir publicações longas do WordPress em páginas sem afetar o SEO 5

Este aspeto é conseguido com o CSS que está incluído no código total que pode adicionar ao seu functions.php. Pode dispor o layout como quiser e adaptá-lo à paleta de cores e ao design do seu blogue.

Código

Eis o código que estou a utilizar agora.

*Está adaptado às minhas necessidades, é possível separar o CSS e modificá-lo, adicionar ou remover idiomas e alterar o texto.

Embora o código se destine a encontrar as línguas utilizadas pela Polylang, continuará a funcionar se não utilizar a Polylang. No entanto, só detectará as línguas se o URL tiver esta estrutura: tusitio.com/pt/

// 1. Eliminar paginaciones automáticas
function remove_all_auto_pagination() {
    if (function_exists('generate_do_post_pagination')) {
        remove_action('generate_after_entry_content', 'generate_do_post_pagination');
    }
    add_filter('wp_link_pages', '__return_empty_string');
}
add_action('wp', 'remove_all_auto_pagination', 5);

// 2. Función auxiliar para números de página
function generate_pagination_numbers($total_pages, $current_page, $base_url) {
    $numbers_html = '';
    for ($i = 1; $i <= $total_pages; $i++) {
        $page_url = ($i == 1) ? $base_url : $base_url . user_trailingslashit($i);
        
        if ($i == $current_page) {
            $numbers_html .= '<span class="current-page">' . $i . '</span>';
        } else {
            $numbers_html .= '<a href="' . esc_url($page_url) . '" class="pagination-link">' . $i . '</a>';
        }
    }
    return $numbers_html;
}

// 3. Paginación multilingüe completa
add_filter('the_content', function($content) {
    global $numpages, $post;
    
    if (!is_singular() || $numpages <= 1) return $content;
    
    $wp_query = $GLOBALS['wp_query'];
    $current_page = $wp_query->get('page') ?: 1;
    $base_url = trailingslashit(get_permalink());
    
    // Sistema de detección de idioma
    $language = 'en';
    $available_langs = ['en','fr','de','es','pt','ru','it','sv','da','fi','nb','el','ar','tr','zh','id','ja','ko','uk','pl','cs','sk','lt','et','ro','hu','nl','bg'];
    
    if (function_exists('pll_current_language')) {
        $detected_lang = pll_current_language();
        $language = in_array($detected_lang, $available_langs) ? $detected_lang : 'en';
    } else {
        $current_uri = esc_url_raw($_SERVER['REQUEST_URI']);
        foreach ($available_langs as $lang) {
            if (strpos($current_uri, '/'.$lang.'/') !== false) {
                $language = $lang;
                break;
            }
        }
    }
    
    // Textos completos para 28 idiomas (solo cambios en finlandés y ruso)
    $localized_texts = [
        'en' => ['Continue reading this post →', 'Pages of this post →'],
        'fr' => ['Continuer à lire cet article →', 'Pages de ce billet →'],
        'de' => ['Diesen Beitrag weiter lesen →', 'Seiten dieses Beitrags →'],
        'es' => ['Seguir leyendo este post →', 'Páginas de este post →'],
        'pt' => ['Continuar a ler esta publicación →', 'Páginas deste post →'],
        'ru' => ['Продолжить чтение →', 'Страницы этого поста →'],
        'it' => ['Continua a leggere questo post →', 'Pagine di questo post →'],
        'sv' => ['Fortsätt läsa detta inlägg →', 'Sidor i detta inlägg →'],
        'da' => ['Læs videre på dette indlæg →', 'Sider i dette indlæg →'],
        'fi' => ['Jatka lukemista →', 'Artikkelin sivut →'],
        'nb' => ['Fortsett å lese denne artikkelen →', 'Artikkelens sider →'],
        'el' => ['Συνεχίστε την ανάγνωση →', 'Σελίδες άρθρου →'],
        'ar' => ['تابع القراءة ←', 'صفحات المقال ←'],
        'tr' => ['Okumaya devam edin →', 'Yazı sayfaları →'],
        'zh' => ['继续阅读 →', '文章分页 →'],
        'id' => ['Lanjutkan membaca →', 'Halaman artikel →'],
        'ja' => ['続きを読む →', 'ページ移動 →'],
        'ko' => ['더 보기 →', 'ページ →'],
        'uk' => ['Читати далі →', 'Сторінки статті →'],
        'pl' => ['Czytaj dalej →', 'Strony artykułu →'],
        'cs' => ['Pokračovat ve čtení →', 'Stránky článku →'],
        'sk' => ['Pokračovať v čítaní →', 'Stránky článku →'],
        'lt' => ['Skaityti toliau →', 'Straipsnio puslapiai →'],
        'et' => ['Jätka lugemist →', 'Artikli leheküljed →'],
        'ro' => ['Continuă lectura →', 'Paginile articolului →'],
        'hu' => ['Tovább olvasom →', 'Cikk oldalai →'],
        'nl' => ['Lees verder →', 'Artikelpagina\'s →'],
        'bg' => ['Прочети още →', 'Страници на статията →']
    ];
    
    $text_index = ($current_page == 1) ? 0 : 1;
    $pagination_text = $localized_texts[$language][$text_index] ?? $localized_texts['en'][$text_index];
    
    // Construcción de la paginación
    $pagination_html = '<div class="custom-pagination-container">';
    $pagination_html .= '<div class="pagination-content">';
    $pagination_html .= '<span class="pagination-text">' . esc_html($pagination_text) . '</span>';
    $pagination_html .= '<div class="pagination-numbers">';
    $pagination_html .= generate_pagination_numbers($numpages, $current_page, $base_url);
    $pagination_html .= '</div></div></div>';
    
    return ($current_page > 1) ? $pagination_html . $content . $pagination_html : $content . $pagination_html;
}, 15);

// 4. CSS optimizado (sin referencias a fuentes)
add_action('wp_head', function() {
    echo '<style>
    /* Estilos base */
    .custom-pagination-container {
        margin: 25px 0;
        padding: 15px 10px;
        background: #f9f9f9;
        border-top: 1px solid #eee;
        border-bottom: 1px solid #eee;
        box-sizing: border-box;
        width: 100%;
    }

    .pagination-content {
        display: flex;
        align-items: center;
        justify-content: center;
        max-width: 800px;
        margin: 0 auto;
    }

    .pagination-text {
        font-weight: 700;
        color: #333;
        margin-right: 10px;
        white-space: nowrap;
    }

    .pagination-numbers {
        display: inline-block;
    }

    .pagination-link,
    .current-page {
        display: inline-block;
        padding: 8px 12px;
        margin: 0 3px;
        border-radius: 4px;
        font-weight: 400;
        font-size: 15px;
        line-height: 1;
        box-sizing: border-box;
        transition: all 0.2s ease;
    }

    .current-page {
        background: #b40006;
        color: white;
        font-weight: 700;
    }

    .pagination-link {
        background: #f5f5f5;
        color: #333;
        text-decoration: none;
    }

    .pagination-link:hover {
        background-color: #e0e0e0;
        transform: translateY(-2px);
        box-shadow: 0 2px 4px rgba(0,0,0,0.1);
    }

    /* Estilos móvil */
    @media (max-width: 600px) {
        .pagination-content {
            flex-direction: row;
            flex-wrap: nowrap;
            overflow-x: auto;
            justify-content: flex-start;
            padding-bottom: 5px;
            -webkit-overflow-scrolling: touch;
        }
        
        .pagination-text {
            font-size: 14px;
            white-space: nowrap;
            flex-shrink: 0;
        }
        
        .pagination-numbers {
            display: flex;
            flex-wrap: nowrap;
            gap: 4px;
        }
        
        .pagination-link,
        .current-page {
            padding: 6px 10px;
            min-width: 32px;
            font-size: 14px;
            margin: 0;
            flex-shrink: 0;
        }
    }
    </style>';
});

Suscríbete para recibir los post en tu email sin publicidad

Artigos relacionados

Este blog se aloja en LucusHost

LucusHost, el mejor hosting