Возможно ли автоматически добавлять GET параметры ссылкам WP?
К примеру, есть ссылки вида:
site.ru/category-name-1/item
Надо сделать следующее: если отсутствует GET параметр, к примеру, ?foo=bar, то добавить его до получения данных и уже выполнить запрос с учетом данного параметра.
Если присутствует, то его не изменяем
Пробовал с pre_get_posts, но не получилось.
А, ну и надо чтобы это срабатывало в определенных категориях
Дополнительно:
Это выглядит как задание, а не как вопрос. Что Вы уже пробовали для получения результата?
add_action('pre_get_posts', 'catalog_filters'); function catalog_filters($query) { if ($query->is_main_query() && $query->is_category('category-name-1')) { $foo = $_GET['goo'] ?? 'bar'; $meta_query = array( array( 'key' => 'foo', 'value' => $foo, ) ); $query->set('meta_query', $meta_query); } } |
add_action('pre_get_posts', 'catalog_filters'); function catalog_filters($query) { if ($query->is_main_query() && $query->is_category('category-name-1')) { $foo = $_GET['goo'] ?? 'bar'; $meta_query = array( array( 'key' => 'foo', 'value' => $foo, ) ); $query->set('meta_query', $meta_query); } }
но это не работает, если нет параметров в строке.
Т.е., я попробовал в функцию добавить
echo '<pre>' . print_r($query, 1) . '</pre>';
первой строкой до if
и если перейти по site.ru/category-name-1/item то ничего не выводится
если к ссылке добавить любой параметр, например, site.ru/category-name-1/item?some=param
то выводится query
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
pre_get_postsне добавляет GET-параметр в URL. Он только меняет уже созданный запрос WordPress. Если вам нужно, чтобы URL без параметра автоматически стал URL с?foo=bar, делайте редирект до выполнения основного запроса, например наtemplate_redirect.add_action('template_redirect', function () { if (is_admin() || ! is_category('category-name-1')) { return; } if (isset($_GET['foo'])) { return; } wp_safe_redirect(add_query_arg('foo', 'bar')); exit; });
А фильтрацию записей по этому параметру уже делайте через
pre_get_posts:add_action('pre_get_posts', function ($query) { if (is_admin() || ! $query->is_main_query() || ! $query->is_category('category-name-1')) { return; } $foo = isset($_GET['foo']) ? sanitize_text_field(wp_unslash($_GET['foo'])) : 'bar'; $query->set('meta_query', [ [ 'key' => 'foo', 'value' => $foo, ], ]); });
В вашем примере ещё есть путаница: в тексте параметр
foo, а в коде берется$_GET['goo']. Такжеis_category()сработает на архиве категории, но не на одиночной записи/category-name-1/item. Для single-записей нужна другая проверка, например категория текущей записи или таксономия.pre_get_postsменяет параметры запроса WordPress, но не добавляет GET-параметр в URL браузера. Если задача именно «добавить?foo=barв адрес, если его нет», нужен редирект до вывода страницы. Делать это лучше наtemplate_redirect, ограничив условие нужными категориями.add_action('template_redirect', function () { if (is_admin() || wp_doing_ajax()) { return; } if (! is_category('category-name-1')) { return; } if (isset($_GET['foo'])) { return; } $url = add_query_arg('foo', 'bar', get_category_link(get_queried_object_id())); wp_safe_redirect($url, 302); exit; });
Если нужно сохранить текущий путь и остальные параметры, используйте текущий URL:
$url = add_query_arg('foo', 'bar'); wp_safe_redirect($url, 302); exit;
Если параметр нужен только для фильтрации внутри запроса, редирект не нужен. Тогда в
pre_get_postsпросто подставляйте значение по умолчанию:add_action('pre_get_posts', function ($query) { if (is_admin() || ! $query->is_main_query() || ! $query->is_category('category-name-1')) { return; } $foo = isset($_GET['foo']) ? sanitize_text_field(wp_unslash($_GET['foo'])) : 'bar'; // Используйте $foo для meta_query/tax_query. });
Для SEO аккуратнее второй вариант: он не плодит лишние URL с параметрами. Редирект нужен только если пользователь реально должен видеть параметр в адресной строке.