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:
wp-blog-header.php
wywołać funkcjęwp()
wp()
funkcja tworzy instancję klasy wp i wywołujemain()
na to metoda-
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(); }
-
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ą.
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.
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.