Jul
14
2009

Creación de URLs personalizados para plugins de wordpress.
Escrito por NomikOS el 14/Jul/2009 | 3 comentarios | 231 visitas

Kingkong
Creative Commons License photo credit: nxtiak

Si al escribir un plugin para wordpress debes tratar con hyperlinks porque mejor no hacerlos “pretty”, es decir sin los signos ? & =. WP nos facilita la tarea de hacerle entender que datos le hacemos pasar a través de la URL.


En suma podemos escribir urls casi con total libertad, siempre y cuando sepamos informar a WP que es lo que le queremos decir.

Por ejemplo, una url como:

1
http://nomikos.info/myplugin/compre_unas_palomitas_para_ver_la_pelicula_y_las_tengo_grandes_como_kingkong

podemos muy bien hacer que sea interpretada como:

1
2
$palomitas = 'grandes';
$pelicula = 'kingkong';

si le decimos que:

1
'compre_unas_palomitas_para_ver_la_pelicula_y_las_tengo_grandes_como_kingkong'

es igual a:

1
'compre_unas_VAR1_para_ver_la_VAR2_y_las_tengo_VALOR1_como_VALOR2'

es igual a:

1
'compre_unas_(\w)_para_ver_la_(\w)_y_las_tengo_(\w)_como_(\w)'

es igual a:

1
'$matches[1]=$matches[3]&$matches[2]=$matches[4]'

es igual a:

1
'index.php?$matches[1]=$matches[3]&$matches[2]=$matches[4]'

De esta manera siempre podemos obtener resultados coherentes usando la misma estructura:

1
2
3
4
http://nomikos.info/myplugin/compre_unas_gafas_para_ver_la_orquesta_y_las_tengo_redondas_como_platillos

$gafas  = 'redondas';
$orquesta = 'platillos';

\w es una expresión regular que agarra toda palabra formada por caracteres alfanuméricos (el signo _ también puede estar)

\w = [A-Za-z0-9_]
\d para dígitos 0 al 9
\s para espacios

en mayúsculas representan sus conjuntos complementarios.

\W cualquier carácter no alfanumérico ni _
\D cualquier carácter no digito
\S cualquier carácter menos el espacio

. cualquier carácter menos el salto de línea
\n salto de línea
\r retorno de carro (como en las máquinas de escribir)
\r\n salto de línea en MS-Windows

etc…

En realidad para hacer estos hackings tú debes manejar un mínimo de expresiones regulares. Cuando escriba un post relativo te lo pondré aqui mismo –ya me entiendes…

Definición de nuevas reglas de reescritura de URL

Debido a que la variable superglobal $_GET de PHP se forma en base a la estructura var1=valor1&var2=valor2, deberemos hacer que WP reescriba la url de esa manera.

El anterior ejemplo de las palomitas es un poco extremo, en realidad casi siempre queremos urls que se asemejen a un estructura de directorio para hacerlas más fácilmente indexables por motores de búsqueda.

Es decir, queremos que urls como:

1
http://nomikos.info/myplugin/region/Asia/id_444

sean entendidas como:

1
http://nomikos.info/index.php?pagename=myplugin&region=Asia&id=444

Para logralo definimos nuevas reglas con expresiones regulares y las adjuntamos a las predefinidas por WP en el hook (enganche) “rewrite_rules_array”.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();

    # el orden es muy importante
   # esta regla debe definirse primero
   # (1)
   $newrules['([^\/]*)/region/(.+)/id_(\d*)$'] = 'index.php?pagename=$matches[1]&region=$matches[2]&id=$matches[3]';
    # que esta:
   # (2)
   $newrules['([^\/]*)/region/(.+)$'] = 'index.php?pagename=$matches[1]&region=$matches[2]';

    # ([^\/]*) agarra todo hasta encontrarse con un caracter /
   # (.+) agarra todo caracter
   # $ indica que lo agarrado con (.+) debe estar al final

    return $newrules + $rules;
}

Fíjate en los comentarios respecto al orden de definición de reglas. En un url como:

1
http://nomikos.info/myplugin/region/Asia/id_444

queremos:

1
2
$region = 'Asia';
$id = 444;

Si definimos (2) antes que (1) ocurriría esto:

1
$region = 'Asia/id_444';

Anexión de las nuevas variable a la lista de variables públicas de WP

El segundo paso es hacer que WP reconozca estas nuevas variables ($id, $region). Para esto usamos el hook “query_vars”.

En este enganche se pueden actualizar las variables públicas “query” usadas por WP antes de que se produzcan consultas a la base de datos.

1
2
3
4
5
6
add_filter('query_vars','wp_insertMyRewriteQueryVars');
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'id', 'region');
    return $vars;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# en WP 2.8 la variable $public_query_vars es:
class WP {
    /**
     * Public query variables.
     *
     * Long list of public query variables.
     *
     * @since 2.0.0
     * @access public
     * @var array
     */

    var $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage');

    ...
}

Anexión de las nuevas reglas de reescritura de URL

El tercer paso y final es hacer que WP reconozca estas nuevas reglas. Para esto usamos el método flush_rules() del objeto $wp_rewrite. En este caso lo hacemos en el hook “init”.

1
2
3
4
5
6
add_action('init', 'wp_flushRewriteRules');
function wp_flushRewriteRules()
{
   global $wp_rewrite;
   $wp_rewrite->flush_rules();
}

En un siguiente post hablaremos de como enviar “pretty” urls desde un formulario con method “get”. Lo haremos con javascript.


Posts relacionados:

  1. Uso de URLs personalizados para plugins de wordpress.
  2. Algunas ideas para acceder a wp-admin cuando tienes acceso ftp al directorio de plugins.
  3. WordPress escapa automáticamente las comillas simples!.

Escrito por NomikOS en PHP,Wordpress/Buddypres, July 14 - 2009 @ 16:48 hrs. Tags: , | 231 visitas

3 comentarios

  • k-rlitos:

    Me sirvió demasiado tu post, se agradece.

    Surfeando con Unknown Unknown sobre Unknown Unknown

    Comment | August 3, 2009 @ 02:56
  • NomikOS:

    Que bueno saber que se entiende algo.
    Me hubiera gustado saber como lo has usado!
    d[º_º]

    Surfeando con Unknown Unknown sobre Unknown Unknown

    Comment | August 3, 2009 @ 03:19
  • Uso de URLs personalizados para plugins de wordpress. | Linux && PHP @ NomikOS – BLOG:

    [...] creación de URLs personalizados para plugins de wordpress. faltó una parte muy importante. Como acceder a estas nuevas variables. Yo me hice un buen lío [...]

    WordPress 2.9.2 WordPress 2.9.2
    The Incutio XML-RPC PHP Library -- WordPress/2.9.2

    Pingback | June 9, 2010 @ 18:50

RSS feed para comentarios en este post

TrackBack URL

Deja un comentario

XHTML: Etiquetas permitidas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

motor: WordPress. tema: TheBuckmaker modificado por NomikOS.