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

10

Estoy configurando una red de Wordpress y quería que todos los sitios nuevos tuvieran la misma estructura de enlace permanente (es decir, "/% year% /% monthnum% /% postname% /"). Me pregunto si esto es posible hacerlo mediante enganches o hacks en functions.php, sin tener que depender de los usuarios para elegir esa estructura.

Tomás Buteler
fuente

Respuestas:

15

Puede establecer la estructura de enlace permanente llamando al set_permalink_structure()método del $wp_rewriteobjeto global .

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

Aquí hay una versión PHP <5.3 del código en caso de que obtenga errores.

function reset_permalinks() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );
soulseekah
fuente
Copiar y pegar su código genera un error, ¡pero la razón es suficiente! Aunque solo me pregunto si mis preguntas / intenciones son buenas prácticas ...
Tomas Buteler
1
Tomás, gracias por aceptar la respuesta. Me alegro de haber sido de ayuda. En cuanto a las buenas prácticas, creo que si su objetivo es hacer cumplir y bloquear dicha estructura de enlaces permanentes en los sitios web, entonces eso es justificable; y por 'bloquear' me refiero a que el código no permitirá ningún cambio en la estructura a través del Administrador, si eso está bien, creo que está totalmente bien hacerlo.
soulseekah
1
Funciona pero causa un conflicto cuando el administrador guarda desde la página de enlace permanente (404 en publicaciones). Luego, cuando el sitio carga (proceso de enlace de inicio) la estructura de enlace permanente cambia nuevamente (404 en las publicaciones nuevamente). El uso $wp_rewrite->flush_rules();resuelve el problema. Mala práctica usarlo en init y ejecutarlo cada vez. Solo visitar la página de enlaces permanentes hará los trucos.
Sisir
1
La intención era deshabilitar la página de opciones de enlaces permanentes, ¿así que tal vez pueda salirse con la suya?
Tomas Buteler
3
Debe llamarse en 'after_switch_theme' o en la activación del complemento y debe seguirse por 'flush_rewrite_rules ()'
csstd
2

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

/**
 * Rewrite set up, when theme activate i mean
 */
if (isset($_GET['activated']) && is_admin()) {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure('/%postname%/');
    $wp_rewrite->flush_rules();
}

/**
* Redirect to Permalink setting Page.
* Otherwise Redirect rule will not work Properly.
*/
function redirect_to_permalink() {

    wp_redirect('options-permalink.php');
}
add_action( 'after_switch_theme', 'redirect_to_permalink' );
Islam sagrado
fuente
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();
Ricardo Boavida
fuente