суббота, 26 января 2013 г.

Черный ромб с вопросом внутри…


25 марта 2010Внешний вид Плагины WordPress Функционал3 коммент. »
6 Просмотров
Как-то, переводя очередной шаблон китаянки Chiq Montes, столкнулся с проблемой неправильной кодировки русского текста в анонсах статьи на главной странице. Проблема была в том, что фраза обрезалась на неожиданном месте и в конце стоял вот такой символ – черный ромб с вопросом внутри:
excerpt
При этом обратил внимание, что английский текст отображался корректно. Я понял, что проблема лежит в том, что функция, которую использовал автор, некорректно работает с таблицей кириллицы. Во-первых, сначала я посмотрел на функцию, которую автор поставил в файле index.php для вывода анонса статьи. Выглядит она вот так:
1
< ?php echo dp_clean($post-(post_content, 250); ?>
Я решил, что число 250 – это количество символов, которое выводится на главной и стал методом “тыка” его менять, чтобы получить в результате нормальное отображение текста, без черного ромба. Конечно, у меня ничего не получилось :)

После этого я не стал листать книги по PHP и MySQL, а просто загуглил вопрос в поиске и стал кропотливо искать пояснения, как мне обойти эту проблему. Нашел достаточно много информации, но все было не то. И только в одной статье нашел прямую подсказку, какую функцию можно использовать для вывода анонсов статьи на главной – the_excerpt (). Я решил попробовать и заменил ту, которую поставил автор, на эту. Кстати, советую вам прежде, чем вы что-то решили поменять в коде, сначала сохранить файл. Я сделал чуть проще: так как я менял только одну строку, я просто закомментировал функцию автора. Вы тоже можете использовать подобный подход. Как это делается? Очень просто перед началом любой функции надо поставить вот такие знаки: <!— а после окончания функции – такие: —> Например:
1
<!---< ?php echo dp_clean($post-(post_content, 250); ?>--->
Таким образом, функция закрыта и работать не будет. Это значит, что мы ее “закомментировали”. Теперь вставляем функцию the_excerpt (). Выглядеть она будет так:
1
< ?php the_excerpt () ; ?>
Чтобы вам было более понятно, в каком месте необходимо её вставлять, я вам покажу всю часть кода из файла index.php с комментариями в конце каждой строки, что именно выполняется каждой строкой этой части кода. Пример мой из шаблона китаянки, как раз с тем “кривым” кодом:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
&amp;amp;lt;!-- begin latest posts –--&amp;amp;gt; /* Как раз пример комментария. Говорит, что это – начало.
&amp;amp;lt;div class=&amp;amp;quot;box&amp;amp;quot;&amp;amp;gt; /* Див, отвечающий за вывод свойства “box” для отображения нашего анонса.
&amp;amp;lt; ?php if (have_posts()) : ?&amp;amp;gt; /* Начало цикла вывода записей из нашей базы данных.
&amp;amp;lt; ?php while (have_posts()) : the_post(); ?&amp;amp;gt; /* Продолжение цикла loop.
&amp;amp;lt;li&amp;amp;gt; /* Тег начала вывода элемента маркированного списка.
&amp;amp;lt;a href=&amp;amp;quot;&amp;amp;lt;?php the_permalink(); ?&amp;amp;gt;&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;?php dp_attachment_image($post-(ID, 'thumbnail', 'alt=&amp;amp;quot;&amp;amp;quot;' . $post-&amp;amp;quot;post_title . '&amp;amp;quot;'); ?&amp;amp;gt;&amp;amp;lt;/a&amp;amp;gt; /* Функция вывода картинки-миниатюры в анонсе статьи.
&amp;amp;lt;a href=&amp;amp;quot;&amp;amp;lt;?php the_permalink(); ?&amp;amp;gt;&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;?php the_title(); ?&amp;amp;gt;&amp;amp;lt;/a&amp;amp;gt; /* Сам заголовок статьи.
&amp;amp;lt;!---&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;?php echo dp_clean($post-(post_content, 250); ?&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;---&amp;amp;gt; /* А это как раз наша “кривая” функция, которая и выводит черный ромб с вопросом внутри в конце записи. Я ее “закомментировал”.
&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;?php the_excerpt_reloaded(45, '', 'none', TRUE, '', 2); ?&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt; /* А это – наша новая функция вывода анонса статьи на главной.
&amp;amp;lt;a href=&amp;amp;quot;&amp;amp;lt;?php the_permalink(); ?&amp;amp;gt;&amp;amp;quot;&amp;amp;lt;more&amp;amp;gt;/&amp;amp;gt; /* Тег вывода слова “далее”, кликая на него, мы попадаем на чтение всей статьи (запускается файл single.php).
&amp;amp;lt;/li&amp;amp;gt; /* Тег закрытия элемента маркированного списка.
&amp;amp;lt; ?php endwhile; ?&amp;amp;gt; /* Тег закрытия списка. О списках и свойствах стилей в Сети много он-лайн учебников. Я пользуюсь этим сайтом - www.htmlbook.ru.
&amp;amp;lt;p class=&amp;amp;quot;postnav&amp;amp;quot;&amp;amp;gt; /* Класс стилей, отвечающий за отображения навигации “вперед” и “назад” по нашим страницам записей. Обычно стоит ниже последней записи. Его отлично заменяют плагины страничной навигации типа WP-Pagenavi или WP-Page-Number.
&amp;amp;lt; ?php next_posts_link('&amp;amp;amp;amp;laquo; Older Entries'); ?&amp;amp;gt; &amp;amp;amp;amp;nbsp; /* Выводит ссылку на страницу “назад”
&amp;amp;lt; ?php previous_posts_link('Newer Entries &amp;amp;amp;amp;raquo;'); ?&amp;amp;gt; /* То же, но на страницу “вперед”.
&amp;amp;lt; ?php endif; ?&amp;amp;gt; /* Окончание цикла loop, который выводит наши записи на главной.
&amp;amp;lt;!-- end latest posts --&amp;amp;amp;&amp;amp;gt;
А теперь посмотрим, что произошло после замены “кривой” функции dp_clean($post->post_content, 250) на новую, – the_excerpt (). Показываю на том же примере, что и вверху:
excerpt2
Что сразу бросается в глаза: черного ромба нет, но…. Количество слов увеличилось, а это не очень красиво выглядит. Теперь текст обтекает картинку не только слева, но и внизу. Страница потеряла привлекательность. В чем причина? А причина как раз в функции the_excerpt (), у которой количество символов стоит как бы по умолчанию, и регулировать их вывод мы не можем.
Получается, что одну проблему мы убрали, но столкнулись с другой. Опять я возвращаюсь в поиск и с помощью великого Google (а куда без них и Яшки?) ищу ответ на новую проблему. Искал долго, честное слово. Потому как точно не знал, что ищу. И наконец наткнулся на блог Соники, где она подробно описывает работу еще одной функции, а точнее – плагина, который позволяет регулировать количество символов в анонсе статьи, атакже – настроить еще несколько важных свойств вывода анонса. Я не буду здесь повторять ее статью, а просто отправлю вас к ней – читайте если надо. Здесь я скажу только несколько слов. Внимательно изучив все возможные варианты, я настроил вывод функции так:
1
< ?php the_excerpt_reloaded(50, '', 'none', TRUE, '', 2); ?>
Все, что находится между круглыми скобками – это дополнительные аргументы. Не буду их описывать, скажу только главное: число 50 – это количество слов в анонсе. Честно – считал и сравнивал, не совпадает, но – работает. Регулируйте больше или меньше, и увидите, что количество выводимых слов меняется. И главное: все равно при написании статьи используйте тег <!—more—>, тогда вы сможете добится четкого отображения слов в анонсе, под обрез самой картинки:
excerpt3 Видите, в первых двух записях я, используя в редакторе тег  <!—more—> добился, чтобы анонс заканчивался вровень с картинкой, а в последней статье этого не сделал.
Как использовать функцию the_excerpt_reloaded ? Это плагин, который так и называется. Я его всегда ложу в папку шаблона моей любимой китаянки :) когда сталкиваюсь с ее “кривой” функцией dp_clean($post->post_content, 250). Плагин относится к разряду плагинов, о которых говорят – поставил и забыл. Главное, не забыть руками удалить “кривую” функцию и прописать нужную в тех файлах шаблона, где она работает. Обычно это файлы index.php, archive.php, search.php.
Если вы столкнулись с нечто подобным в своем шаблоне, который брали не у меня, но видите в анонсах черный ромб и знак вопроса – скачайте плагин и попробуйте сделать так как я написал выше. Возможно, вам это поможет.
Скачать плагин the-excerpt-reloaded.
  Плагин The-Excerpt-Reloaded (2,3 KiB, 904 скачиваний)
Напомню еще, что обычным блокнотом править файлы php не надо. Надо использовать специальные редакторы с поддержкой UTF-8.
Будут вопросы, отзывы, советы – пишите в комментариях.
Хотите следить за новыми публикациями на моем сайте – .

  • Ron Van:
    Большое спасибо автору за простое и надежное решение. Практически это решает кучу проблем с англосаксонскими темами, которые познакомить с кириллицей подчас довольно трудно. Но даже такое универсальное решение в некоторых случаях может не спасти. И вот почему.
    Править код — это хорошо, но некоторые разработчики, как например wpzoom, таким образом кодируют тему, что при любых изменениях в файле, даже если поставлен пробел, ее ломает напрочь. Причем увидеть это можно только в ИЕ, а в других браузерах тема незначительно плывет, можно и не заметить. Поэтому предлагаемое решение не всегда применимо. Но это единичные случаи конечно)
    • admin:
      Спасибо, Ron Van, за ваш комментарий.
      WPZoom и им подобные много чего кодируют. Спасает, если вы покупаете у автора шаблон и пытаетесь вместе с ним решить проблемы с кодировкой, кириллическими шрифтами и другие, не столь важные, моменты. Правда, не все «забугорные» авторы идут на контакты, даже если шаблон куплен на их сайте (из личного опыта).
      Поэтому приходится искать варианты. Решение с черными ромбами с помощью этого плагина — честно сказать, немного устарело, но еще работает. Сейчас появились новые хуки, с помощью которых можно обойти эту проблему.
      Какие? Надо лишь немного погуглить))
  • Алекс:
    Тоже была проблема с символами, просто найди в плагине строковые функции и поменяй их на мультибайтовые, вот http://ru.forums.wordpress.org/topic/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%BE%D0%B9-2
  • Комментариев нет:

    Отправить комментарий