Precisa de ajuda com add_rewrite_rule

52

SOLUÇÃO

Eu fui com a Atualização 3 e consegui trabalhar. O que eu tinha entendido mal, era que eu acreditava que uma regra de reescrita mudaria designers/?designer=some-designer&bid=9 para /designers/some-designer . Mas é claro que é o contrário.

Estou pesquisando, mas não entendo como usar add_rewrite_rule () .

Este post é muito parecido com o que Eu preciso, mas eu realmente preciso de tanto código?

Meu link atual é o seguinte: enlace
O que eu quero é isso, enlace

  1. Como uso o add_rewrite_rule() ?
  2. Preciso transmitir a ID do designer (lance). Como posso fazer isso ao usar regras de re.write sem mostrar na URL?

Atualização 1

Eu encontrei este que é um pouco mais explicativo. Mas não está funcionando:

function add_rewrite_rules( $wp_rewrite ) 
{
    $new_rules = array(
        '('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='.
        $wp_rewrite->preg_index(1).'&bid='.
        $wp_rewrite->preg_index(2)
    );
       // Always add your rules to the top, to make sure your rules have priority
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules');

function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}
add_filter('query_vars', 'query_vars')

Atualização 2

Aqui está outra solução que eu tentei, que Jan Fabry sugere em outro segmento. Eu coloquei isso no meu functions.php, mas não tem efeito.

add_action('generate_rewrite_rules', 'add_rewrite_rules');
add_filter('query_vars', 'query_vars');

/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function add_rewrite_rules( $wp_rewrite ) 
{
    add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top');
    flush_rewrite_rules(false);
}


function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}

Atualização 3
Eu encontrei alguns exemplos aqui também. Mas isso não está funcionando: (

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]';
    return $newrules + $rules;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'designer');
    return $vars;
}

Atualização 4 Eu também tentei esta solução, mas ainda sem sucesso.

add_filter('search_rewrite_rules', 'designers_createRewriteRules');

function designers_createRewriteRules($rewrite) {
global $wp_rewrite;

// add rewrite tokens
$designer_token = '%designers%';
$wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers=');

$bid_token = '%bid%';
$wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid=');

$keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token";
$keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);

return ( $rewrite + $keywords_rewrite );

}

Atualização 5
Parece que minhas regras de reescrita não são adicionadas. Executando as seguintes regras novas: print_r($wp_rewrite) , não inclui minhas novas regras de reescrita.

Atualização 6
Eu testei a solução de Jan. Mas o URL não muda: (

/* Initiation script for NF template
------------------------------------------------------------------------------*/   
add_action('after_setup_theme','norwegianfashion_setup');

if ( ! function_exists( 'norwegianfashion_setup' ) ):

  function norwegianfashion_setup() { 
    /* Here I do a lot of stuff */

    // SEO friendly URL for desigenrs
    add_action( 'init', 'wpa5413_init' );
    add_filter( 'query_vars', 'wpa5413_query_vars' );
  }

endif;


/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        'designers/([^/]+)/?',
        'index.php?pagename=designers&designer=$matches[1]',
        'top' );
}

function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer';
    return $query_vars;
}

Eu realmente aprecio se alguém puder me ajudar a resolver esse problema.

    
por Steven 13.04.2017 / 14:37
fonte

1 resposta

85

Algumas informações sobre regras de reescrita

O sistema WP Rewrite parece complicado, mas na verdade não é tão difícil de entender como funciona. Ele é usado para analisar URLs bonitos ( /designers/ ) como se fossem não-bonitos ( /index.php?pagename=designers ). A idéia básica é que você tem uma lista de regras de reescrita , expressões regulares que podem corresponder às URLs recebidas e reescrevê-las em outras URLs, principalmente na forma de index.php com algumas variáveis de consulta. Essas variáveis são definidas para partes da expressão regular que correspondem ao URL. As regras são avaliadas de cima para baixo, portanto, se duas regras puderem corresponder, a primeira "ganha".

