Апостроф в постоянной ссылке приводит к тому, что страница не найдена

Я работаю с переносом из 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 с апострофом.