Вопрос или проблема
Я использую два пользовательских поля в WordPress для фильтрации базы данных людей (пользовательская таксономия = persons) по полу и возрасту. Я хотел бы, чтобы путь в домене выглядел так:
domain.com/persons/women/40years/
Мой текущий код в functions.php
работает, но только если я использую один параметр с именем “women40years”, что приводит к следующему пути в домене:
domain.com/persons/women40years/
function join_test( $join ) {
if ( preg_match( '#women40years#', $_SERVER['REQUEST_URI'] ) ) {
global $wpdb;
$join .= " LEFT JOIN $wpdb->postmeta as meta_1 ON ( $wpdb->posts.ID = meta_1.post_id ) LEFT JOIN $wpdb->postmeta as meta_2 ON ( $wpdb->posts.ID = meta_2.post_id )";
}
return $join;
}
add_filter( 'posts_join' , 'join_test' );
function where_test( $where, $query ) {
if ( preg_match( '#women40years#', $_SERVER['REQUEST_URI'] ) ) {
$where .= " AND meta_1.meta_key = 'gender' AND meta_1.meta_value='women' AND meta_2.meta_key = 'age' AND meta_2.meta_value = 40";
}
return $where;
}
add_filter( 'posts_where', 'where_test', 10, 2 );
add_rewrite_rule( 'persons/women40years/?$', 'index.php?thema=persons&g=women40years', 'top' );
Я полагаю, решение будет связано с параметрами GET
, красивым перезаписью URL или аналогичным, но я не знаю, как обрабатывать значения моих пользовательских полей для этого. Большое спасибо заранее за вашу помощь!
Ответ или решение
Для реализации фильтрации выводимых данных по двум пользовательским полям в WordPress с использованием posts_where
и add_rewrite_rule
, предлагаю следующее решение. Мы изменим вашу текущую реализацию так, чтобы она корректно обрабатывала два отдельных параметра: пол и возраст, что позволит вам иметь более читаемые URL адреса.
Шаг 1: Создание правил переписывания (rewrite rules)
Сначала мы создадим правило для переписывания, которое будет обрабатывать адреса вида domain.com/persons/women/40years/
.
add_action('init', 'custom_rewrite_rule');
function custom_rewrite_rule() {
add_rewrite_rule('^persons/([^/]+)/([^/]+)/?$', 'index.php?post_type=persons&gender=$matches[1]&age=$matches[2]', 'top');
}
Шаг 2: Регистрация пользовательских параметров
Нам необходимо зарегистрировать параметры gender
и age
, чтобы они могли быть использованы в запросах.
add_filter('query_vars', 'custom_query_vars');
function custom_query_vars($vars) {
$vars[] = 'gender';
$vars[] = 'age';
return $vars;
}
Шаг 3: Обработка JOIN и WHERE клауз по пользовательским полям
Далее, необходимо изменить функции join_test
и where_test
для обработки новых параметров, получаемых из URL.
function join_custom_fields($join) {
global $wpdb;
if (isset($_GET['gender']) && isset($_GET['age'])) {
$join .= " LEFT JOIN $wpdb->postmeta AS pm1 ON ($wpdb->posts.ID = pm1.post_id)";
$join .= " LEFT JOIN $wpdb->postmeta AS pm2 ON ($wpdb->posts.ID = pm2.post_id)";
}
return $join;
}
add_filter('posts_join', 'join_custom_fields');
function where_custom_fields($where) {
global $wpdb;
if (isset($_GET['gender']) && isset($_GET['age'])) {
$gender = sanitize_text_field($_GET['gender']);
$age = (int) sanitize_text_field($_GET['age']);
$where .= $wpdb->prepare(" AND pm1.meta_key = 'gender' AND pm1.meta_value = %s", $gender);
$where .= $wpdb->prepare(" AND pm2.meta_key = 'age' AND pm2.meta_value = %d", $age);
}
return $where;
}
add_filter('posts_where', 'where_custom_fields');
Шаг 4: Обновление структуры постоянных ссылок
Не забудьте обновить структуру постоянных ссылок после добавления новых правил переписывания. Это можно сделать в админ-панели WordPress, перейдя в Настройки -> Постоянные ссылки и просто нажав кнопку «Сохранить изменения».
Заключение
Теперь с помощью предложенного решения вы сможете фильтровать записи по двум пользовательским полям (пол и возраст) и формировать более человекочитаемые URL адреса. Страница по адресу domain.com/persons/women/40years/
будет обрабатывать ваши фильтры корректно.
Этот подход не только улучшает читаемость URL, но и предоставляет возможность использовать стандартные поисковые запросы WordPress. Если возникнут вопросы, обязательно обращайтесь за дополнительной помощью.