Создание анонса (more и noteaser)

Для того, чтобы разбить запись на две части, где первая будет отображаться только на главной станице (анонс, цитата), в тексте достаточно указать

<!--more-->

На главной странице будет отображен текст до этой конструкции.

Если вы хотите получить полный аналог поля «Цитата» (в админ-панели), то нужно указать:

<!--more-->
<!--noteaser-->

В этом случае на главной странице будет отображен текст до этой конструкции, а на странице записи его уже не будет.

http://maxsite.org/delenie-stranits-v-wordpresse

проблемы с тегом <!– more –>………

узнал об этом теге, очень обрадовался.
применил один раз на своем блоге, посвященном строительству и ремонту – и сразу обнаружил что этом посте и во всех более ранних весь текст стал жирным. я долго искал проблему, менял темы – все осталось по прежнему, даже после того как я убрал этот тег из сообщения….

кто что скажет, как с этим можно бороться?

да, WP там стоит 2.0.9 кажется.
может проще будет перейти на 2.2.2 если там нет таких проблем?

вопрос снимается как дурацкий. велика вероятность того что проблема была в моих слегка искривленных руках или грязной карме.

только что проделал все то же самое – никакой проблемы не было обнаружено…..

думаю, что тег more влепился между <strong> и </strong>, вот и получилось, что весь текст стал жирным в категории. думаю так дело было

Плагин Evermore http://www.thunderguy.com/semicolon/wordpress/evermore-wordpress-plugin/ автоматически разделяет пост тегом <!–more–> и автоматизирует создание анонсов 🙂 Назовём его вольным переводом Авторезка 😉 Сохраните нижеследущее под названием evermore.php

<?php
/*
Plugin Name: Evermore
Plugin URI: http://www.thunderguy.com/semicolon/wordpress/evermore-wordpress-plugin/
Description: Abbreviate all posts when viewed on multiple post pages. This makes all posts behave as if there is a "&lt;!–more–&gt;" at an appropriate spot inside the content.
Version: 2.2
Author: Bennett McElwee
Author URI: http://www.thunderguy.com/semicolon/

$Revision$

Copyright (C) 2005-06 Bennett McElwee

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the
Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

The GNU General Public License is also available at
http://www.gnu.org/copyleft/gpl.html

Bennett McElwee, bennett at thunderguy dotcom
*/

/*
INSTALLATION

1. Copy this file into the plugins directory in your WordPress installation (wp-content/plugins).
2. Log in to WordPress Admin. Go to the Plugins page and click Activate for this plugin.
3. If desired, go to the Options page, click Evermore and adjust settings.

USAGE

Evermore automatically abbreviates all posts when they appear on a multiple-post page such as the main blog page. It has the same effect as putting <!–more–> after the specified paragraph of every post. All formatting and HTML tags are preserved in the abbreviated post.

If the post already has a <!–more–> in it, then this plugin does nothing to it and the existing <!–more–> will behave as usual.

If you want to disable the plugin for any specific post, then include the codeword <!–nevermore–> in the post. This won’t show up in the post, but it will prevent the post from being abbreviated by Evermore.

DEVELOPMENT NOTES

All globals begin with "tguy_em_" (for Thunderguy Evermore)
Tested with PHP 4.4.x, WordPress 1.5 and 2.
*/

if (!is_plugin_page()) :

// Add the "more" link immediately after reading the post from the database
add_filter(‘the_posts’, ‘tguy_em_addmoreall’);
add_action(‘admin_menu’, ‘tguy_em_add_admin_pages’);

function tguy_em_addmoreall($posts) {
/* Add a "more" link immediately after reading posts from the database.
*/
$count = count($posts);
for ($i = 0; $i < $count; ++$i) {
$posts[$i]->post_content = tguy_em_addmore($posts[$i]->post_content);
}
return $posts;
}

