ГлавнаяWordpressАвторские Функции → Обрезка текста и/или замена стандартной функции the_excerpt()

Обрезка текста и/или замена стандартной функции the_excerpt()

Комментариев: 70Обрезка текста и/или замена стандартной функции the_excerpt()
  • Приветствую, у меня проблема, скачал шаблон, а в нём кривизна какая-то... в общем выводит сообщение целиком, без обрезки изначального, а необходимо обрезать начало поста, сохранив изображения и цветовое форматирование...

    	<?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();
      					} ?>
      
      ОТВЕТИТЬ ↓
    • цветовое форматирование...

      Сильно сказано, я затрудняюсь понять, что вы имели ввиду smile

      У вас там в 26-й строке, судя по всему, должно быть <php the_content() ?>, если файла single.php в шаблоне нет.

      Успешного перековыривания smile Желаю, чтобы у вас все получилось.

      П.С. Пермалинк - это постоянная ссылка, например, пермалинк этой статьи:

      http//wp-kama.ru/id_31/obrezka-teksta-zamenyaem-the-excerpt.html
      

      Как-то странно вы это слово в контексте используете smile

      ОТВЕТИТЬ ↓
      • цветовое форматирование...

        Сильно сказано, я затрудняюсь понять, что вы имели ввиду smile

        Форматирование теста цветом, если угодно

        Успешного перековыривания smile Желаю, чтобы у вас все получилось.

        Я уже и забыл что писал тут, вспомнил когда на мыло пришло письмо)
        Да, у меня тогда всё получилось, правда пришлось писать длинюююющую функцию перезаписывающую ексерт, правда уже не использующую Ваш вариант sad Кратко опишу особенность дело в том, что Вы для подсчёта символов обрезаете теги, я же всё что между "" считаю за 1 символ, кроме изображений, которые высчитываются через горизонтальное разрешение (5px=1символ) и вертикальное разрешение (получаем ширину строки, задаем вертикальные 30px как кол-во символов равные 1 строке) сравниваем значения, отсекаем лишнее слово, за исключением случая с изображением, если изображение после текста, то обрезаем по изображению, оставляя его в полной версии, иначе, выводим изображение и текст, если изображение не лезет, то обрезаем изображение чтоб уместить помимо 3 строки текста.

        П.С. Пермалинк - это постоянная ссылка

        Я верно употребил это слово, как правило ссылка на полную версию является пермалинком статьи smile

        ОТВЕТИТЬ ↓
  • Здравствуйте!
    Спасибо за Вашу функцию, все работает.
    У меня только вопрос, как оставить HTML теги не используя тег more.
    Для меня вот в этом главная задача, так как функция the_excerpt() убирает все теги и выводит все сплошняком.
    Спасибо!

    ОТВЕТИТЬ ↓
    • Так теги оставить не получится, потому что обязательно будут ошибки, именно поэтому в the_excerpt() теги вырезаются. Представьте себе ситуацию, тег <strong> открывается и до момента когда он должен закрыться функция обрезает текст, в итоге этот тег не закрывается, что приведет к печальным последствиям, а если это будет, например, тег <div>, то вообще весь дизайн сайта скукожится.

      П.С. Если вставлять текст с тегами в "цитату", то моя функция не убирает HTML теги.

      ОТВЕТИТЬ ↓
      • Так, хорошо.
        Мне вообще что требуется, что бы выдержка из поста была четкой высоты, иначе она выступает за края рамки.
        То есть подошла бы обрезка построчно, вывести цитату ,скажем 5 строк, четко.
        Как это можно прикрутить к Вашему коду или немного поправить условие $maxchar , что бы оно так же срезало заданное количество строк и не более?
        Спасибо! smile

        ОТВЕТИТЬ ↓
      • Если строки не разделяются, каким нить тегом (например <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, ни по выбранным тегам - убивает все теги.

    <!--more-->

    в текстах отсутствует. Не подскажете, где надо копать?

    ОТВЕТИТЬ ↓
    • Я уже косвенно ответил на этот вопрос в предыдущем комменте.

      Невозможно оставить теги при обрезке по количеству символов - обязательно будут ошибки. save_format сохраняет только переносы строк, а теги вырезаются!

      Теги не вырезаются только для случаев когда в тексте есть тег <!--more--> или указана "Цитата" (она показывается как есть, без обрезок и удаления тегов).

      ОТВЕТИТЬ ↓
  • Кажется, я нашел,почему save_format не работал.

    $save_format = isset($i['save_format']) ? false : trim($i['save_format']);

    тут надо переставить местами на

    $save_format = isset($i['save_format']) ? trim($i['save_format']) : false ;

    Функция замечательная, мне очень помогла. Большое спасибо.

    ОТВЕТИТЬ ↓
    • Точно! Вы правы! *good* Ошибочка притаилась. *blush*

      ОТВЕТИТЬ ↓
Форма комментирования

¤ Вставляйте код кнопкой: "Код" (php, js, html, css, sql);
¤ Выделяйте HTML код кнопкой: "Выделить" (<div>);
¤ Перед отправкой комментария используйте "Превью";
¤ Не пишите спам/бред — бесполезно!

Подписаться на комментарии без комментирования:

X

Забыли пароль?