Specifi c фильтр для всплывающего URL в редакторе сообщений - PullRequest
2 голосов
/ 05 мая 2020

Я использую WP 5.3 со стандартным редактором (Gutenberg) вместе с плагином Polylang 2.7.2, чтобы сделать сайт многоязычным. Используя Polylang, каждое сообщение состоит из одного сообщения перевода для каждого языка (Polylang группирует сообщения перевода вместе).

Теперь у меня есть следующая проблема: когда пользователь пишет сообщение и пытается установить ссылку на другое уже существующее сообщение, раскрывающийся список поиска для текста ссылки (Ctrl + K) показывает сообщения на всех доступных языках. Если заголовок сообщения не зависит от языка c (например, «Умный дом»), но сообщение «Умный дом» существует на двух языках, то выбор пользователем метода проб и ошибок тот, который соответствует языку текущего отредактировал сообщение:

только один из этих постов на английском sh

Я хотел, чтобы это всплывающее окно URL отображало либо только сообщения на том же языке, что и текущее сообщение, либо изменение результатов в раскрывающемся списке, чтобы отобразить указанный c язык (по флагу, или "[en]" перед заголовком).

Во-первых, я попытался использовать выпадающую панель меню администратора «Фильтровать контент по языку», чтобы ограничить его до англоязычных sh сообщений - не повлияло на падение вниз.

Затем я попытался использовать фильтр, чтобы изменить результаты запроса для этого раскрывающегося списка. Использование pre_get_posts и установка жестко заданного языка на английский sh сработало:

        add_filter('pre_get_posts', [self::class, 'filterQueryLanguage']);
    }

    public static function filterQueryLanguage($query) {
        $query->set('lang', 'en'); // this limits the drop down results to English posts
        return $query;
    }

В раскрывающемся списке поиска перечислены только сообщения на английском sh. К сожалению, это ограничивает все запросы, и в функции фильтра невозможно точно узнать, возник ли этот запрос из запроса AJAX в этом раскрывающемся меню .. Кроме того, мне не удалось обнаружить язык редактируемого в данный момент сообщения (в данном случае pll_current_language() вернул false).

Следовательно, мне нужен способ пост-фильтрации результатов только для этого выпадающего всплывающего окна и добавления языка к имени сообщения в каким-то образом. Но я понятия не имею, есть ли вообще фильтр для этого. get_posts, похоже, не срабатывает, и даже если это так, я не хочу влиять на все запросы.

Существуют ли какие-либо дополнительные фильтры c для этой цели?

1 Ответ

0 голосов
/ 05 мая 2020

Ладно, нашел решение сам. Проблема в том, что это всплывающее окно URL выполняет запрос REST API для search=phrase. Этот поисковый запрос также имеет аргумент lang=, для которого уже установлен соответствующий язык сообщений, однако при сборке ответа REST этот аргумент lang игнорируется.

Я пост-фильтрую результат REST, как это :

        add_filter('rest_pre_echo_response', [self::class, 'filterRESTResponse'], 10, 3);
    }


    public static function filterRESTResponse($result, $server, $request) {
        $params = $request->get_params();
        if (!empty($params['search']) && !empty($params['lang'])) {
            $filtered = [];
            $lang = $params['lang'];
            foreach ($result as $post) {
                $post_lang = pll_get_post_language($post['id']);
                if ($post_lang === $lang) {
                    $filtered []= $post;
                }
            }
            $result = $filtered;
        }
        return $result;
    }

Это решение немного неудобно, так как можно было бы заставить REST-запрос уважать язык с самого начала. Не знаю, как зацепиться за это. Что ж, все работает.

...