Cómo establecer la estructura de enlaces permanentes a través de functions.php
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.

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

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...

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.

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.

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

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.

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

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

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

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