Cómo forzar programáticamente permalinks personalizados con mi tema en WordPress
Estoy creando un tema personalizado. Es un tema altamente especializado para convertir WordPress en una aplicación más que en un sistema CMS o blog. Por ejemplo, un Sistema de Agenda para Consultorios Dentales (con capacidades CMS y widgets), como ejemplo.
Como mi tema necesita URLs bonitas para funcionar correctamente, algo que realmente necesito es que el archivo .htaccess sea el predeterminado que se crea solo cuando alguien configura Permalinks como Personalizado (y luego escribe algo como %postname%). ¿Cómo puedo activar eso en WordPress, programáticamente, para que lo cree? Quiero decir, probablemente podría sobrescribir el archivo manualmente durante la activación del tema, pero lo mejor sería usar la API de WordPress para esto.

Para habilitar completamente los enlaces permanentes, también necesitas asegurarte de que el archivo .htaccess se cree. Para hacer eso, debes establecer una opción y actualizar las reglas con un booleano.
global $wp_rewrite;
// Escribir la regla
$wp_rewrite->set_permalink_structure('/%postname%/');
// Establecer la opción
update_option( "rewrite_rules", FALSE );
// Actualizar las reglas y decirle que escriba el htaccess
$wp_rewrite->flush_rules( true );
Si usas esto en un plugin, debe estar en el hook init
, no en el hook load
. Si está en el hook load
, mostrará un error diciendo que $wp_rewrite
es nulo.
Importante: También deberías tener una condición para que esto solo se configure una vez. (Puedes crear una opción y verificar si está establecida; si no, ejecutas este código de enlaces permanentes y estableces esa opción)
También suelo verificar si es el lado del administrador y solo lo ejecuto si es así.

No deberías hacer flush de las reglas de reescritura en init
, nunca. Es costoso y ralentiza considerablemente los tiempos de carga de tu página. Las reglas de reescritura se guardan en la base de datos, por lo que hacer flush de las reglas de reescritura en init
significa que habrá muchas llamadas a la base de datos para volver a guardar las reglas de reescritura en cada carga de página

@PieterGoosen Lee el resto de mi respuesta. Lo que hago es verificar si ya se ha establecido y solo lo configuro una vez (cuando instalo el plugin por primera vez) y nunca se ejecuta nuevamente. También verifico si es is_admin()
pero eso no es necesario si solo se ejecuta una vez.

Añade esa información en tu respuesta. Es información importante que tu respuesta necesita para hacerla más aceptable ;-)

function change_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
$wp_rewrite->flush_rules();
}
add_action('init', 'change_permalinks');
Puede que no necesites el hook de acción si colocas este código en la función de activación de tu tema.
También descubrí que esto solo funciona parcialmente. Aún debes hacer clic en la página de configuración de Permalinks para que se cree el archivo .htaccess. Entonces, ¿qué hacer? Encontré que puedo usar un IFRAME que cargue esa página automáticamente desde el panel de opciones de mi tema, y así se creará el archivo .htaccess por mí.
<iframe style="position:absolute;top:-5000px" src="<?= site_url() ?>/wp-admin/options-permalink.php"></iframe>

Llamar a flush_rules en la acción init es una pésima idea. Podría ser aceptable en una llamada de función de activación o instalación, pero no en init.

Sé que esto es antiguo, pero puedes hacer que reescriba el archivo ".htaccess" cambiando tus reglas de flush a esto: update_option( "rewrite_rules", FALSE ); $wp_rewrite->flush_rules( true );
Esto escribirá el archivo ".htaccess".

@DonRhummy por favor publícalo como respuesta y lo marcaré como la nueva respuesta.

Así es como lo uso, para que solo ocurra cuando mi tema está activado, y solo si no existe una configuración previa guardada (para no romper algo hecho antes de que se use mi tema).
/*
* Establecer permalinks al activar el tema
*/
function set_custom_permalinks() {
$current_setting = get_option('permalink_structure');
// Abortar si ya está guardado con otra configuración
if($current_setting) {
return;
}
// Guardar permalinks con configuración personalizada, forzar creación de archivo de reglas
global $wp_rewrite;
update_option("rewrite_rules", FALSE);
$wp_rewrite->set_permalink_structure('/noticias/%postname%/');
$wp_rewrite->flush_rules(true);
}
add_action('after_switch_theme', 'set_custom_permalinks');
La ventaja de esto es que solo se ejecutará una vez cuando se active el tema, no cada vez que WordPress se cargue con una visita al sitio.
