Cómo establecer la estructura de enlaces permanentes a través de functions.php

16 oct 2011, 00:19:43
Vistas: 21.5K
Votos: 9

Estoy configurando una Red de WordPress y quiero que todos los sitios nuevos tengan la misma estructura de enlaces permanentes (es decir, "/%year%/%monthnum%/%postname%/"). Me pregunto si es posible hacer esto a través de hooks o modificaciones en functions.php, sin tener que depender de que los usuarios elijan esa estructura.

0
Todas las respuestas a la pregunta 3
8
16

Puedes establecer la estructura de enlaces permanentes llamando al método set_permalink_structure() del objeto global $wp_rewrite.

add_action( 'init', function() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
} );

Aquí tienes una versión del código para PHP < 5.3 en caso de que obtengas errores.

function reset_permalinks() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );
16 oct 2011 18:43:04
Comentarios

Copiar y pegar tu código genera un error, ¡pero la lógica funciona! Solo me pregunto si mi pregunta/intención es una buena práctica...

Tomas Buteler Tomas Buteler
17 oct 2011 00:26:21

Supongo que estás ejecutando PHP < 5.3, donde las clausuras (funciones anónimas) no estaban disponibles, así que he editado mi respuesta para incluir el método tradicional. Probé ambos códigos en el archivo functions.php de mi tema, así que avísame si esto funciona. Otra cosa que noté es que escribí %year& en lugar de %year%, así que también corregí eso.

soulseekah soulseekah
17 oct 2011 05:01:18

Tomas, gracias por aceptar la respuesta. Me alegra haber sido de ayuda. En cuanto a las buenas prácticas - creo que si tu objetivo es imponer y bloquear dicha estructura de enlaces permanentes en los sitios web - entonces es justificable; y por 'bloquear' quiero decir que el código no permitirá ningún cambio a la estructura mediante el Admin, si eso está bien entonces creo que está totalmente bien hacer esto.

soulseekah soulseekah
17 oct 2011 07:41:43

¡Estoy ejecutando la versión 5.2.17, así que eso lo explica! La segunda versión funciona perfectamente :) ¡Gracias!

Tomas Buteler Tomas Buteler
18 oct 2011 02:21:30

Funciona pero causa un conflicto cuando el administrador guarda desde la página de enlaces permanentes (404 en las entradas). Luego, cuando el sitio carga (hook init del proceso) la estructura de enlaces permanentes cambia nuevamente (404 en las entradas otra vez). Usar $wp_rewrite->flush_rules(); resuelve el problema. Mala práctica usarlo en init y ejecutarlo cada vez. Simplemente visitar la página de enlaces permanentes hará el truco.

Sisir Sisir
28 abr 2012 14:16:04

La intención original era deshabilitar la página de opciones de enlaces permanentes, así que quizás pueda salirme con la mía.

Tomas Buteler Tomas Buteler
28 abr 2012 18:08:52

Debería llamarse en 'after_switch_theme' o en la activación del plugin y debe ir seguido de 'flush_rewrite_rules()'

csstd csstd
27 oct 2013 06:27:34

Hay muchos lugares donde puedes enganchar esto para obtener los resultados que deseas

Xhynk Xhynk
4 jun 2014 00:56:40
Mostrar los 3 comentarios restantes
0

La respuesta anterior no funcionó. He obtenido una solución pura. Puedes usar este código. Funcionará al 100%. Gracias

/**
 * Configuración de reescritura, cuando el tema se activa
 */
if (isset($_GET['activated']) && is_admin()) {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure('/%postname%/');
    $wp_rewrite->flush_rules();
}

/**
* Redirección a la página de configuración de Permalinks.
* De lo contrario, la regla de redirección no funcionará correctamente.
*/
function redirect_to_permalink() {
    wp_redirect('options-permalink.php');
}
add_action( 'after_switch_theme', 'redirect_to_permalink' );
31 ago 2017 09:01:49
0
function setPermaLink(){
    $ps = '/%category%/%postname%/';
    $permalink_structure = sanitize_option( 'permalink_structure', $ps);
    $blog_prefix = '/blog';
    $prefix = '/index.php';

    if ( ! empty( $permalink_structure ) ) {
        $permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );
        if ( $prefix && $blog_prefix ) {
            $permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
        } else {
            $permalink_structure = $blog_prefix . $permalink_structure;
        }
    }

    $wp_rewrite->set_permalink_structure( $permalink_structure );
    flush_rewrite_rules();
}

setPermaLink();
12 sept 2019 16:47:01