Creación de URLs personalizados para plugins de wordpress.
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 espaciosen 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-Windowsetc…
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®ion=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]®ion=$matches[2]&id=$matches[3]'; # que esta: # (2) $newrules['([^\/]*)/region/(.+)$'] = 'index.php?pagename=$matches[1]®ion=$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:
3 comentarios
RSS feed para comentarios en este post
TrackBack URL





k-rlitos:
Me sirvió demasiado tu post, se agradece.
Surfeando con
Unknown sobre
Unknown
NomikOS:
Que bueno saber que se entiende algo.
Me hubiera gustado saber como lo has usado!
d[º_º]
Surfeando con
Unknown sobre
Unknown
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 [...]
The Incutio XML-RPC PHP Library -- WordPress/2.9.2