Защо не трябва да използвате query_posts() в WordPress

Ако разработвате теми и плъгини за WordPress, вероятно сте попадали на функциятаquery_posts()в множество примери и уроци в мрежата. В тази статия ще обясним защо никога не трябва да използвате тази функция.

Първични и вторични заявки

Основната заявка (или основен цикъл) в WordPress е тази, която се изпълнява в началото на зареждането на ядрото, изградена от заявения URL адрес, настройките на постоянната връзка и т.н. По време на основната заявка WordPress определя параметри като брой публикации на страница, шаблон, използван в темата и други. Основната заявка е направена от самия WordPress.

Вторична заявка е тази, която се изпълнява в допълнение към основната. Например:

Основната разлика междуquery_posts()и други помощни функции е, чеquery_posts()замества основния цикъл с нов вторичен цикъл на WordPress. Това означава, че в цикъла сquery_posts()можем да работим по същия начин, както в обичайния основен цикъл.

За сравнение, помислете за цикъл за показване на популярни публикации с помощта наWP_Query:

Същият цикъл сquery_posts():

Разбира се, вторият вариант изглежда малко по-чист и по-познат, тъй като тази конструкция се среща най-често при работа с основния цикъл на WordPress.

Ето защо разработчиците често смятат, чеquery_posts()променя основната заявка на WordPress, но това не е така. Функциятаquery_posts()заменя основния цикъл с нов вторичен цикъл и това се случваследкато основната заявка е изпълнена.

$wp_query и $wp_the_query

За да видите това, просто погледнете изпълнението на такива функции:

Функциятаquery_posts()създава нова вторична заявка с помощта наWP_Queryи поставярезултат в същата глобална променлива$wp_query:

По този начин функциите, които са проектирани да работят с основния цикъл на WordPress, започват да работят с нашата вторична заявка, а основната заявка остава в глобалната променлива$wp_the_query, препратката към която може да бъде възстановена с помощта на функциятаwp_reset_query().

След това функциитеhave_posts()и други отново работят с основния цикъл на WordPress, но разработчиците често забравят за това, в резултат на което спират да работят пагинацията, някои уиджети и т.н.

Най-честият резултат от използването наquery_posts()е неправилно страниране, когато например първите две страници работят, но третата и четвъртата връщат грешки 404. Нека да разгледаме как и защо се случва това.

По подразбиране WordPress показва десет публикации на страница. Да кажем, че имаме само двадесет записа, това са само две страници. Промяната на броя публикации на страница е лесна сquery_posts()в горната част на нашия шаблон index.php или archive.php:

По този начин ще имаме пет публикации на страница вместо десет, а плъгинът ни за пагиниране ще показва четири страници вместо две. Всичко се събира, но когато отидем на третата страница, получаваме грешка 404. Защо се случва това?

Като напомняне, основната заявка на WordPress се появява дори преди да бъдат обработени шаблонитеindex.phpилиarchive.php, където се извършва нашето „заместване“. В основната заявка броят на записите на страница е десет и има само две страници. В основната заявка няма трета и четвърта страница.

Това е основната заявка, която определя кой шаблон на тема ще бъде използван и когато поиска третата или четвъртата страница, WordPress ще използва шаблона404.php.

събитие pre_get_posts

Най-правилният начин за промяна на основния цикъл на WordPress е събитиетоpre_get_posts, което се случва преди всякаWP_Query. Можете да работите с това събитие в приставката или във файлаfunctions.phpна вашата тема:

Важно е да се отбележи, чеpre_get_postsсе извикваза всякаWP_Query> заявка, включително основната заявка, менюто за навигация, второстепенните заявки в уиджетите и др. С помощта на методаis_main_query()променяме само параметрите на основната заявка, а с проверкатаis_admin()променяме заявката само в предната част на сайта, а не в административния панел.

Резултатът от този подход е същият като приquery_posts(), но този път странирането ще работи и страницата ще се зареди по-бързо, защото сpre_get_postsние всъщност променихме основната заявка преди да я изпълним и не изпълнихме вторични заявки.

Алтернативи на query_posts()

Ако трябва да извършите вторична заявка в WordPress, използвайте функциятаget_posts()или новата конструкцияWP_Query(). Когато работите с тях, вашият код ще бъде по-ясен и разбираем за читателите.

Когато трябва да промените основната заявка на WordPress, преди да я изпълните, най-простият начин е да използвате събитиетоpre_get_postsили филтъра за заявки, който се изпълнява дори предиpre_get_postsи само за основната заявка.

Повече информация:Източник: WP Magazinequery_posts()функция в codex (WP-Kama) Въпрос във форума, свързан със свързани публикации и функцията query_posts()