Фильтрация вывода по двум пользовательским полям с использованием posts_where и add_rewrite_rule

Вопрос или проблема

Я использую два пользовательских поля в 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. Если возникнут вопросы, обязательно обращайтесь за дополнительной помощью.

Оцените материал
Добавить комментарий

Капча загружается...