function tguy_em_addmore($post_content) {
/* Add a "more" comment in an appropriate place, unless
there is already a "<!–more–>" (we don’t add an extra one) or
a "<!–nevermore–>" (user has disabled evermore for this post).
*/
// Only continue if content has no "more" and no "nevermore"
if ((false === strpos($post_content, ‘<!–more–>’))
&& (false === strpos($post_content, ‘<!–nevermore–>’))) {
$options = get_option(‘tguy_more_evermore’);
if (!$options) {
$options = tguy_em_get_default_options();
}
$char_skip_count = intval($options[’em_min_chars_to_skip’]);
$para_skip_count = intval($options[’em_paras_to_skip’]);
$link_on_new_para = $options[’em_link_on_new_para’];

// Skip a number of initial characters
$skipped_chars = substr($post_content, 0, $char_skip_count);
$unskipped_chars = substr($post_content, $char_skip_count);

// Use regex-fu to break the post into paragraphs. This scheme
// may fail on pathological combinations of <br> and
// newline chars. It can also fail on nested block-level tags
// (e.g. nested divs). So don’t do that!

// Pattern matching an HTML tag that indicates a paragraph
$para_tag = ‘(?:p|pre|blockquote|div|ol|ul|h[1-6]|table)’;
// Pattern matching two consecutive newlines with optional space between
$double_newline = "(?:\r\n *\r\n|\r *\r|\n *\n|<br\s*/?>\s*<br\s*/?>)";
// Pattern matching optional whitespace
$ws = ‘\s*’;
// Pattern matching paragraph body (must start at the beginning
// of a paragraph, and be followed by a paragraph end)
$body = ‘.+?’;
// Pattern matching the end of a paragraph
$end = "(?:$double_newline|</$para_tag>|(?<=\W)(?=$ws<$para_tag\W))";

// Get all the skipped paragraphs, but separate the end of the final paragraph so
// we can add a "run-on" more if necessary.
// regex finds: a para body; followed by (n-1) end+body pairs; followed by an end; followed by something.
$para_skip_dec = $para_skip_count – 1;
if (preg_match("!^($ws$body(?:$end$ws$body){".$para_skip_dec."})($end)$ws\S!is", $unskipped_chars, $matches)) {
$skipped_paras = $matches[1];
$skipped_end = $matches[2];
$unskipped_paras = substr($unskipped_chars, strlen($skipped_paras) + strlen($skipped_end));
if ($link_on_new_para) {
// Add 2 newlines after the more, to stop WP adding
// a <br> after the more which leaves a spurious blank line.
return $skipped_chars . $skipped_paras . $skipped_end . "<!–more–>\n\n" . $unskipped_paras;
} else {
return $skipped_chars . $skipped_paras . ‘<!–more–>’ . $skipped_end . $unskipped_paras;
}
}
}
// No "more" was added. If the request includes the magic word, then add diagnostic info in a comment at the end of the post
if ($_GET[‘evermore_diagnostics’]) {
return $post_content . "<!–\n" . htmlspecialchars(tguy_em_get_diagnostics($post_content, $options)) . "\n–>";
}
return $post_content;
}

function tguy_em_get_diagnostics(&$post_content, $options) {
// Return a string with diagnostic info on the raw post data.
$diagnostic_reason = "";

$char_skip_count = intval($options[’em_min_chars_to_skip’]);
$para_skip_count = intval($options[’em_paras_to_skip’]);
$link_on_new_para = $options[’em_link_on_new_para’];

$diagnostic_extra_info = "";
if (false !== strpos($post_content, ‘<!–more–>’)) {
$diagnostic_reason .= "Post contained (more)";
}
if (false !== strpos($post_content, ‘<!–nevermore–>’)) {
$diagnostic_reason .= "Post contained (nevermore)";
}
if (strlen($post_content) <= $char_skip_count) {
$diagnostic_reason .= "Post was too short";
}
if ($diagnostic_reason == "") {
// We must analyse the content to determine the reason
$diagnostic_reason .= "Post did not contain end-of-paragraph";
// Mark newlines, escape HTML
$diagnostic_unskipped_chars = substr($post_content, $char_skip_count);
$diagnostic_unskipped_chars = str_replace("\\", "\\\\", $diagnostic_unskipped_chars);
$diagnostic_unskipped_chars = str_replace(
array("\n", "\r"),
array("\\n", "\\r"),
$diagnostic_unskipped_chars);
$diagnostic_extra_info = "Post content (unskipped)
[" . $diagnostic_unskipped_chars . "]
";
}
return "Evermore was not triggered. Diagnostics:
Skip chars [$char_skip_count]
Skip paragraphs [$para_skip_count]
New paragraph [".($link_on_new_para?’true’:’false’)."]
Post length [".strlen($post_content)."]
Reason [$diagnostic_reason]
".$diagnostic_extra_info;
}

