Как создать условие, чтобы скрыть кнопку «читать далее» когда длина отрывка короче заданной длины отрывка?
На вордпресс кнопка отображается у всех записей, даже когда длина текста отрывка короче 55 слов.
Вот тема https://wordpress.org/themes/zakra/.
Дополнительно:
Ответы:
даже когда длина текста отрывка короче 55 слов
Откуда вы вязли магическое 55?
На вордпресс кнопка отображается у всех записей,
... Если в тексте поста есть <!--more-->, то ссылка (кнопка) будет показана.
More ссылка зависит от содержимого поста: If the quicktag is used in a post.
А вот если вы что-то такое сделали, чтобы 55 символов обрабатывало - то там проблему и ищите.
- 55 берется из /wp-includes/formatting.php
$excerpt_length = (int) _x( '55', 'excerpt_length' );
$excerpt_length = (int) _x( '55', 'excerpt_length' );
- YBB, ОК.
Но я так понимаю, что excerpt_length должен работать сapply_filters( 'excerpt_more', ' ' . '[&hellip;]' ); и apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );
apply_filters( 'excerpt_more', ' ' . '[&hellip;]' ); и apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );
?
А в вопросе используется the_content который сокращает текст по позиции<!--more--> в посте.
Или всё не так?
- iljaGolubev, Всё так, всё так. Я просто уточнил, откуда берется (может браться) магическое число 55 :)
Но мы же не знаем, что там на сайте. Некоторые для if ( ! is_singular() )подменяют вывод the_content автогенерируемым excerpt или его аналогом, и тогда играет 55. Но в шаблоне этого не видно. Да и вообще, лечить по фотографии - удел экстрасенсов :)
- iljaGolubev, 55 стандартная обрезка по коду excerpt в теме для всех записей, тег more работает тоже, но в двух вариантах, когда все записи отображаются не отрывком а полным текстом и в какой-то записи решили отрезать More поставив, либо при excerpt чтобы сократить отрывок еще короче чем 55 слов, то есть обрезав там где вам нужно.
у меня в теме выбрано использовать отрывки вместо полных записей, потому любая запись будет обрезаться до 55 слов и ставить [...].
другой вопрос, что скорее всего в теме ставиться вручную кнопка "читать дальше", так что надо играться с условием для кода между этой кнопкой и отрывком, когда он короче 55 слов чтобы кнопки не было, так как читать дальше нечего.
я дополнила вопрос, и указала ссылку на файлы темы. Там много файлов и какой нужен я не знаю, потому смотрите в теме файлы.
- YBB, я дополнила вопрос, и указала ссылку на файлы темы. Там много файлов и какой нужен я не знаю, потому смотрите в теме файлы.
- @VEri63
у меня в теме выбрано использовать отрывки вместо полных записей,
Что-то я вообще не нашел такой настройки. Где она прячется?
- YBB, на странице сайта /customize в пунктах Настройка->Содержимое.
В коде где это не знаю.Может это
<?php /** * Entry content template file. * * @package zakra * * TODO: @since. */ // Exit if accessed directly. defined( 'ABSPATH' ) || exit; $post_content = get_theme_mod( 'zakra_post_content_archive_blog', 'excerpt' ); ?> <div class="entry-content"> <?php if ( is_single() ) { the_content( sprintf( wp_kses( /* translators: %s: Name of current post. Only visible to screen readers */ __( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'zakra' ), array( 'span' => array( 'class' => array(), ), ) ), get_the_title() ) ); } else { the_content(); } wp_link_pages( array( 'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'zakra' ), 'after' => '</div>', ) ); ?> </div><!-- .entry-content -->
<?php /** * Entry content template file. * * @package zakra * * TODO: @since. */ // Exit if accessed directly. defined( 'ABSPATH' ) || exit; $post_content = get_theme_mod( 'zakra_post_content_archive_blog', 'excerpt' ); ?> <div class="entry-content"> <?php if ( is_single() ) { the_content( sprintf( wp_kses( /* translators: %s: Name of current post. Only visible to screen readers */ __( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'zakra' ), array( 'span' => array( 'class' => array(), ), ) ), get_the_title() ) ); } else { the_content(); } wp_link_pages( array( 'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'zakra' ), 'after' => '</div>', ) ); ?> </div><!-- .entry-content -->
А может тут
<?php /** * Entry thumbnail template file. * * @link https://developer.wordpress.org/themes/basics/template-hierarchy/ * * @package zakra * * TODO: @since. */ // Exit if accessed directly. defined( 'ABSPATH' ) || exit; $readmore_alignment = get_theme_mod( 'zakra_blog_button_alignment', 'style-1' ); $readmore_alignment = 'alignment-' . $readmore_alignment; if ( get_theme_mod( 'zakra_enable_blog_button', true ) ) { do_action( 'zakra_post_readmore', $readmore_alignment ); } ?> </div>
<?php /** * Entry thumbnail template file. * * @link https://developer.wordpress.org/themes/basics/template-hierarchy/ * * @package zakra * * TODO: @since. */ // Exit if accessed directly. defined( 'ABSPATH' ) || exit; $readmore_alignment = get_theme_mod( 'zakra_blog_button_alignment', 'style-1' ); $readmore_alignment = 'alignment-' . $readmore_alignment; if ( get_theme_mod( 'zakra_enable_blog_button', true ) ) { do_action( 'zakra_post_readmore', $readmore_alignment ); } ?> </div>
-
на странице сайта /customize в пунктах Настройка->Содержимое.
Спасибо. Увидел.
- Любым удобным и понятным способом (через плагин Code Snippets, functions.php дочерней темы, etc) добавить нижеследующий сниппет.,главное - чтобы он выполнился до скрипта /wp-content/themes/zakra/inc/hooks/content.php Добавленный в функцию код подавит вывод read more для коротких записей. Не понравится этот - придумаете другой :)
if ( ! function_exists( 'zakra_post_readmore' ) ) : /** * Post read more HTML. * * @param string $readmore_alignment CSS class. */ function zakra_post_readmore( $readmore_alignment ) { global $post; $e2 = wp_trim_words( $post->post_content, 55, $more = '##########' ); if ( strpos($e2, '##########') === false ) { return; } ?> <div class="<?php zakra_css_class( 'zakra_read_more_wrapper_class' ); ?> zak-<?php echo esc_attr( $readmore_alignment ); ?>"> <a href="<?php the_permalink(); ?>" class="entry-button"> <?php echo apply_filters( 'zakra_read_more_text', esc_html__( 'Read More', 'zakra' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php zakra_get_icon( 'arrow-right-long' ); ?> </a> </div> <!-- /.zak-entry-footer --> <?php } endif;
if ( ! function_exists( 'zakra_post_readmore' ) ) : /** * Post read more HTML. * * @param string $readmore_alignment CSS class. */ function zakra_post_readmore( $readmore_alignment ) { global $post; $e2 = wp_trim_words( $post->post_content, 55, $more = '##########' ); if ( strpos($e2, '##########') === false ) { return; } ?> <div class="<?php zakra_css_class( 'zakra_read_more_wrapper_class' ); ?> zak-<?php echo esc_attr( $readmore_alignment ); ?>"> <a href="<?php the_permalink(); ?>" class="entry-button"> <?php echo apply_filters( 'zakra_read_more_text', esc_html__( 'Read More', 'zakra' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php zakra_get_icon( 'arrow-right-long' ); ?> </a> </div> <!-- /.zak-entry-footer --> <?php } endif;
- YBB, ☺работает. на 100% все еще не проверяла как работает. но как надо скрывается))) спасибо
- VEri63, на здоровье!
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Кнопка “читать далее” может выводиться по разным причинам: из-за тега
<!--more-->, из-за функции темы, которая всегда добавляет ссылку, или из-за обрезки excerpt. Поэтому сначала нужно понять, что именно использует тема Zakra в карточке записи:the_content(),the_excerpt()или свою функцию.Если речь про excerpt, можно проверять длину исходного текста и показывать кнопку только когда текст реально длиннее лимита:
$raw = get_the_excerpt(); $words = preg_split('/s+/', wp_strip_all_tags($raw)); if (count($words) > 55) { echo '<a class="read-more" href="' . esc_url(get_permalink()) . '">Читать далее</a>'; }
Но в темах чаще кнопка зашита в шаблон. Тогда нужно переопределить template part в дочерней теме или найти фильтр темы для read more. Править файлы родительской темы напрямую не стоит: обновление темы сотрёт изменения.
Если кнопка появляется из-за
<!--more-->, то её наличие зависит не от 55 слов, а от того, вставлен ли этот тег в контент. Тогда условие нужно строить по содержимому:if (strpos(get_post_field('post_content', get_the_ID()), '<!--more-->') !== false) { // show read more }
Для точного решения откройте файл карточки записи темы и найдите строку с текстом кнопки. После этого станет понятно, какой фильтр или шаблон переопределять.