Что не так с моим правилом перезаписи для URL-адреса страницы с параметрами запроса и короткими кодами?

Я новичок в программировании WP, и у меня возникают проблемы с тем, что было бы простой проблемой в других средах.

Я создал страницу (cdl-manual), используя обычный WP admin UI. Затем я добавил некоторые функции в файл functions.php темы, чтобы я мог использовать короткие коды для содержимого страницы. Функции ищут параметр запроса (jp_stn) в URL-адресе и используют эту информацию для выбора содержимого из таблицы базы данных. В этом случае значение параметра – это имя состояния США. Контент, на который подается контент, – это страница, ориентированная на это состояние.

Все, что работает сейчас на моем веб-сайте dev.

http://blog.jobspetroleum.net/cdl-training/ перечисляет ссылку на руководство CDL для каждого штата. Эти ссылки имеют следующую форму, как описано выше.

http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona

Теперь я хочу преобразовать этот URL-адрес запроса для конкретного пользователя в удобный URL-адрес. Это новый образец.

http://blog.jobspetroleum.net/cdl-manual/arizona/

Очевидным решением для меня было добавить правило перезаписи. После долгих перерывов я нашел плагин, который позволил мне добавить пользовательское правило перезаписи непосредственно в файл .htaccess. Плагин является «WP htaccess Control», и он работает очень хорошо. Однако мои правила перезаписи не работают так, как должны. Вот результирующий файл .htaccess после добавления правила rewrite.

# BEGIN WordPress # WPhtc: Begin Custom htaccess RewriteRule ^cdl-manual/([-az]+)/$ /cdl-manual/?jp_stn=$1 [L] # WPhtc: End Custom htaccess <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress 

Новое правило находится в разделе «Пользовательский htaccess». Это вызывает ошибку 404, когда я тестирую ее с помощью / cdl-manual / arizona /. Для отладки я попытался изменить флаги с [L] на [R, L].

Это вызвало перенаправление на http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona . Правильно загруженный контент страницы, но URL-адрес не был перезаписан. Я пришел к выводу, что правильное совпадение правильное. Но без флага R, я думаю, переписывание не работает должным образом. Правило верное в соответствии с http://htaccess.madewithlove.be/, и переписанный URL – это именно то, что я хочу.

Кто-нибудь знает, что здесь не так? Мой подход полностью отключен? Что это лучший способ исправить это? Благодарю.

Редактировать 10/1/2014. Если это кому-то помогает, на странице «Руководство CDL» есть только контент «[bigleaf_jobspet_cdlmanualbystate]». Эта функция и другие зависимости находятся в файле functions.php в моей дочерней теме. Эта конкретная функция ищет параметр запроса jp_stn в GET, считывает имя состояния, затем извлекает подробный контент из таблиц, которые я добавил в базу данных. Затем он возвращает HTML для указанного состояния.

Редактировать 10/2/2014 – Копаем в WP Codex Я нашел ссылку на переменную запроса pagename для index.php. Итак, я попробовал несколько вариантов и придумал это правило, которое почти срабатывает.

 RewriteRule ^cdl-manual/([-az]+)/$ ?pagename=cdl-manual&jp_stn=$1 [L] 

Это правило загружает страницу руководства cdl, но игнорирует значение параметра состояния. Как ни странно, если я ввожу предполагаемый шаблон перезаписи в браузер, он загружает именно нужную страницу для указанного состояния.

http://blog.jobspetroleum.net/?pagename=cdl-manual&jp_stn=arizona

Solutions Collecting From Web of "Что не так с моим правилом перезаписи для URL-адреса страницы с параметрами запроса и короткими кодами?"

Причина, по которой вы получаете 404, заключается в том, что правило перезаписи не изменяет URL-адрес запроса как сообщенную переменную sin $_SERVER[REQUEST_URI] PHP, а wordpress анализирует эту переменную при принятии решения о том, какой контент является запросом, и поскольку такой страницы / cdl нет -manual / arizona / отображает 404.

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

Вместо того, чтобы добавлять правило в .htaccess, вы можете использовать переписывание WordPress для этого:

 function cdl_rewrite_rule(){ add_rewrite_rule( 'cdl-manual/([-az]+)/?$', 'index.php?pagename=cdl-manual&jp_stn=$matches[1]', 'top' ); } add_action( 'init', 'cdl_rewrite_rule' ); 

Предполагается, что вы уже добавили jp_stn в список допустимых запросов:

 function cdl_query_vars( $query_vars { $query_vars[] = 'jp_stn'; return $query_vars; } add_filter( 'query_vars', 'cdl_query_vars' ); 

Flush rewrites для вступления правила в силу, вы можете сделать это, посетив страницу настроек постоянных ссылок.