Como parar o wordpress para fazer a consulta padrão?

4

Meu objetivo é redirecionar para um modelo personalizado com base em uma nova regra de regravação, mas sem ter o wordpress para fazer consultas incomuns.

meu código:

function add_rewrite_rules() {

    add_rewrite_rule(
        '^settore/([^/]*)/?$',
        'index.php?settore=$matches[1]',
        'top'
    );

  add_rewrite_tag('%settore%','(caldareria|tessile)');
}
add_action( 'init', 'add_rewrite_rules' );

function set_root_category_template($template){
    $settore = get_query_var('settore');
    if($settore != '') $template = locate_template('root-taxonomy.php');
    return $template;
}
add_filter('template_include','set_root_category_template',99);

Ele redireciona apenas para a direita, mas se eu verificar as postagens de $ wp_query- > em root-taxonomy.php, vejo uma lista de postagens comuns. Em vez disso, nessa página, farei uma consulta personalizada solicitando alguns dados de termos de taxonomia específicos e, portanto, a consulta padrão será totalmente inútil. Como posso pará-lo? Afinal, eu não estou passando nenhuma consulta padrão var para index.php, então não consigo entender o motivo pelo qual o wp ainda está fazendo uma consulta ..

    
por Stratboy 13.06.2014 / 11:35

2 respostas

4

Pare o WordPress para executar a consulta principal é difícil: você tem que cavar dentro do coração do WordPress.

Fluxo de trabalho frontend do WordPress:

  1. wp-blog-header.php chame a função wp()
  2. A função wp() cria uma instância de classe wp , e chame o método main()
  3. main() código do método:

    public function main($query_args = '') {
      $this->init();
      $this->parse_request($query_args); // build query vars starting from url
      $this->send_headers();
      $this->query_posts();  // run main query via WP_Query using built query vars
      $this->handle_404(); // if query has no results set 404 headers and WP_Query props
      $this->register_globals();
    }
    
  4. wp-blog-header.php incluem template-loader.php carregar arquivo de modelo baseado em consulta

Portanto, apenas a maneira de parar a consulta principal é impedir que wp() seja executado.

Isso pode ser feito enganchando um gancho inicial, fazer o que você precisa e, finalmente, exit() .

O problema dessa abordagem é que, evitando que wp() seja executado, você também impede que a classe wp analise a solicitação, portanto, o material de reescrita que você adicionar não será analisado.

Assim, em vez de adicionar uma tag de regravação e uma regra de regravação, convém consultar diretamente a url para escolher se é aquela que deve acionar sua ação personalizada.

Antes de tudo, vamos escrever uma função que retorne apenas a parte relativa da URL, por exemplo, se o URL atual for algo como example.com/wp/path/to/somewhere?foo=bar e o URL da sua casa for example.com/wp/ , a função retornará path/to/somewhere :

function get_relative_url() {
  $home_path = rtrim( parse_url( home_url(), PHP_URL_PATH ), '/' );
  $path = trim( substr( add_query_arg( array() ), strlen( $home_path ) ), '/' );
  $qs = array_keys( $_GET );
  if ( ! empty( $qs ) ) {
    $path = remove_query_arg( $qs, $path );
  }
  return $path;
}

Agora podemos usar um gancho inicial para ver o URL e, somente se ele contiver o caminho desejado, definiremos a variável $settore , carregaremos o modelo e sairemos:

add_action( 'wp_loaded', function() { // 'wp_loaded' hook happen before wp() is ran

  $path = get_relative_url();
  $url_parts = explode( '/', $path );
  if (
    isset( $url_parts[1] )
    && $url_parts[0] === 'settore'
    && in_array( $url_parts[1], array( 'caldareria', 'tessile' ), TRUE )
  ) {
    // ok the current url is something like example.com/settore/tessile
    // and 'tessile' is in the variable $url_parts[1]
    $template = locate_template( 'root-taxonomy.php' );
    if ( empty( $template ) ) return; // do nothing if template not found
    global $settore;
    $settore = $url_parts[1]; // in the template you can access to $settore variable.
    require_once $template;
    exit(); // prevent WordPress to do anything else
  }

} );

Isso é tudo.

No código acima, entender se a URL atual é a correta , e definir a variável $settore foi fácil porque a estrutura da URL foi fácil, para estruturas de URL mais complexas, você provavelmente precisará de uma regex matching, e talvez use uma ferramenta como componente de roteamento do symfony para fazer a correspondência entre o URL e algumas variáveis.

Essa abordagem é a que eu usei no Cortex , dê uma olhada lá se você planeja fazer algo assim normalmente.

Pegadinhas

Como você pode ver, a consulta principal ( global $wp_query ) no código que postei não é usada. No seu modelo, será um objeto WP_Query vazio, então, qualquer coisa se referirá à consulta principal, por exemplo, tags de modelo como is_tax() , is_archive() ou outras, não funcionarão.

Isso também se aplica ao cabeçalho e ao rodapé, porque muito provavelmente em seu 'root-taxonomy.php' você usará get_header() e get_footer() .

Além disso, alguns plugins podem não funcionar corretamente, por exemplo, Se você estiver usando qualquer plugin de SEO que defina a tag de título com base na consulta, ela terá problemas.

Uma possível solução é definir manualmente as principais propriedades de consulta acessando global $wp_query ou usar um cabeçalho personalizado, por exemplo, get_header('root-tax') , para o seu modelo personalizado e identificador da tag de título personalizada header-root-tax.php e / ou qualquer outro problema.

    
por gmazzap 13.06.2014 / 13:11
0

por que não gostar disso?

add_action( 'pre_get_posts', 'my_post_queries' );
function my_post_queries( $query ) {
    if ($query->is_main_query() && !is_admin()) {
        // maybe check for specific page here
        // if (is_tax('your-taxonomy') { 
        $query = false;
        remove_all_actions ( '__after_loop');
        // }
    }
}

Ou eu entendi mal a questão?

    
por Web-Entwickler 19.04.2016 / 22:10