WordPress acha que minha rota personalizada é um erro 404

4

Eu criei um plug-in que configura uma rota personalizada e, em seguida, carrega um arquivo de modelo para esse URL. Tudo funciona bem, exceto que o WordPress parece achar que é um 404, mesmo que esteja processando corretamente meu modelo.

Por exemplo, ele diz 404 no título do documento e uma classe error404 é adicionada a <body>

O URL personalizado é domain.com/path/:id, em que :id é um valor dinâmico que corresponde a um ID de postagem. Por isso, o URL pode ser domain.com/path/275. No exemplo abaixo, some_id é usado como a variável post id.

Aqui está uma versão reduzida do meu plugin:

<?php

class MyPlugin {
  public function __construct() {
    add_action( 'init', array($this, 'add_response_endpoint') );
    add_filter( 'template_include', array($this, 'add_response_template') );
  }

  public function add_response_endpoint() {
    add_rewrite_rule(
      '^path/([0-9]+)/?',
      'index.php?pagename=my_custom_url&some_id=$matches[1]',
      'top'
    );

    add_rewrite_tag('%some_id%', '([^&]+)');
  }

  public function add_response_template($template) {
    if ( get_query_var( 'pagename' ) === 'my_custom_url' ) {
      $template = trailingslashit( dirname( __FILE__ ) ) . 'templates/custom-page-template.php';
    }

    return $template;
  }
}

new MyPlugin();

Estou sentindo falta de algo aqui? Ou devo começar a procurar esse bug em outro lugar?

    
por Ahrengot 01.06.2016 / 14:03

1 resposta

1

A configuração manual de is_404 = false; corrigiu meu problema. No entanto, não tenho certeza se esta é a melhor maneira de fazer isso. Eu tentei usar o filtro pre_get_posts sem sorte.

De qualquer forma, para qualquer outra pessoa no mesmo barco, você pode fazer isso para se livrar do estado 404:

public function add_response_template($template) {
  global $wp_query;
  if ( 'my_custom_url' === get_query_var( 'pagename' ) ) {
    $wp_query->is_404 = false;
    $template = trailingslashit( dirname( __FILE__ ) ) . 'templates/custom-page-template.php';
  }

  return $template;
}

E para atualizar o título do documento (O material dentro de <title> na seção <head> ), aqui está um trecho para fazer isso funcionar também.

add_filter( 'document_title_parts', function($title_arr) {
  if ( 'my_custom_url' === get_query_var('pagename') ) {
    $title_arr['title'] = "Document title for my custom route";
  }

  return $title_arr;
}, 10, 1 );

Se alguém souber de uma maneira melhor, por favor me avise.

    
por Ahrengot 01.03.2017 / 16:54