function tguy_em_add_admin_pages() {
add_options_page(‘Evermore’, ‘Evermore’, 10, __FILE__, ‘tguy_em_options_page’);

// Create option in options database if not there already:
add_option(‘tguy_more_evermore’, tguy_em_get_default_options(), ‘Options for the Evermore plugin’);
}

function tguy_em_get_default_options() {
$options = array();
$options[’em_min_chars_to_skip’] = 100;
$options[’em_paras_to_skip’] = 1;
$options[’em_link_on_new_para’] = true;
return $options;
}

endif; // if (!is_plugin_page())

function tguy_em_options_page() {
// See if user has submitted form
if ( isset($_POST[‘submitted’]) ) {
$options = array();
$options[’em_min_chars_to_skip’] = intval($_POST[’em_min_chars_to_skip’]);
$options[’em_paras_to_skip’] = intval($_POST[’em_paras_to_skip’]);
$options[’em_link_on_new_para’] = (bool)($_POST[’em_link_on_new_para’]);

// Remember to put all the other options into the array or they’ll get lost!
update_option(‘tguy_more_evermore’, $options);
echo ‘<div id="message" class="updated fade"><p><strong>Plugin settings saved.</strong></p></div>’;
}

// Draw the Options page for the plugin.
$options = get_option(‘tguy_more_evermore’);

$action_url = $_SERVER[PHP_SELF] . ‘?page=’ . basename(__FILE__);
?>
<div class=’wrap’>
<h2>Evermore</h2>
<p><cite>Evermore</cite> automatically displays a short preview of your posts on your blog home page.
The preview also appears on the archive and category pages.
For each post, the first few paragraphs are shown along with a "read more" link to read the full post.</p>

<form name="evermore" action="<?php echo $action_url; ?>" method="post">
<input type="hidden" name="submitted" value="1" />

<fieldset class="options">
<legend>Settings</legend>
<ul>
<li>
<label for="em_paras_to_skip">
Create previews containing the first
<input type="text" id="em_paras_to_skip" name="em_paras_to_skip"
size="2" maxlength="3"
value="<?php echo $options[’em_paras_to_skip’]; ?>" />
paragraphs of each post
</label>
</li>
<li>
<label for="em_min_chars_to_skip">
Ensure the preview is at least
<input type="text" id="em_min_chars_to_skip" name="em_min_chars_to_skip"
size="4" maxlength="4"
value="<?php echo $options[’em_min_chars_to_skip’]; ?>" />
characters long
</label>
</li>
<li>
Add a "read more" link to the full post<br />
<label for="em_link_on_new_para">
<input type="checkbox" id="em_link_on_new_para" name="em_link_on_new_para" <?php echo ($options[’em_link_on_new_para’]==true?"checked=\"checked\"":"") ?> />
Show the "Read more" link on a line by itself
</label><br />
Note that the actual text appearing on the link depends on your WordPress theme.
</li>
</ul>
<script type="text/javascript">
<!–
function tguy_em_set_defaults() {
document.getElementById("em_paras_to_skip").value = 1;
document.getElementById("em_min_chars_to_skip").value = 100;
document.getElementById("em_link_on_new_para").checked = true;
}
document.write(‘<p><input type="button" name="Defaults" value="Use Defaults" onclick="tguy_em_set_defaults(); return false;" /></p>’);
//–>
</script>
<noscript>
<p><strong>Defaults:</strong> Previews contain first 1 paragraph; count first 100 characters in first paragraph; show "Read more" on a line by itself.</p>
</noscript>
</fieldset>
<p class="submit"><input type="submit" name="Submit" value="Save changes &raquo;" /></p>
</form>
</div>
<?php
}

?>

Раз уж пошли плагины, которые работают с more, кину ссылку на очень простой и умный плагин auto-more который автоматически вставляет тег more после первого абзаца— если тег more не вставлен вручную в произвольном месте поста. Очень удобно. Автор хорошо нам известный Ю.Б.

Что-то не нахожу в коде этих плагинов фразы "Read more" – чтобы заменить на "Читать полностью" 🙁

auto-more который автоматически вставляет тег more после первого абзаца— если тег more не вставлен вручную в произвольном месте поста. Автор хорошо нам известный Ю.Б.

У меня вопрос по этому плагину к автору Ю.Б.
после подключения плагина при попытке войти в окно управления записями вышло сообщение с такой ошибкой:
Fatal error: Call to undefined function mb_strlen() in Z:\home\blog\www\wp-content\plugins\auto_more.php on line 43
Подскажите как мне действовать, чтоб плагин заработал.

