10 09 10 Zmiana domyślnego zapytania do bazy danych w Wordpresie
Dziś będzie trochę na temat tego jak zmienić domyślne zapytania do bazy danych, które jest wykonywanie w Wordpresie za pośrednictwem instancji klasy WP_Query.
WP_Query jest klasą, która ma za zadanie przeprwadzić konwersację z bazą danych w Wordpresie. Klasa ta otrzymuje informacje o zapytaniu z przeglądarki i na ich podstawie wykonuje zapytanie do bazy danych.
W tym wpisie chciałby się zająć sytuacji gdy konieczne jest zmodyfikowanie standardoweg zapytania do bazy danych. Załóżmy, że wmagane jest wyłącznie z rezulatatów zapytania grupa wpisów o określonych ID. Jednym ze sposobów osiągnięcia porządanego rezultatu jest zmodyfikowanie wartości własności query_vars obiktu $wp_query. Dodam jeszcze, że query_vars to dość rozległa tablica PHP, a obiekty $wp_query jest instancja klasy $WP_Query.
Załóżmy, że nie chcemy aby na głównej stronie bloga ukazały się wpisy o ID 50 lub 60. Porządany rezultat możemy osiągnąć umieszczając poniższy kod w pliku functions.php lub pliku wtyczki.
function without_the_posts(){
if(is_home()){
global $wp_query;
$wp_query -> query_vars['post__not_in'] = array(50,60);
}
}
add_action('pre_get_posts','without_the_posts');
Na początek tworzymy funkcję, która ma na celu modyfikację zapytania, co można osiągnąć przez przyporządkowanie tablicy z numerami ID niechcianych wpisów do własności query_vars o kluczu post__not_in.
Funkcję dodajemy do akcji pre_get_posts, która jest uruchamiana tuż przed wykonaniem zapytania do bazy danych. W rezultacie otrzymujemy tablicę z obiektami za wyjątkiem tych wykluczonych.
Wartości tablic query_vars mogą być również ustawiane za pomocą metody set obiektu $wp_query, która pobiera nazwę klucza i wartość do przporządkowania jako argumenty.
Funkcja z przykładu powyżej może być przepisana w sposób jak następuję:
function without_the_posts(){
if(is_home()){
global $wp_query;
$wp_query -> set('post__not_in',array(50,60));
}
}
W podobny sposób można ustawić inne zmienne zapytania. Załóżmy, że chcemy otrzymać:
wpisy należące do kategorii o id 1 i 2.
$wp_query -> set('category__and',array(1,2));
wpisy nie należące do kategorii o id 1,2 i 3
$wp_query -> set('category__not_in',array(1,2,3));
wpisy w kategorii o id 12 lub 14
$wp_query -> set('category__in',array(12,14));
wpisy o id taga 12 lub 14
$wp_query -> set('tag__in',array(12,14));
wpisy, które nie posiadają taga o id 14 lub 18
$wp_query -> set('tag__not_in',array(14,18));
wpisy posiadające tag o id 14 i 18
$wp_query -> set('tag__and',array(14,18));
wpisy, które posiadają tag o slugu "wordpress" lub "kod"
$wp_query -> set('tag_slug__in',array('wordpress,kod'));
wpisy które posiadają tag o slugu "wordpress" i "kod"
$wp_query -> set('tag_slug__and',array('wordpress,kod'));
Powyższe przykłady w żadnym stopniu nie wyczerpują, możliwości jakie daje klasa WP_Query. Do manipulacji udostępnia ona znacznie więcej zmiennych własności query_vars.
Klasę WP_Query można znaleźć w pliku wp-includes/query.php. Szerszy opis własności i metod instnacji klasy WP_Query można znaleźć na tej stronie kodeksu Wordpresa.
Autor wpisu jest blogerem, programistą PHP, administratorem Linux oraz twórcą blogów
RSS Subskrybuj wpisy bloga