Cambiar el "slug" de página en la paginación
Pregunta simple. Cuando la paginación está activada, la URL cambia a "site.com/page/2"
. Para mi sitio, debería ser "site.com/paggetto/2"
.
¿Cómo puedo cambiar esa regla de reescritura? También quiero cambiar "author"
y otras variables.
Puedes usar el siguiente código en tu archivo functions.php:
// Cambiar el slug de paginación de 'page' a 'paggetto'
add_filter('init', function() {
global $wp_rewrite;
$wp_rewrite->pagination_base = 'paggetto';
});
// Cambiar el slug de autor de 'author' a tu preferencia
add_filter('author_rewrite_rules', function($author_rewrite) {
$new_author_rewrite = array();
foreach ($author_rewrite as $pattern => $substitution) {
$pattern = str_replace('author', 'escritor', $pattern); // Cambia 'escritor' por el slug deseado
$new_author_rewrite[$pattern] = $substitution;
}
return $new_author_rewrite;
});
Después de añadir este código, asegúrate de ir a Ajustes > Enlaces permanentes y hacer clic en "Guardar cambios" para que se actualicen las reglas de reescritura.

Resuelto:
function re_rewrite_rules() {
global $wp_rewrite;
// $wp_rewrite->author_base = $author_slug;
// print_r($wp_rewrite);
$wp_rewrite->author_base = 'autor';
$wp_rewrite->search_base = 'buscar';
$wp_rewrite->comments_base = 'comentarios';
$wp_rewrite->pagination_base = 'pagina';
$wp_rewrite->flush_rules();
}
add_action('init', 're_rewrite_rules');
Al menos, eso hará el trabajo.

Solo un pequeño aviso, debido a lo extremadamente costoso que es $wp_rewrite->flush_rules();
en términos de rendimiento, nunca deberías usarlo en init
, una opción mucho mejor es simplemente visitar la página de opciones de Enlaces permanentes, y guardar los cambios un par de veces, eso los actualizará por ti.

Para algunos sitios en alemán utilizo el siguiente plugin para traducir page
a seite
(la palabra en alemán para page
):
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: T5 Página a Seite
* Description: Reemplaza <code>/page/</code> por <code>/seite/</code>.
* Author: Fuxia Scholz
* License: MIT
* License URI: http://www.opensource.org/licenses/mit-license.php
*/
if ( ! function_exists( 't5_page_to_seite' ) )
{
register_activation_hook( __FILE__ , 't5_flush_rewrite_on_init' );
register_deactivation_hook( __FILE__ , 't5_flush_rewrite_on_init' );
add_action( 'init', 't5_page_to_seite' );
function t5_page_to_seite()
{
$GLOBALS['wp_rewrite']->pagination_base = 'seite';
}
function t5_flush_rewrite_on_init()
{
add_action( 'init', 'flush_rewrite_rules', 11 );
}
}
Ten en cuenta que las reglas de reescritura se vacían solo al activar/desactivar únicamente. Necesitarás una regla de reescritura separada en tu archivo .htaccess
para redirigir las URLs antiguas a las nuevas:
RedirectMatch Permanent ^/(.*)/page/(.*) /$1/seite/$2

¿Cuál es la diferencia entre $GLOBALS['wp_rewrite']->pagination_base = 'seite' y $wp_rewrite->search_base = 'buscar'; ?

Existen diferencias sutiles y poco intuitivas entre global $var;
y $GLOBALS['var']
. No importa en este caso, solo ten en cuenta que la última forma es más confiable y más fácil de leer/entender.

Esta función trabajará directamente con tu paquete de traducción, formateando tu nueva base y evitará que se ejecute más de una vez la función flush_rewrite_rules, previniendo un mal rendimiento en tu blog.
function my_change_rewrite_base() {
global $wp_rewrite;
$bases = array(
'author_base' => __('Autor'),
'search_base' => __('Buscar'),
'comments_base' => __('Comentarios'),
'pagination_base' => __('Página')
);
foreach ($bases AS $key => $base) {
$wp_rewrite->{$key} = remove_accents(mb_strtolower($base));
}
if ( ! get_option('my_change_rewrite_base_flushed', false) ) {
flush_rewrite_rules();
update_option( 'my_change_rewrite_base_flushed', time());
}
}
add_action('init', 'my_change_rewrite_base');

Lo siguiente funcionó para mí:
function nw_strana() {
$GLOBALS['wp_rewrite']->pagination_base = 'strana';
}
add_action( 'init', 'nw_strana' );
function nw_rewrite( $rules ) {
$new_rules = array(
'obchod/strana/([0-9]{1,})/?$' => 'index.php?post_type=product&paged=$matches[1]',
);
$rules = array_merge( $new_rules, $rules );
return $rules;
}
add_filter( 'rewrite_rules_array', 'nw_rewrite' );

¿Alguna idea para eliminar "page" del slug en la paginación? Por defecto es midominio/page/2. Quiero que sea midominio/1 ¡Gracias de antemano!

No recomendaría hacer eso @Jornes, podría causar mucha confusión con las entradas/páginas que tampoco usan un prefijo (slug).