Спрашивали – отвечаем. Либо использовать старую версию плагина, без mb, либо подключать в php расширение mb.
Справка: расширение mbsting представляет собой набор строковых функций, понимающих, что такое utf-8.

К сожалению, я совсем не знаю пхп. Вас не затруднит подробнее изложить очередность действий, чтоб подключить это расширение mb в php.
(сайт тестирую на локальном хосте, база данных и сам блог имеют одну кодировку utf8)

Затруднит, я не попугай по два раза отвечать на оффтоповые вопросы.

тут такое дело… добавил во все посты

<!--more-->
<!--noteaser-->

и хочу чтобы при выдаче списка статей по условиям query_posts в цикле выводился контент до <!–more–>
<!–noteaser–>, а у меня выводится все именно после него… как будто я зашел в пост.

вызывается контент следующей функцией:

  <?php the_content("Continue reading " . the_title('', '', false), true); ?>

подскажите что может быть не так?

Забавно. 🙂 А что у Вас в query_posts? $query_string. есть?

<?php query_posts('cat=6,-11,-1'); ?>

у меня пост принадлежит двум категориям, это сайт про телефоны все такое, указывается модель телефона и тип поста (обзор, новость, каталог)
Здесь я вывожу посты про alcatel например, и не вывожу новости и обзоры, тем самым оставляю для вывода посты каталога моделей.

Не знаю, ну попробуйте

<?php query_posts($query_string.'&cat=6,-11,-1'); ?>

Хуже не будет. 🙂

Не знаю, ну попробуйте 
<?php query_posts($query_string.'&cat=6,-11,-1'); ?>

Хуже не будет. 🙂

Таким образом посты вообще не вышли… просто заголовок страницы и все…

вот мой код целиком… может кто увидит где здесь ошибка…

<?php query_posts('cat=6,-11,-1'); ?>
<?php if (have_posts()) : ?>
<?php $first = true; ?>
<?php while (have_posts()) : the_post(); ?>
  <div class="post <?php if($first == true) echo "first" ?>" id="post-<?php the_ID(); ?>">
  <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Постоянная ссылка <?php the_title(); ?>"><?php the_title(); ?></a></h2>
  <small><?php the_time('F j, Y') ?> <!-- by <?php the_author() ?> --></small>
  <div class="entry">
  <?php the_content("Continue reading " . the_title('', '', false), true); ?>
  </div>
  <p class="postmetadata"><?php the_category(', ') ?> | <?php edit_post_link('Редактировать', '', ' | '); ?>
  <?php comments_popup_link('Нет комментариев »', 'Один комментарий »', 'Комментариев: %'); ?></p>
  </div>
<?php $first = !$first; if ($first) echo '<br clear=all>'; ?>
<?php endwhile; ?>

таким образом код работает, выводит нужные мне посты, контент после <!–noteaser–> <!–more–>, а мне надо именно до, анонсы статей…

<?php the_content("Continue reading " . the_title(”, ”, false)); ?>

<?php the_content("Continue reading " . the_title('', '', false)); ?>

Вот что я вычитал в кодексе

The <!--more--> quicktag will not operate and is ignored if there is only one post being displayed.

А добиться эффекта я хотел именно с внутренней страницы… типа одним постом соответственно…
кто-нибудь… подскажите такой вариант… чтобы на внутренней странице я вывел все посты по заданному параметру в querry_posts, именно до <!–noteaser–> <!–more–>.

Тоже столкнулся с данной проблемой 🙁 помогите

Вот нашел информацию – по автоматизации тега more без плагина, путем коректировки в теме файла index.php

4. Идём: внешний вид – редактор тем – основной шаблон(index)
И меняем код <?php the_content() ?>
на <?php the_excerpt() ?>
<a href="<?php the_permalink(); ?>">Читать далее</a>

Это позволит нам каждый раз не ставить тег more.
Это всё делается, чтобы не терять драгоценное время. – Про это пишут на http://blogweb.ru/recept-satellita-kotoryj-budet-garantirovanno-prinosit-po-1-dollaru-v-sutki-ot-sanchezboy/#more-16

Поменял эту команду. Появилось нужное "Читать далее" внизу поста, но досада – увидеть пост целиком не получаеться. При заходе в пост видим его первую часть и надпись "Читать далее", а остальная часть поста не открываеться.

