WordPress: висновок записів довільних типів (Custom Post Types)

На сьогоднішній день движок WordPress досить інтенсивно розвивається. У всякому разі зміни у версіях з 2.8 по 3.1 додають WP можливості повноцінних CMS. Більшість з цих можливостей повинні бути активовані на рівні теми (або плагіна), тому відразу після установки WP ви працюєте з ним як зі звичайним блогових движком.

Начебто все правильно. Якщо якісь можливості вам не потрібні, ви їх не використовуєте. Але при цьому виникає серйозна проблема з документацією. Справа в тому, більшість прикладів і в Кодексі, і в інших джерелах, орієнтовані на найпростіший випадок - дефолтну інсталяцію WP. Як тільки ви активуєте додаткові можливості до багатьох рекомендацій потрібно відноситься дуже акуратно.

Про один з таких прикладів я хочу розповісти в цій статті.

Припустимо, ви вирішили використовувати довільні типи записів (custom post types). Створити їх досить просто і на цю тему є маса статей, тому детально зупинятися на цьому моменті не будемо.

У більшості випадків достатньо додати наступний код в файл functions. php вашої теми.

register_post_type ( 'gadgets', array ( 'labels' => array ( 'name' => __ ( 'Gadgets'), 'singular_name' => __ ( 'Gadget'), // інші переклади), 'public' => true, 'publicly_queryable' => true, 'query_var' => true, 'taxonomies' => array ( 'category', 'post_tag'), 'supports' => array ( 'title', 'editor', 'author' , 'thumbnail', 'excerpt', 'comments'), 'rewrite' => array ( 'slug' => 'gadgets'), // інші настройки));

Після цього ви зможете створювати записи даного типу в адмінці і WordPress автоматично сформує сторінку зі стрічкою з цих записів. Адреса у цієї сторінки буде наступним.

http: //blog.url/gadgets

Тепер зверніть увагу, що для цього типу записів ми використовуємо такі ж категорії, як і для типу Post (рядок 11).

Очевидно, що на сторінці категорії ми захочемо побачити записи всіх типів, але WordPress покаже тільки тип Post.

Відбувається це тому що WP при формуванні запиту до бази даних явно вказує тип поста. І по-замовчуванню цей тип - post.

На жаль, в подібних випадках не всі автори тим хочуть вникати в нюанси роботи движка і просто використовують функцію query_posts . Я розумію, що приклади її використання наведені в статті The Loop , Але там передбачається, що вам потрібно створити додатковий цикл на сторінці. Тобто, наприклад, вивести основний список записів і ще який-небудь додатковий список, з фільтрацією по певним умовам.

В даному випадку потрібно змінити основний запит, тому що ми можемо за один раз отримати всі необхідні дані. І немає ніякого сенсу виконувати додатковий запит до бази.

Вирішується завдання досить просто.

function prefix_pre_get_posts ($ query) {if ($ query-> is_category) {$ query-> set ( 'post_type', 'any'); } Return $ query; } Add_action ( 'pre_get_posts', 'prefix_pre_get_posts');

Тут ми призначаємо власний обробник події (action) pre_get_posts. Як випливає з назви, ця подія виникає безпосередньо перед відправкою запиту до БД. У першому параметрі оброблювач одержує об'єкт типу WP_Query , Який формує запит до бази.

Перш за все, ми перевіряємо, що в даний момент створюється сторінка категорії (рядок 2). А потім змінюємо атрибут post_type. За замовчуванням він дорівнює post. Не забувайте, що обробник обов'язково повинен повернути змінений (або незмінений) об'єкт WP_Query.

Взагалі, якщо ви плануєте працювати з новими можливостями WP (довільними типами записів, таксономії, форматами записів), то навчитися працювати з WP_Query потрібно обов'язково. Вбудованими функціями движка тут ви не обійдетеся.

В цілому, цього і слід було очікувати, чим більше можливостей у движка, тим більше часу доведеться витратити на його вивчення 😉

Успіхів!

цікаво почитати

Якщо самостійно вчитися важко, то курси програмування Київ допоможуть придбати необхідні знання.