Essas regras de reconfiguração são armazenadas no banco de dados chamando flush_rewrite_rules() , mas como gerar e gravar essas regras é uma operação cara, você não deve fazer isso em cada init . Em vez disso, você só faz isso quando altera as regras: provavelmente na ativação do plug-in (usando register_activation_hook() ) ou manualmente visitando a página de configurações Permalinks (because é difícil fazer isso automaticamente na ativação do tema ). Se você não liberar as regras, chamar add_rewrite_rule() não terá efeito. Não há problema em chamar add_rewrite_rule() em cada init , mesmo depois de você liberar as regras.

Há muitas maneiras de adicionar suas regras de reconfiguração e, se você quiser adicionar apenas uma regra, poderá fazer isso com add_rewrite_rule() . Como as regras para postagens, páginas, taxonomias, ... resultam em várias regras, elas são criadas com funções de alto nível como add_rewrite_tag() , add_permastruct() , ... Mas elas não são necessárias para o caso simples que temos aqui.

Existem também alguns filtros, para que você também possa adicionar suas regras usando os ganchos generate_rewrite_rules ou generate_rewrite_rules_array . Eles dão a você um controle muito detalhado sobre as regras completas, mas novamente, add_rewrite_rule() é suficiente se você quiser apenas adicionar uma regra.

Eu criei um pequeno plugin que permite analisar as regras atuais de reescrita , e (é claro) eu recomendo que você o use quando tentar mudar alguma coisa.

Obtendo suas informações adicionais a partir do URL

Vamos basear-se no exemplo que você deu. Você tem a marca de designer Batlak og Selvig , com o ID numérico ( bid ) 9 . Você não quer esse ID no URL, mas apenas o nome. Chamamos a versão amigável do URL do nome (sem espaços ou caracteres especiais) o slug : Batlak-og-Selvig .

Em geral, o URL deve conter todas as informações para identificar o conteúdo que você deseja exibir na página. Você pode usar cookies ou solicitações de POST para armazenar o ID do designer real que deseja exibir, mas isso falhará se alguém compartilhar o link, enviando-o por correio, Facebook, Twitter ou apenas lendo em voz alta pelo telefone. Se você não quiser usar o ID numérico em seu URL, certifique-se de que o slug seja único: primeiro faça uma pesquisa do ID com base no slug e continue como antes.

Então, o que aprendemos agora é que queremos adicionar uma regra de reescrita para o padrão " /designers/ seguido por qualquer coisa até o próximo / " , e salve isso "qualquer coisa" na variável de consulta designer_slug . No seu caso, acredito que você também queira usar a página com o slug designers como o conteúdo geral da página, então também informaremos ao WordPress.

add_action( 'init', 'wpa5413_init' );
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'designers/([^/]+)/?',
        // The resulting internal URL: 'index.php' because we still use WordPress
        // 'pagename' because we use this WordPress page
        // 'designer_slug' because we assign the first captured regex part to this variable
        'index.php?pagename=designers&designer_slug=$matches[1]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );
}

A única coisa que resta a fazer é dizer ao WordPress para também manter o designer_slug nas variáveis de consulta, para que você possa acessá-lo mais tarde. O WordPress usa uma lista de permissões de variáveis de consulta permitidas, para impedir que as pessoas modifiquem todos os parâmetros da consulta de postagens por meio do URL. Tudo o que não está nesta lista é ignorado. Basta conectar-se ao gancho query_vars e adicionar sua variável extra:

add_filter( 'query_vars', 'wpa5413_query_vars' );
function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer_slug';
    return $query_vars;
}

Como você pode ver, esta resposta é basicamente a mesma que minha resposta anterior , mas sem a regra liberar o código (para que você possa usá-lo no functions.php do seu tema em vez de um plugin), e com um pouco mais de certeza e explicação porque aprendi muito sobre regras de reescrita desde (e por causa de) respondendo sua primeira pergunta.

Discussão na sala de bate-papo

Resolvemos os problemas finais para essa questão na sala de bate-papo . No final, Steven usou o gancho generate_rewrite_rules , porque a função add_rewrite_rule() não parecia funcionar para ele.

    
por Jan Fabry 16.12.2010 / 11:07
fonte