Поддержка Проблемы и решения Внезапно изменилась кодировка названий файлов

  • Господа, всем привет!
    Начал сегодня добавлять статью на сайт и заметил странную вещь, при добавлении картинки с именем на русском языке, post_title у картинки вместо привычного названия файла пишется в виде url_encode().

    Пример файл «тест.jpg» — раньше post_title был «тест», теперь «%d1%82%d0%b5%d1%81%d1%82».
    На сервере картинка сохраняется как раньше «тест.jpg».
    Названия картинок выводятся в куче мест, в галерею статью добавляется несколько десятков фото, переименовывать их вручную не хотелось бы.

    В последний раз ровно месяц назад добавлял на сайт новую статью — проблемы не было.
    Сегодня проблема появилась.
    Сам движок не обновлял, плагины тоже…
    Возможно WP обновился в этот промежуток времени автоматически.

    Что делать, куда копать?

Просмотр 15 ответов — с 1 по 15 (всего 17)
  • Модератор Yui

    (@fierevere)

    永子

    в следующем релизе wordpress будет исправлено
    https://core.trac.wordpress.org/ticket/37989

    Сам движок не обновлял

    автообновление 4.6.0 до 4.6.1 сработало
    ошибка была внесена исправлением безопасности, так что, пока поисправляйте вручную
    и/или используйте предложенный в тикете патч, если планируется загружать много картинок

    • Ответ изменён 7 лет, 8 месяцев назад пользователем Yui.

    Yui, спасибо!
    Смущает одно, у меня текущая версия WP 4.4.5

    Возможно поэтому workaround от @sergeybiryukov валит сайт с 500-й ошибкой, а 3 diff’а от joemcgill выглядят иначе нежели мой текущий код…

    Смущает одно, у меня текущая версия WP 4.4.5

    обновления безопасности затрагивают все линейки версий движка.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    у меня текущая версия WP 4.4.5

    Там та же самая проблема: https://core.trac.wordpress.org/ticket/37989#comment:3

    workaround от @sergeybiryukov валит сайт с 500-й ошибкой

    Что-то не так вставили, нужно смотреть логи.

    @sergeybiryukov, вставляю в самый конец файла functions.php используемой темы вот этот код:

    function wp37989_fix_encoded_attachment_titles( $data, $postarr ) {
    	$basename = pathinfo( $postarr['file'], PATHINFO_BASENAME );
    
    	$data['post_title'] = sanitize_text_field( $basename );
    
    	return $data;
    }
    add_filter( 'wp_insert_attachment_data', 'wp37989_fix_encoded_attachment_titles', 10, 2 );

    Сайт падает с 500-й ошибкой, в логах это:

    
    [Wed Sep 21 15:49:43.796824 2016] [:error] [pid 8962] [client 5.35.81.65:49697] PHP Fatal error:  Cannot redeclare wp37989_fix_encoded_attachment_titles() (previously declared in /home/u440037/ddd.com/www/wp-content/themes/ddd/functions.php:393) in /home/u440037/ddd.com/www/wp-content/themes/ddd/functions.php on line 393, referer: http://www.ddd.com/wp-admin/post.php?post=9086&action=edit
    

    @flector, спасибо!
    Не знал…

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    PHP Fatal error: Cannot redeclare wp37989_fix_encoded_attachment_titles() (previously declared in /home/u440037/ddd.com/www/wp-content/themes/ddd/functions.php:393)

    Судя по логам, функция вставлена два раза — достаточно одного 🙂

    @sergeybiryukov, я не тупее паровоза 🙂
    Этот код вставляется только один раз.
    На всякий случай прошелся поиском по содержимому всех файлов сайта, может она где затесалась — нет, никаких упоминаний о «wp37989_fix» нет.
    Может functions.php где-то подхватывается несколько раз ?…

    Хотя искал я напрасно, из ошибки видно что она возникает в строке 393 и ругается что функция уже объявлена на той же 393 строке.
    Змея жрет сама себя…

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Может functions.php где-то подхватывается несколько раз ?…

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

    Попробуйте обернуть код в условие if ( ! function_exists() ):

    if ( ! function_exists( 'wp37989_fix_encoded_attachment_titles' ) ) :
    function wp37989_fix_encoded_attachment_titles( $data, $postarr ) {
    	$basename = pathinfo( $postarr['file'], PATHINFO_BASENAME );
    
    	$data['post_title'] = sanitize_text_field( $basename );
    
    	return $data;
    }
    add_filter( 'wp_insert_attachment_data', 'wp37989_fix_encoded_attachment_titles', 10, 2 );
    endif;

    @sergeybiryukov, сложно сказать, я с внутренностями WP недавно столкнулся, тема писалась на заказ, всё может быть.
    Ваше решение от fatal errer’а избавило. спасибо! 🙂
    Только обнаружилась проблемка, закачиваю файл с именем «привет тест.jpg», в post_title пишется «-test.jpg»
    В файловую систему файл ложится в виде «привет-тест.jpg»…
    Что-то обрезает текст слева от «-«.
    Когда закачивал файл «тест.jpg», создался новый «тест-2.jpg» и отобразился как «-2.jpg».

    Опечатка, post_title пишется «-test.jpg» = post_title пишется «-тест.jpg»

    @sergeybiryukov, пробовал играться со значением параметров add_filter(); в лучшем случае получал тот же результат — стирается первое слово.
    В чем может быть проблема?

    Не знаю, может я один такой, у кого фикс от @sergeybiryukov не работает до конца…
    Считал что лезть в код движка недопустимо, но работать как-то нужно.
    В итоге убрал из functions.php темы «workaround» и заменил в /wp-admin/inclides/media.php строка 289

    $title = sanitize_title( $name );
    на
    $title = sanitize_text_field( $name );

    Всё отлично заработало.

Просмотр 15 ответов — с 1 по 15 (всего 17)
  • Тема «Внезапно изменилась кодировка названий файлов» закрыта для новых ответов.