• Если любому стандартному виждету дать название на латинице, то при повторном входе в админку, а так же при переходе на сайт всё отображается нормально. Если же на русском, то виджет при обновлении страницы в админке пропадает и на сайте не отображается. Наблюдается на всех темах — и дефолтных и самодельных. С кодировкой БД и соединения всё нормально. Везде UTF-8. Проблема наблюдалась и на ранних версиях WP.

    На одном из форумов жаловались на функцию wp-includes/functions.php/is_serialized, мол она некорректно работает с юникодными строками. Попробую её переделать. Если заработает, то нужно будет сообщить разработчикам о баге.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Изменил функцию на такую. Т.е. в некоторых местах, где работа со символами производилась как с массивом, реализовал через строковые функции. В итоге всё заработало! Пишем разработчикам, чтобы исправляли скорее баг!

    function is_serialized( $data, $strict = true ) {
    	// if it isn't a string, it isn't serialized
    	if ( ! is_string( $data ) )
    		return false;
    	$data = trim( $data );
     	if ( 'N;' == $data )
    		return true;
    	$length = strlen( $data );
    	if ( $length < 4 )
    		return false;
    	if ( ':' !== substr($data,1,1) )
    		return false;
    	if ( $strict ) {
    		$lastc = substr($data,$length-1,1);
    		if ( ';' !== $lastc && '}' !== $lastc )
    			return false;
    	} else {
    		$semicolon = strpos( $data, ';' );
    		$brace     = strpos( $data, '}' );
    		// Either ; or } must exist.
    		if ( false === $semicolon && false === $brace )
    			return false;
    		// But neither must be in the first X characters.
    		if ( false !== $semicolon && $semicolon < 3 )
    			return false;
    		if ( false !== $brace && $brace < 4 )
    			return false;
    	}
    	$token = $data[0];
    	switch ( $token ) {
    		case 's' :
    			if ( $strict ) {
    				if ( '"' !== substr( $data,$length-2,1 ) )
    					return false;
    			} elseif ( false === strpos( $data, '"' ) ) {
    				return false;
    			}
    			// or else fall through
    		case 'a' :
    		case 'O' :
    			return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
    		case 'b' :
    		case 'i' :
    		case 'd' :
    			$end = $strict ? '$' : '';
    			return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data );
    	}
    	return false;
    }

    Было сделано 3 исправления.
    Строки:

    11:
    Было
    if ( ':' !== $data[1] )
    Стало
    if ( ':' !== substr($data,1,1) )

    14:
    Было
    $lastc = $data[ $length - 1 ];
    Стало
    $lastc = substr($data,$length-1,1);

    33:
    Было
    if ( '"' !== $data[ $length - 2 ] )
    Стало
    if ( '"' !== substr( $data,$length-2,1 ) )

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Пишем разработчикам, чтобы исправляли скорее баг!

    https://core.trac.wordpress.org/ticket/18007

    Сергей, так понял, что «сериализационная война» за самый лучший патч длится уже долго. И официальный победоносный багфикс ждать ещё долго.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Ошибка проявляется только при включённой перегрузке строковых функций.

    Не хватало простого описания шагов для воспроизведения проблемы. Добавил комментарий про виджеты. Думаю, будет исправлено в 3.9.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «Проблема при задании заголовков виджетов на русском» закрыта для новых ответов.