Cómo forzar programáticamente permalinks personalizados con mi tema en WordPress

13 dic 2011, 05:01:37
Vistas: 17.9K
Votos: 6

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.

2
Comentarios

"mi tema necesita URLs bonitas para funcionar correctamente" ¿por qué?

chrisguitarguy chrisguitarguy
20 dic 2011 22:40:42

@ChristopherDavis porque es un tema de aplicación, no un tema regular. Tengo un framework MVC cargado dentro de una carpeta de tema que opera fuertemente con reescrituras.

Volomike Volomike
10 ene 2012 03:49:23
Todas las respuestas a la pregunta 3
4

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

22 oct 2015 05:03:29
Comentarios

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

Pieter Goosen Pieter Goosen
22 oct 2015 06:00:15

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

Don Rhummy Don Rhummy
22 oct 2015 06:01:52

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

Pieter Goosen Pieter Goosen
22 oct 2015 06:03:16

@PieterGoosen hecho. (Aunque ya lo tenía en mi respuesta excepto por la parte de "is_admin()")

Don Rhummy Don Rhummy
22 oct 2015 06:04:08
4
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>
20 dic 2011 22:32:57
Comentarios

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.

Otto Otto
25 ago 2012 15:15:59

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

Don Rhummy Don Rhummy
21 oct 2015 22:23:35

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

Volomike Volomike
22 oct 2015 04:57:38

@Volomike agregué la respuesta

Don Rhummy Don Rhummy
22 oct 2015 05:04:06
0

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.

10 jul 2020 22:29:33