Возможно ли автоматически добавлять GET параметры ссылкам WP?

Ссылка скопирована
1 ответ

К примеру, есть ссылки вида:
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

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Редакция Security Ответ

    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;
    });

    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-&gt;is_main_query() || ! $query-&gt;is_category('category-name-1')) {
            return;
        }
     
        $foo = isset($_GET['foo']) ? sanitize_text_field(wp_unslash($_GET['foo'])) : 'bar';
     
        $query-&gt;set('meta_query', [
            [
                'key'   =&gt; 'foo',
                'value' =&gt; $foo,
            ],
        ]);
    });

    add_action('pre_get_posts', function ($query) { if (is_admin() || ! $query-&gt;is_main_query() || ! $query-&gt;is_category('category-name-1')) { return; } $foo = isset($_GET['foo']) ? sanitize_text_field(wp_unslash($_GET['foo'])) : 'bar'; $query-&gt;set('meta_query', [ [ 'key' =&gt; 'foo', 'value' =&gt; $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;
    });

    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;

    $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-&gt;is_main_query() || ! $query-&gt;is_category('category-name-1')) {
            return;
        }
     
        $foo = isset($_GET['foo']) ? sanitize_text_field(wp_unslash($_GET['foo'])) : 'bar';
        // Используйте $foo для meta_query/tax_query.
    });

    add_action('pre_get_posts', function ($query) { if (is_admin() || ! $query-&gt;is_main_query() || ! $query-&gt;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 с параметрами. Редирект нужен только если пользователь реально должен видеть параметр в адресной строке.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно