O WordPress tem uma API muito útil chamada “a API de reescrita ”. Acho que já tem de “reescrita de URL”, este é o processo que torna as URLs mais legíveis. Por exemplo, um URL escrito como este http://mysite.com/?page=12&category=12&author=47 não é tão bonito. É difícil lembrar disso, e os mecanismos de busca não gostam muito disso. É por isso que quase todo CMS tem uma função interna que “reescreve” urls para que fiquem assim: http://mysite.com/category/business/finance .
A API de reescrita e a classe WP_Rewrite
Dentro do WordPress, esse processo também é conhecido como estrutura de permalinks . Ao alternar da estrutura de permalink padrão para uma estrutura personalizada, você ativa automaticamente a API de reescrita. Isso é totalmente automático. Mas às vezes você precisa criar suas próprias regras de reescrita personalizadas.
Neste post, vamos criar funções simples para criar uma regra de reescrita personalizada simples. Digamos que queremos obter um valor de referência, equivalente a $_GET[‘referrer’].
Se dermos uma olhada no Codex, podemos ver na página da API de reescrita que esta API tem 6 funções embutidas. O uso mais comum da reescrita é usar essas funções, existem muitos tutoriais sobre isso, por isso vou usar filtros ao invés de funções. Porque sim, a API de reescrita também pode ser usada com filtros! Esses filtros estão listados na página do Codex da classe WP_Rewrite .
Adicionando uma nova Var de Consulta
Para começar, precisamos criar uma função que dirá ao WordPress que uma nova regra de reescrita foi definida. Este é o trabalho das funções add_rewrite_rule() e add_rewrite_tag() , mas você também pode fazê-lo usando os filtros query_vars e rewrite_rules_array . Para isso, precisamos criar duas funções e dois filtros. A primeira função vai simplesmente adicionar uma nova variável ao filtro query_vars, e a segunda vai registrar essa nova variável nas regras globais de reescrita:
/*
|————————————————————————–
| Start Rewrite. Sample: http://mysite.com/referrer/remi
|————————————————————————–
*/
// Register a new var
function rc_add_query_vars( $vars) {
$vars[] = “referrer”; // name of the var as seen in the URL
return $vars;
}
// Hook our function into query_vars
add_filter(‘query_vars’, ‘rc_add_query_vars’);
// Add the new rewrite rule to existings ones
function rc_add_rewrite_rules($rules) {
$new_rules = array(‘referrer/([^/]+)/?$’ => ‘index.php?referrer=$matches[1]’);
$rules = $new_rules + $rules;
return $rules;
}
// Hook the function into rewrite_rules_array
add_filter(‘rewrite_rules_array’, ‘rc_add_rewrite_rules’);
Depois de adicionar esse código a qualquer arquivo de plugin ou ao arquivo functions.php do tema, vá para configurações > Permalinks e salve a estrutura de permalinks. Essa ação é necessária. Agora você deve conseguir acessar seu site com este tipo ou url: http://mysite.com/referrer/your-name . Se você deseja ser redirecionado em uma página específica, altere index.php?referrer=$matches[1] por index.php?pagename=my-page&referrer=$matches[1] onde “my-page” é a página a ser redirecionado para slug.
Recuperando o valor da variável
Agora que sua regra de reescrita está definida, talvez você queira acessar o valor da variável. Mas se você fizer um simples $_GET[‘referrer’], você não receberá nenhum valor. Para recuperar os valores de URL vars, você precisa conectar uma função ao filtro “template_redirect”. Conectar-se ao filtro “init” é muito cedo. Então você pode acessar as variáveis
// Retrieve URL var
function rc_get_my_vars() {
global $wp_query;
if(isset($wp_query->query_vars[‘referrer’])) {
$referrer = get_query_var(‘referrer’);
}
}
// Hook the function into template_redirect
add_action( ‘template_redirect’, ‘rc_get_my_vars’);
Você pode ecoar o valor $referrer ou usá-lo como faria com uma variável GET normal.
É claro que você pode modificar o uso de mais de uma variável:
// in rc_add_query_vars()
$vars[] = “referrer”;
$vars[] = “campaign”;
// in rc_add_rewrite_rules()
$new_rules = array(‘referrer/([^/]+)/([^/]+)/?$’ => ‘index.php?pagename=my-page&referrer=$matches[1]&campaign=$matches[2]’);
Não esqueça que você precisa do módulo mod_rewrite do PHP habilitado para usar a reescrita de url.