Я работаю с переносом из Drupal в многосетевую сеть WP, у меня есть поле метаданных, содержащее URL-адрес старого сообщения (в основном для поддержания социального учета и т. Д.), Которые я использую для структуры постоянной ссылки. Я делаю это со следующим:
add_filter('post_link', 'migration_permalinks', 10, 3 ); function migration_permalinks( $permalink, $post, $leavename ) { if( ($post->post_type == 'post' ) && ( $the_link = get_post_meta( $post->ID, '_the_old_site_permalink', true) ) ) { $url = parse_url( $the_link ); $permalink = site_url() . $url['path']; } return $permalink; }
Проблема, с которой я сталкиваюсь, заключается в том, что если заголовок сообщения содержит апостроф, '
(а не прямая цитата '
), URL-адрес сообщения не работает. Закодировано, что преобразуется в %E2%80%99
. В адресной строке браузера, если я изменяю апостроф на прямую одиночную кавычку, URL-адрес работает и отображается сообщение. Существующий сайт Drupal содержит апостроф ( %E2%80%99
) без проблем.
Поддержание URL-адреса довольно важно, потому что мне не нужны существующие ссылки на страницу до 404, когда происходит миграция. Почему ссылка не работает, когда она содержит апостроф?
Я думаю, ваша проблема в том, что при использовании апострофа в URL-адресе правила перезаписи WordPress распознают имя сообщения, содержащее апостроф.
Вы можете проверить, что с помощью print_r( $wp_query->query );
,
Если моя догадка верна, параметр запроса «имя» содержит %E2%80%99
, поэтому WP будет выглядеть в db для сообщения, чей слизень содержит закодированный апостроф, но (по умолчанию) столбцы сообщения перед сохранением фильтруются с помощью sanitize_title
и поэтому %E2%80%99
удаляется, а почта не найдена.
Вы можете заставить WP сохранить %E2%80%99
в пуле, но я боюсь, что он взорвется вам в лицо раньше или позже, потому что WordPress всегда ожидает санированный слизень.
Если привязка URL важна, вы можете использовать фильтр в 'parse_query'
для sanitize_title
запроса 'name' var:
add_action( 'parse_query', function( WP_Query $query ) { if ( ( $name = $query->get('name') ) ) { $query->set( 'name', sanitize_title($name) ); } } );
Затем должен работать URL с апострофом.