Розробка сайтів на WordPress часто вимагає індивідуалізованого підходу до відображення контенту для користувачів. Однією з таких задач є створення умов, при яких користувачі можуть бачити лише ті пости, до яких вони мають відношення, особливо коли йдеться про сайти з великою кількістю користувачів, такі як інтернет-магазини на WooCommerce. Для цього часто застосовуються додаткові поля (custom fields), створені за допомогою плагіна Advanced Custom Fields (ACF), які дозволяють додавати специфічну інформацію до постів. У цій статті ми розглянемо, як налаштувати фільтрацію постів за ID користувача використовуючи ACF поля для користувацького типу посту “mypost”.
Перш ніж приступити до реалізації фільтрації, необхідно створити власний тип посту “mypost” та додаткове поле “usersacf” за допомогою ACF, яке буде використовуватись для зв’язку постів з конкретними користувачами. Припустимо, що ці завдання вже виконано і тепер потрібно налаштувати відображення постів відповідно до ID користувача.
Стандартні засоби WordPress та ACF не надають готового рішення для фільтрації постів на фронтенді на основі значень додаткових полів, прив’язаних до користувача. Така задача вимагає кастомної реалізації.
pre_get_posts
Одним із способів реалізації необхідної логіки є використання хука pre_get_posts
, який дозволяє модифікувати запит до бази даних перед тим, як пости будуть отримані. Це дозволяє додати додаткові умови до запиту, включаючи фільтрацію по мета полях.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function filter_myposts_by_current_user($query) { if (!is_admin() && $query->is_main_query() && is_post_type_archive('mypost')) { $current_user_id = get_current_user_id(); $query->set('meta_query', array( array( 'key' => 'usersacf', 'value' => '"' . $current_user_id . '"', 'compare' => 'LIKE' ) )); } } add_action('pre_get_posts', 'filter_myposts_by_current_user'); |
Цей код перевіряє, чи є поточний запит основним і чи він стосується архіву постів типу “mypost”. Якщо так, то до умов запиту додається фільтр за мета полем “usersacf”, де шукається ID поточного користувача.
Іншим варіантом є створення нового запиту WP_Query безпосередньо в місці, де потрібно вивести пости, з відповідними параметрами для фільтрації.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$user_posts = new WP_Query(array( 'post_type' => 'mypost', 'meta_query' => array( array( 'key' => 'usersacf', 'value' => get_current_user_id(), 'compare' => '=' ) ) )); if ($user_posts->have_posts()) : while ($user_posts->have_posts()) : $user_posts->the_post(); // Вивід постів endwhile; wp_reset_postdata(); endif; |
Цей код створює новий запит, який вибирає пости типу “mypost”, що відповідають ID поточного користувача, вказаному в полі “usersacf”.
Фільтрація постів за допомогою ACF та ID користувача в WordPress може бути реалізована кількома способами, залежно від конкретних потреб вашого сайту. Використання хука pre_get_posts
дозволяє змінити логіку вибірки постів на глобальному рівні, тоді як створення нового запиту WP_Query надає більше гнучкості для локального контексту. Обидва методи ефективні і можуть бути адаптовані під різні задачі.