WordPress

przepisywanie adresu URL – Jak zatrzymać WordPress, aby utworzyć domyślne zapytanie?

  • 13 czerwca, 2014
  • 4 min read
przepisywanie adresu URL – Jak zatrzymać WordPress, aby utworzyć domyślne zapytanie?


Zatrzymanie WordPressa w celu uruchomienia głównego zapytania jest trudne: musisz zagłębić się w głąb WordPressa.

Przepływ pracy w interfejsie WordPress:

  1. wp-blog-header.php wywołać funkcję wp()
  2. wp() funkcja tworzy instancję klasy wp i wywołuje main() na to metoda
  3. main() kod metody:

    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 włączać template-loader.php które ładują plik szablonu na podstawie zapytania

Zatem jedynym sposobem na zatrzymanie głównego zapytania jest zapobieganie wp() biegać.

Można to zrobić, zaczepiając wcześniej hak, robiąc, co trzeba, i na koniec exit().

Problemem tego podejścia jest zapobieganie wp() aby uruchomić, uniemożliwiasz także klasie wp analizowanie żądania, więc dodane elementy do przepisywania nie są analizowane.

Zamiast więc dodawać znacznik przepisywania i regułę przepisywania, możesz spojrzeć bezpośrednio na plik adres URL aby wybrać, czy to on powinien wywołać Twoją akcję niestandardową.

Warto przeczytać!  wp query - Filtruj według treści tytułu i klucza meta w tym samym czasie

Przede wszystkim napiszmy funkcję, która zwróci tylko względną część adresu URL, np. jeśli bieżący adres URL jest podobny do example.com/wp/path/to/somewhere?foo=bar a Twój domowy adres URL to example.com/wp/ funkcja zwraca 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;
}

Teraz możemy użyć wczesnego haka, aby sprawdzić adres URL i ustawić go tylko wtedy, gdy zawiera on żądaną ścieżkę $settore zmienną, załaduj szablon i wyjdź:

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
  }

} );

To wszystko.

Warto przeczytać!  Jak przekierować uwagę użytkownika za pomocą przekierowania komentarza

W powyższym kodzie zrozumienie, czy bieżący adres URL to prawyi ustaw $settore zmienna była łatwa, ponieważ struktura adresu URL była prosta, w przypadku bardziej złożonych struktur adresu URL prawdopodobnie potrzebujesz dopasowania wyrażenia regularnego i być może użyj narzędzia takiego jak komponent routingu Symfony, aby dopasować adres URL do niektórych zmiennych.

To podejście jest tym, którego użyłem w Cortexie, zajrzyj tam, jeśli planujesz często robić takie rzeczy.

Gotchas

jak widać, główne zapytanie (global $wp_query) w opublikowanym przeze mnie kodzie nie jest używany, w twoim szablonie będzie pusty WP_Query obiekt, więc wszystko będzie odnosić się do głównego zapytania, np. tagi szablonów, takie jak is_tax(), is_archive() lub coś takiego, nie będzie działać.

Będzie to dotyczyć także nagłówka i stopki, ponieważ najprawdopodobniej w pliku „root-taxonomy.php” będziesz go używać get_header() I get_footer().

Również niektóre wtyczki mogą nie działać poprawnie, np. jeśli używasz dowolnej wtyczki SEO, która ustawia tag tytułu na podstawie zapytania, wówczas będą występować problemy.

Możliwym rozwiązaniem jest ręczne ustawienie głównych właściwości zapytania, do których można uzyskać dostęp global $wp_query lub użyj niestandardowego nagłówka, np get_header('root-tax')dla niestandardowego szablonu i uchwytu header-root-tax.php niestandardowy tag tytułowy i/lub jakikolwiek inny problem.

Warto przeczytać!  Zablokuj zawartość renderowaną za pomocą wbudowanego CSS. Jak ponownie użyć go w konfiguracji bezgłowej?


Źródło