A regra de Reescrever WordPress não está funcionando

Estou tentando criar uma regra de reescrita para uma da minha página personalizada e aqui está a regra de reescrita

function add_my_rule() { global $wp; $wp->add_query_var('name_state'); $wp->add_query_var('arg_second'); add_rewrite_rule('state/([^/]+)/([^/]+)/page/([^/]+)','index.php?pagename=places-to-visit&name_state=$matches[1]&arg_second=$matches[2]&paged=$matches[3]','top'); add_rewrite_rule('state/([^/]+)/([^/]+)','index.php?pagename=places-to-visit&name_state=$matches[1]&arg_second=$matches[2]','top'); global $wp_rewrite; $wp_rewrite->flush_rules(); } add_action('init', 'add_my_rule'); 

Aqui está o que estou tentando fazer. Tenho o seguinte URL

 www.mydomain.com/state/state-name/places-to-visit 

Eu já criei uma página personalizada com o nome places-to-visit.php Minhas intenções são redirect todas essas URLs para essa página personalizada e desejamos as seguintes informações como variável de consulta do URL

Solutions Collecting From Web of "A regra de Reescrever WordPress não está funcionando"

Nas tags de sua resposta, há então eu acho que você está tentando adicionar regras de reescrita personalizadas de um plugin.

Na sua pergunta, você diz algo sobre o modelo da página que é (geralmente) uma questão relacionada ao tema. Claro que você pode criar regras de reescrita de um plugin e usá-las para um modelo de página definido em um tema, mas provavelmente não é uma boa idéia: suas funcionalidades de plug-in dependerão do tema.

Além disso, se você criar um modelo de página do que você deve criar uma página, atribua o modelo de página e use um slug definido ou suas regras de reescrita de plugins não funcionarão. Então, seu plugin também depende do conteúdo, e isso, novamente, não é uma boa idéia.

Então, como tornam as funcionalidades do seu plugin independentes dos modelos de páginas no tema e do conteúdo, mas mantêm padrões e funcionalidades de wordpress?

Um método é criar um arquivo na pasta do plugin e redirect a regra de rewrite para o URL deste arquivo em vez disso para index.php. Ao fazê-lo, se você precisar do ambiente wordpress, precisa de um manual para exigir o arquivo wp_load.php que reside na raiz da instalação do worpress. Mas esse caminho deve ser codificado e muitas vezes isso não é uma boa idéia e pode trazer problemas ao migrar o servidor. Além disso, esta é uma idéia muito ruim se você planeja distribuir seu plugin.

Existe outra solução?

Para um plugin que desenvolvi, usei uma espécie de “página virtual” onde redirect os pedidos.

Em primeiro lugar, no arquivo principal do plugin , definimos o slug virtual para a página. É uma boa ideia criar uma página de configuração para o plugin onde esta slug pode ser alterada, mas, por semplicidade, colocarei uma constante:

 define('MY_VIRTUAL_PAGENAME', 'a-strange-slug-for-places-to-visit-fake-page'); 

Depois disso, no mesmo arquivo, definimos as regras de reescrita personalizadas e registamos as consultas de consulta personalizadas:

 add_action('init', 'add_my_rules'); function add_my_rules() { add_rewrite_rule('state/([^/]+)/([^/]+)/page/([^/]+)', 'index.php?pagename=' . MY_VIRTUAL_PAGENAME . '&name_state=$matches[1]&arg_second=$matches[2]&paged=$matches[3]', 'top'); add_rewrite_rule('state/([^/]+)/([^/]+)', 'index.php?pagename=' . MY_VIRTUAL_PAGENAME . '&name_state=$matches[1]&arg_second=$matches[2]', 'top'); } add_filter( 'query_vars', 'add_my_vars' ); function add_my_vars( $vars ) { $vars[] = 'name_state'; $vars[] = 'arg_second'; return $vars; } 

Agora temos que liberar regras de reescrita. No seu código, você faz isso no init, então as regras são liberadas para cada pedido de página: esta não é absolutamente uma boa idéia. Usamos o gancho de registro para executar isso apenas uma vez:

 register_activation_hook( __FILE__, 'my_flush_rewrite_rules' ); function my_flush_rewrite_rules() { add_my_rules(); flush_rewrite_rules(); } 

No momento em que uma url particular é necessária, informamos a wordpress para carregar uma página que tenha uma lesma que salvamos na constante MY_VIRTUAL_PAGENAME , mas esta página não existe.

Então, agora, enganamos o WordPress e mostramos a nossa página virtual.

 add_action( 'pre_get_posts', 'show_places_to_visit', 1 ); function show_places_to_visit( $wp_query ) { $pagename = isset($wp_query->query['pagename']) ? $wp_query->query['pagename'] : NULL; if ( ! is_admin() && is_main_query() && $pagename == MY_VIRTUAL_PAGENAME ) { // get our custom vars $name_state = $wp_query->get('name_state'); $arg_second = $wp_query->get('arg_second'); $paged = $wp_query->get('paged') ? : 1; // now I require the file that contain our business logic require( plugin_dir_path(__FILE__) . 'places-to-visit.php' ); exit(); // stop default wordpress behavior } } 

Com o código acima, executamos uma function antes que a consulta principal wp seja triggersda. Nesta function, verificamos se o pagename solicitado (se existir) é aquele que salvamos na constante e, se assim for, exigimos um arquivo chamado places-to-visit.php que esteja localizado na mesma pasta do arquivo principal do plugin.

Agora, temos que criar arquivos de places-to-visit.php e temos todo o ambiente wordpress e podemos usar como quisermos.

Se você planeja executar um WP_Query neste arquivo, provavelmente este é um dos casos raros em que é melhor fazer uso de query_posts vez de usar uma instância WP_Query : dessa forma você irá replace a consulta principal original que não é útil porque ela é apenas uma consulta falsa .

O seguinte é apenas um exemplo para o arquivo places-to-visit.php, aposto que você pode fazer algo mais útil nisso:

 /** * in places-to-visit.php file I can simply use the variables defined in * show_places_to_visit() function in main plugin file */ $args = array( 'post_type' => 'places', 'posts_per_page' => $arg_second, 'category_name' => $name_state, 'paged' => $paged ); query_posts($args); /** * If in your theme is present a file called places-to-visit.php or a file called * archive-places it will be used to handle the query. * If not you have to output the page content from plugin. */ if ( locate_template( array('places-to-visit.php','archive-places.php'), true ) == '' ) { /** * Code that generate page content goes here. * If you want, you can use template functions like * get_header(); get_footer(); get_template_part(); and so on. */ } 

Eu sou capaz de resolver este problema. Honestamente falando até agora, não consegui entender completamente como as regras de reescrita do WordPress funcionam e como o WordPress pode escolher minha página personalizada.

Eu estava fazendo tudo certo exceto uma coisa, eu não estava associando meu modelo personalizado com qualquer slug. Momento em que eu atribui isso do painel do WordPress, consegui resolver meu problema

Obrigado a todos por suas valiosas contribuições.