Как-то раз обратил внимание, что функция Wordpress the_excerpt() (отрывок/цитата) какая-то громоздкая (на её выполнение уходит много времени и ресурсов, чем она этого заслуживает), в подробности, почему она такая, вдаваться не буду, скажу только, что the_excerpt() вызывает get_the_excerpt(), the_content() и ко всем ним применяются различные хуки, ...
- Предыдущие по меткам
- Предыдущие записи
Ранее: Разгон
- Избавляемся от лишних обращений к данным ← 2.Апр.2010 // 22
- Полезный хак для WordPress, если сайт дорабатывается на локалке ← 1.Апр.2010 // 11
- Функция для вывода последних комментариев ← 11 Апрель 2010 // 109
- Меняем символы ХТМЛ (< >) на спецсимволы при комментировании ← 16 Апрель 2010 // 12
- Добавляем допустимые теги в комментариях ← 2 Апрель 2010 // 6
Приветствую, у меня проблема, скачал шаблон, а в нём кривизна какая-то... в общем выводит сообщение целиком, без обрезки изначального, а необходимо обрезать начало поста, сохранив изображения и цветовое форматирование...
<?php /* Start the loop */ if (have_posts()) { while (have_posts()) { the_post(); ?> <?php /* Permalink nav has to be inside loop */ if (is_single()) include (TEMPLATEPATH . '/navigation.php'); ?> <div id="post-<?php the_ID(); ?>" class="entry"> <h3 class="entry-header"><a href="<?php the_permalink() ?>" rel="bookmark" title='Постоянная ссылка: "<?php strip_tags(the_title()); ?>"'> <?php the_title(); ?> </a></h3> <?php comments_popup_link('<span class="entry-cmt"><span class="metacmt">'.__('Ваш отзыв','rgb').'</span></span>', '<span class="entry-cmt"><span class="metacmt">1 '.__('Отзыв','rgb').'</span></span>', '<span class="entry-cmt"><span class="metacmt">% '.__('Отзывов','rgb').'</span></span>', '', '<span class="entry-cmt"><span class="metacmt">'.__('Closed','rgb').'</span></span>'); ?> <div class="entry-date"><?php printf(__('%1$s, %2$s ','rgb'), the_time(__(' d M Y','rgb')), get_the_author()) ?></div> <div class="entry-content"> <?php if (is_search() || (function_exists('is_tag') && is_tag())) { the_excerpt(); } else { the_content(sprintf(__("Читать полностью »", 'rgb'), the_title('', 'rgb', false))); } ?> <?php wp_link_pages('before=<p><strong>' . __('Страницы:','rgb') . '</strong>&after=</p>'); ?> <!-- <?php trackback_rdf(); ?> --> </div> <?php if (is_home() || is_archive()) { ?> <div class="entry-footer"> <?php edit_post_link(__('Править','rgb'),'<span class="metaedit">','</span> '); ?> <span class="metacat"><?php the_category(','); ?></span> <?php the_tags('<span class="metatag">', ', ', '.</span>'); ?> </div> <?php } elseif (is_single()) { ?> <p class="intro"> </p> <?php } ?> </div> <?php } /* End The Loop */ ?>Тоесть чтоб выводился заголовок новости, а при нажатии на ссылку "подробнее...", открывался полный текст(пермалинк т.е.), этот код выводит перманентно только 1 из двух функций...
Нашел способ выводить разные переменные(на главной с обрезкой, после нажатия "подробнее..." полный текст в пермалинке), делюсь. Сеичас займусь графикой, перековыривая замечательную функцию данную автором темы, результат естественно выложу)
<?php if (is_front_page()) { kama_excerpt("maxchar=500"); } else { the_content(); } ?>Сильно сказано, я затрудняюсь понять, что вы имели ввиду
У вас там в 26-й строке, судя по всему, должно быть
<php the_content() ?>, если файла single.php в шаблоне нет.Успешного перековыривания
Желаю, чтобы у вас все получилось.
П.С. Пермалинк - это постоянная ссылка, например, пермалинк этой статьи:
Как-то странно вы это слово в контексте используете
Форматирование теста цветом, если угодно
Я уже и забыл что писал тут, вспомнил когда на мыло пришло письмо)
Кратко опишу особенность дело в том, что Вы для подсчёта символов обрезаете теги, я же всё что между "" считаю за 1 символ, кроме изображений, которые высчитываются через горизонтальное разрешение (5px=1символ) и вертикальное разрешение (получаем ширину строки, задаем вертикальные 30px как кол-во символов равные 1 строке) сравниваем значения, отсекаем лишнее слово, за исключением случая с изображением, если изображение после текста, то обрезаем по изображению, оставляя его в полной версии, иначе, выводим изображение и текст, если изображение не лезет, то обрезаем изображение чтоб уместить помимо 3 строки текста.
Да, у меня тогда всё получилось, правда пришлось писать длинюююющую функцию перезаписывающую ексерт, правда уже не использующую Ваш вариант
Я верно употребил это слово, как правило ссылка на полную версию является пермалинком статьи
Здравствуйте!
Спасибо за Вашу функцию, все работает.
У меня только вопрос, как оставить HTML теги не используя тег more.
Для меня вот в этом главная задача, так как функция the_excerpt() убирает все теги и выводит все сплошняком.
Спасибо!
Так теги оставить не получится, потому что обязательно будут ошибки, именно поэтому в the_excerpt() теги вырезаются. Представьте себе ситуацию, тег
<strong>открывается и до момента когда он должен закрыться функция обрезает текст, в итоге этот тег не закрывается, что приведет к печальным последствиям, а если это будет, например, тег<div>, то вообще весь дизайн сайта скукожится.П.С. Если вставлять текст с тегами в "цитату", то моя функция не убирает HTML теги.
Так, хорошо.
Мне вообще что требуется, что бы выдержка из поста была четкой высоты, иначе она выступает за края рамки.
То есть подошла бы обрезка построчно, вывести цитату ,скажем 5 строк, четко.
Как это можно прикрутить к Вашему коду или немного поправить условие $maxchar , что бы оно так же срезало заданное количество строк и не более?
Спасибо!
Если строки не разделяются, каким нить тегом (например
<br>), то обрезать по строкам нереально!Если блоки, где будет выводиться текст, одинаковые (ширина, высота), то по количеству символов можно подобрать, чтобы ничего не вылазило.
Еще Вас немного помучаю.
Вот есть такой плагин http://www.sonika.ru/blog/wordpress/excerpt-reloaded.htm
Делает нечто подобное Вашему коду.
В частности там присутствует сохранение тегов по выбору, допустим <strong>.
Можно ли осуществить такие действия в Вашем коде, если я выбираю save_format.
Хотя бы этот тег не форматировать?
Спасибо!
Обновил функцию, замените и укажите в параметре
save_formatте теги которые нужно оставить. Имейте ввиду, при обрезке, закрытие тегов не будет контролироваться!Используется как-то так:
kama_excerpt("maxchar=500&save_format=<strong><b>");после замены the_exerpt(); я не могу войти ни на одну страницу
выдает ошибку именно в той строке, где произвел замену
Fatal error: Call to undefined function kama__excerpt()
Судя по ошибке, вы вызываете функцию неправильно, 2 нижних подчеркивания: kama__excerpt(), а не kama_excerpt().
Эта функция выводит и изображение перед текстом (а для вывода изображений я использую вашу функцию вывода миниатюр). Как запретить выводить изображения в кратком анонсе? А так - на самом деле скорость генерации страниц выросла на 30-50%
Решение не подскажете? Не понимаю как убрать картинку при выводе урезанной статьи. т.к для ее вызова использую плагин миниатюр. И в итоге имею 2 картинки - миниатюру и полную. Голову сломал уже
Не понял что вам нужно? Какой плагин используете, как он работает? Что, где, когда вообще?
Я вывожу миниатюры с помощью kama_thumbnail и потом обрезанный текст с помощью этой функции (kama_excerpt). Но проблема в том - что выводится с помощью kama_excerpt еще и картинка (она то как раз полная и от неё как избавиться?). Как вы понимаете что 2 картинки - это плохо. Нужно чтоб kama_excerpt выводил только обрезанный текст и не выводил картинку.
Судя по всему у вас в посте тег
<!--more-->используется, поэтому остается картинка. В противном случае она, вместе с другими тегами, должна вырезаться. Чтобы игнорировать тег more удалите из кода:// для тега <!--more--> if( !$post->post_excerpt && strpos($post->post_content, '<!--more-->') ){ preg_match ('/(.*)<!--more-->/s', $out, $match); $out = str_replace("\r", '', trim($match[1], "\n")); $out = preg_replace( "!\n\n+!s", "</p><p>", $out ); $out = "<p>". str_replace( "\n", "<br />", $out ) ."</p>"; if ($echo) return print $out; return $out; }Да. теперь все получилось! Спасибо Вам.
Здравствуйте!
А как оставить ссылку в обрезанном сообщении? У меня выводит не отформатированный текст сплошняком. А хотелось бы что бы ссылка в тексте осталась.
Можно ли это сделать штатными функциями?
Это сложнее чем кажется.
Эта функция вырезает HTML теги потом режет текст, с тегами вырезается и ссылка. Если её не вырезать, то может получится так, что начало тега ссылки останется, а конец отрежется и получится незакрытый html тег, а это непростительная ошибка.
Здравствуйте! Спасибо за функцию, работает великолепно. Прикрутил к branfordmagazine, обрезает как надо, только почему-то save_format не работает, ни в 0, ни по выбранным тегам - убивает все теги.
в текстах отсутствует. Не подскажете, где надо копать?
Я уже косвенно ответил на этот вопрос в предыдущем комменте.
Невозможно оставить теги при обрезке по количеству символов - обязательно будут ошибки. save_format сохраняет только переносы строк, а теги вырезаются!
Теги не вырезаются только для случаев когда в тексте есть тег <!--more--> или указана "Цитата" (она показывается как есть, без обрезок и удаления тегов).
Кажется, я нашел,почему save_format не работал.
тут надо переставить местами на
Функция замечательная, мне очень помогла. Большое спасибо.
Точно! Вы правы!
Ошибочка притаилась. 