Каков подходящий поток для пользовательских данных из URL в WP_Query?

14

У меня есть многоэтапный процесс, который интегрирует сложную грань в WP-запросы. Проблема в том, что чем глубже я становлюсь, тем более размытым становится понимание того, как это должно работать, и я могу руководствоваться принципом, а не изобретательностью (и копать себе яму).

Общие этапы у меня есть (псевдокод, но близкий к реальному):

  1. получить значение из URL (что-то простое, как person=1)
  2. обработать значение и добавить пользовательские инструкции запроса ( $relationship_query[] = array('relationship' => 'person_to_cat', 'object' => 1 );)
  3. получить окончательные пользовательские инструкции запроса и сгенерировать соответствующие директивы SQL

К настоящему времени у меня есть много таких событий (отношения, таксономии, даты), и это становится хрупким (один угол кода не представляет ценности, когда другой угол кода ожидает его найти, и все разваливается).

Столь большой вопрос - что такое правильный протокол для передачи, получения, хранения и обработки пользовательских данных в WP через URL ?

Меньшие части:

  • как убедиться, что я не сталкиваюсь с WP внутренностями?
  • где и как я храню промежуточные данные?
    • Разница между queryи query_varsсвойствами? Они, кажется, используются почти одинаково в коде, но имеют тенденцию принимать разные значения, а методы предпочитают query_varsодин.
Rarst
источник

Ответы:

6

Я думаю, что функция WP, которую вы ищете, это add_rewrite_tag . Он направлен на добавление пользовательских GET-параметров в ваш URL-адрес и их автоматическое включение в query_vars.

Например, вы можете добавить следующее в ловушку init:

add_rewrite_tag('%person%','([^&]+)');

Для URL , как http://example.com?person=joe , глобальный $wp_queryбудет

$wp_query->query_vars['person'] = 'joe'

Вы также можете добавить правило перезаписи, чтобы сделать URL красивее, например, http://example.com/person/joe.

add_rewrite_rule('^person/([^/]*)/?','index.php?person=$matches[1]','top');

См. Rewrite API для получения дополнительной информации и примеров.

Фабьен Кватраво
источник
2
Я нашел некоторое время (в прошлом) , чтобы прочитать всю соответствующую коду WPи , WP_Queryи в то время как есть много вещей , случающихся там, я думаю , что add_rewrite_tag()кажется наиболее лаконичным способом сделать WP знать о пользовательских запросах вара и хорошо играть с ним.
Первый
1
  1. Проверьте wp-includes / class-wp.php, чтобы проверить любые зарезервированные query_vars
  2. Я не уверен, что вы подразумеваете под промежуточными данными. Можете ли вы объяснить больше?
  3. WP загружает страницу на основе строки запроса по URL-адресу, который переводится как запрос, затем WP_Query обрабатывает их, чтобы определить, какой запрос используется.

Пример: при загрузке страницы с /? Pagename = about, WP обработает строку запроса и обнаружит, что используемый query_var равен page_id.

Другой пример: /? Cat = 1, /? Category_name = uncategorized и / category / uncategorized имеют одинаковый query_var 'cat'

AriePutranto
источник
0

Я бы предположил, что это будет сделано через $_GETи / или $_POST, а затем манипулировать соответствующим образом.

В качестве альтернативы, сохраните массив данных в БД, а затем проанализируйте идентификатор в URL, например,

$data_id = $_GET['id'];

$data = $wpbd->get_results("SELECT * FROM wp_epic_table WHERE id=".$id);

Очевидно, что запрос не будет таким простым, он может включать в себя множество соединений и таблиц соединений. Это то, что я делаю на одной из моих страниц, анализирую уникальный идентификатор и затем собираю данные через MySQL.

Джошуа
источник