Подскажите, что не так в настройках или что-то еще недоустановлено – недописано или ресурс где можно прочесть нужную информацию. Использую WP версии 2.7.0 Автор же этой интсрукции использует WP 2.3.3 Что-то не вериться что подобная проблема может быть связана с версией WP

Вернуть the_content() в файле single.php и «держать в уме», что the_excerpt() вызывает большую нагрузку на хостинг (своеобразная плата за лень).

Help Desk, да я б и рад послушать вашего совета, но тема не содержит файла single.php так что в этом файле я изменить что либо не мог никак… :/

Менял я в index.php, если вы не дочитались…

Help Desk, да я б и рад послушать вашего совета, но тема не содержит файла single.php так что в этом файле я изменить что либо не мог никак...  :/

Чтож – в таком случае, ответ на Вашу просьбу в последнем абзаце, Вы найдете в Кодексе. В частности в разделе про иерархию шаблонов.

Help Desk, а ссылочку жалко дать ?

http://codex.wordpress.org

Схему работы WP я приблизительно предсталяю…

Но сидеть и разбираться в движке не програмисту, это вы сами понимаете, не бует стоить потраченное время – заработанных денег. Не хотите дать нужного совета, так так и скажите что покинь мол наш сайт и ищи в другом м месте…

alexgor76: На сайте отвечают живые люди и если кто-то, на ваш взгляд, понял вас не точно, то можно просто уточнить или дополнить свой вопрос, а не дерзить. Это не добавляет желания давать развернутые ответы. Но даже не смотря на это, вам все равно дали достаточно информации, чтобы решить свою проблему.

К тому же вы просили «ресурс где можно прочесть нужную информацию» и получили его.

Не ужели так трудно воспользоваться поиском и перейти на страницу http://codex.wordpress.org/Иерархия_шаблонов? Даже, например в Гугле, можно набрать «wordpress иерархия шаблонов» и первые же несколько ссылок приведут вас туда куда надо.

На упомянутой странице посмотреть как отображается запись (пост): сначала WP ищет в папке темы файл single.php, а если не находит, то отображает index.php. Особенно наглядно это видно на картинке, на той же странице.

Исходя из этого у вас есть выбор:
1. Вернуть the_content() в файле index.php, т.к. при отсутствии single.php отображается index.php, а там вы сами установили «выводить короткие цитаты».
2. Создать single.php, с таким же, например, содержимым как и в index.php, но с the_content() вместо the_excerpt().
3. Выбрать другую оформление для сайта или реализовать более сложное решение.

Help Desk, огромное вам спасибо за подсказку !!!

Извините, обидеть никого не хотелось.

Не зная PHP лишний раз боишься тронуть даже символ в движке, дабы не перстал работать. Все получилось что было нужно сделать. И также приобрел маленький опыт по выводу анонсов и всего поста и настройках сего дела. Тоесть польза получилась двойная, смогу теперь все это использовать для любой темы.

Как всегда гениальное оказалось очень простым – наличии или отсутствии файла single.php.

Спасибо вам еще раз и всем вашим помощникам.
Еще раз извиняюсь за свой тон.

alexgor76: Хоть в извинениях необходимости не было и нужды я в них не испытывал, но не принять их не могу.

всем вашим помощникам

🙂

«Приходите еще» (с)

А у меня вот обратный вопрос – нужно чтобы в меню отображалась только краткая инфа о постах из определённой категории, а при открытии этой категории – все её посты целиком, но без краткой инфы. Поставил тег more – да, в меню получилось то что надо, но ведь и при открытии категории теперь отображается только то что стоит перед more! Подскажите, пожалуйста, как сделать чтобы при открытии категории оторбражалось то что после more сразу всех её постов?

А у меня вот обратный вопрос - нужно чтобы в меню отображалась только краткая инфа о постах из определённой категории, а при открытии этой категории - все её посты целиком, но без краткой инфы. Поставил тег more - да, в меню получилось то что надо, но ведь и при открытии категории теперь отображается только то что стоит перед more! Подскажите, пожалуйста, как сделать чтобы при открытии категории оторбражалось то что после more сразу всех её постов?

Во-первых у категорий есть описание, которое и является "краткой инфой о постах", или же можно использовать custom fields.

Anonymous
Отправить
Ответ на: