답변:
예외에 대한 완전한 안내서
최근에 발췌 부분에 대한 몇 가지 질문에 답변 했으므로 가능한 한 자세히 설명하겠습니다.
머리말
코드가 어디로 가야하는지에 대한이 답변에서 발생하는 몇 가지 질문이있는 것 같습니다. 답은 실제로 당신에게 달려 있으며 어떻게 보이는지에 달려 있습니다. 명시 적으로 언급되지 않은 경우 코드를 배치 할 수있는 몇 가지 옵션이 있습니다.
테마의 functions.php 또는 모든 파일에서 함수 파일로 사용하십시오. 테마를 직접 작성하지 않으면 테마를 업그레이드 할 때 모든 변경 사항이 손실됩니다.
더 좋은 방법은 자식 테마에서 코드를 사용하는 것입니다. 위와 같이 functions.php 또는 함수 관련 파일에서
플러그인에서 코드를 사용하십시오. 이것이 모든 테마에서 코드를 사용할 수있게하므로 선호되는 방법입니다. 테마를 전환하면 동일한 코드를 다시 작성하는 것에 대해 걱정할 필요가 없습니다.
나는 이것이 조금 정리되어 있기를 바랍니다 :-)
HTML 태그 / 포맷
the_excerpt()
우선 어떤 매개 변수도 허용하지 않으므로 전달할 수있는 것이 없습니다. 그것은 사실이다 the_excerpt()
(55 개) 단어의 내용을 트림, 모든 HTML 태그는 텍스트를 반환하기 전에 제거됩니다. the_excerpt()
에 위치 / 후 template.php을 WP-포함되어 있습니다 . 발췌에서 특정 또는 모든 HTML 태그를 허용하려면 새로운 발췌를 만들어야합니다.
우선 원래 기능을 먼저 제거한 다음 새 기능을에 연결해야 get_the_excerpt
합니다. 이 새로운 발췌문은 the_excerpt()
템플릿 파일에서 와 마찬가지로 계속 호출 가능하므로 변경할 필요가 없습니다. get_the_excerpt()
에 위치 / 후 template.php을 WP-포함되어 있습니다 .
발췌는 wp_trim_excerpt
잘린 텍스트를 반환하는 데 사용 되므로 wp_trim_excerpt
발췌 필터에서 먼저 제거해야합니다 . wp_trim_excerpt()
에 위치하고 WP-포함 / formatting.php , 라인 2355이는 방법입니다 :
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
이제 새로운 발췌문을 추가 할 수 있습니다 get_the_excerpt
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');
html 태그 / 포맷을 허용하려면 허용 할 태그를 지정해야합니다. 다음 strip_tags
문장을 사용하여 이를 달성 할 수 있습니다.
$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());
두 번째 인수 wpse_allowedtags()
는 the_excerpt()
허용 할 태그를 추가하는 데 사용되는 작은 함수입니다 . 유효한 HTML 5 태그의 전체 목록을 보려면 여기에서 확인 하십시오 . 여기에 기능이 있습니다. 허용 / 유지 해야하는 HTML 태그를 추가하십시오.
function wpse_allowedtags() {
// Add custom tags to this string
return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>';
}
모든 HTML 태그를 허용해야하는 경우, 즉 태그를 제거하지 않으면 strips_tags()
기능을 완전히 생략 / 제거 할 수 있습니다.
그러나 html 태그가 허용되면 이러한 태그는 단어로 계산되므로 태그가 있거나 태그가없는 발췌에 대한 단어 수는 동일하지 않습니다. 이를 정정하려면 단어 만 계산되도록 먼저 실제 단어 수에서 이러한 태그를 제거해야합니다.
모든 태그를 허용하고 단어로만 단어를 세고 설정된 단어 수만큼 문장을 완성하고 (문장 중간에 텍스트가 잘리지 않음) 마지막 단어 다음에 더 많은 텍스트를 읽을 수있는 발췌문을 작성했습니다 .
완전한 코드는 다음과 같습니다.
function wpse_allowedtags() {
// Add custom tags to this string
return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>';
}
if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :
function wpse_custom_wp_trim_excerpt($wpse_excerpt) {
$raw_excerpt = $wpse_excerpt;
if ( '' == $wpse_excerpt ) {
$wpse_excerpt = get_the_content('');
$wpse_excerpt = strip_shortcodes( $wpse_excerpt );
$wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
$wpse_excerpt = str_replace(']]>', ']]>', $wpse_excerpt);
$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); /*IF you need to allow just certain tags. Delete if all tags are allowed */
//Set the excerpt word count and only break after sentence is complete.
$excerpt_word_count = 75;
$excerpt_length = apply_filters('excerpt_length', $excerpt_word_count);
$tokens = array();
$excerptOutput = '';
$count = 0;
// Divide the string into tokens; HTML tags, or words, followed by any whitespace
preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);
foreach ($tokens[0] as $token) {
if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) {
// Limit reached, continue until , ; ? . or ! occur at the end
$excerptOutput .= trim($token);
break;
}
// Add words to complete sentence
$count++;
// Append what's left of the token
$excerptOutput .= $token;
}
$wpse_excerpt = trim(force_balance_tags($excerptOutput));
$excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . ' » ' . sprintf(__( 'Read more about: %s »', 'wpse' ), get_the_title()) . '</a>';
$excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);
//$pos = strrpos($wpse_excerpt, '</');
//if ($pos !== false)
// Inside last HTML tag
//$wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); /* Add read more next to last word */
//else
// After the content
$wpse_excerpt .= $excerpt_more; /*Add read more in new paragraph */
return $wpse_excerpt;
}
return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
}
endif;
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');
추가 기능이 필요한 기능에서 '//'를 제거하면됩니다.
커스텀 발췌 길이
때로는 길이가 다른 간단한 발췌문을 표시해야하며 모든 게시물 / 기능 / 페이지에 대한 발췌문을 작성하는 것은 불가능합니다. 다음은 사용하는 멋진 작은 기능입니다.wp_trim_words
function wpse_custom_excerpts($limit) {
return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . ' …' . __( 'Read more »', 'wpse' ) . '</a>');
}
이 작은 기능은 사용자 get_the_excerpt
가 $limit
설정하여 잘라 내고 끝에 더 많은 링크가있는 텍스트를 반환하는 것입니다.
템플릿에서 다음과 같이이 발췌를 호출 할 수 있습니다
echo wpse_custom_excerpts($limit);
$limit
당신의 단어 수는 어디에 있습니까 , 그래서 30 단어의 발췌는
echo wpse_custom_excerpts(30);
여기서 한 가지 기억해야 할 것은, 한도를 55 단어 이상으로 설정하면 발췌 길이는 55 단어이므로 55 단어 만 반환됩니다. 더 긴 발췌가 필요한 경우 get_the_content
대신 사용하십시오.
커스텀 발췌 길이
의 길이를 변경 해야하는 경우 the_excerpt()
다음 기능을 사용할 수 있습니다
function wpse_excerpt_length( $length ) {
return 20;
}
add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 );
사용자 지정 함수가 기본값 이후에 실행되도록 우선 순위를 10보다 크게 설정해야합니다.
추가 링크를 읽으십시오
발췌에 의해 반환 된 모든 텍스트 [...]
는 끝에 클릭 할 수없는 증오 를 나타냅니다. 헬프 대신 텍스트를 더 읽으려면이 함수를 사용하십시오.
function wpse_excerpt_more( $more ) {
return ' <a class="read-more" href="'. get_permalink( get_the_ID() ) . '">' . __('Read More', 'your-text-domain') . '</a>';
}
add_filter( 'excerpt_more', 'wpse_excerpt_more' );
편집하다
첫 번째 단락 발췌
나는 이것을 완벽하게 유지하고 싶기 때문에 첫 번째 단락 이후에 나오는 발췌 부분이 있습니다.
다음은 HTML 태그를 그대로 유지하고 발췌 부분 끝에 "자세히 읽기"링크를 추가하고 첫 번째 단락 이후 발췌를 자르는 함수입니다.
if ( ! function_exists( 'wpse0001_custom_wp_trim_excerpt' ) ) :
function wpse0001_custom_wp_trim_excerpt($wpse0001_excerpt) {
global $post;
$raw_excerpt = $wpse0001_excerpt;
if ( '' == $wpse0001_excerpt ) {
$wpse0001_excerpt = get_the_content('');
$wpse0001_excerpt = strip_shortcodes( $wpse0001_excerpt );
$wpse0001_excerpt = apply_filters('the_content', $wpse0001_excerpt);
$wpse0001_excerpt = substr( $wpse0001_excerpt, 0, strpos( $wpse0001_excerpt, '</p>' ) + 4 );
$wpse0001_excerpt = str_replace(']]>', ']]>', $wpse0001_excerpt);
$excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . ' » ' . sprintf(__( 'Read more about: %s »', 'pietergoosen' ), get_the_title()) . '</a>';
$excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);
//$pos = strrpos($wpse0001_excerpt, '</');
//if ($pos !== false)
// Inside last HTML tag
//$wpse0001_excerpt = substr_replace($wpse0001_excerpt, $excerpt_end, $pos, 0);
//else
// After the content
$wpse0001_excerpt .= $excerpt_more;
return $wpse0001_excerpt;
}
return apply_filters('wpse0001_custom_wp_trim_excerpt', $wpse0001_excerpt, $raw_excerpt);
}
endif;
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wpse0001_custom_wp_trim_excerpt');
발췌문이 설정된 단어의 양보다 짧을 때 발췌 후 더 많은 링크 읽기를 표시하지 않는 해결 방법이 필요한 사람은 다음 질문 및 답변을 참조하십시오
functions.php
. 당신은 위의 것을 추가 할 수 있습니다 if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :
당신에functions.php
필요한 경우 더 많은 태그 추가 $allowed_tags = ...
function _20170529_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
//Retrieve the post content.
$text = get_the_content('');
//Delete all shortcode tags from the content.
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$allowed_tags = '<a>,<b>,<br><i>';
$text = strip_tags($text, $allowed_tags);
$excerpt_word_count = 55; /*** MODIFY THIS. change the excerpt word count to any integer you like.***/
$excerpt_length = apply_filters('excerpt_length', $excerpt_word_count);
$excerpt_end = '[...]'; /*** MODIFY THIS. change the excerpt endind to something else.***/
$excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
발췌문에 대한 서식있는 텍스트 편집기를 추가하고 플러그인 파일 또는 테마의 function.php 파일에 아래 코드를 추가하면 발췌에 대한 HTML 편집기를 볼 수 있습니다. 또한 발췌문을 HTML 형식으로 렌더링합니다. #건배
나는 이것을 어딘가에서 복사했지만 소스를 기억하지 못한다. 나는 모든 프로젝트에서 이것을 사용하고 있으며 효과가 있습니다.
/**
* Replaces the default excerpt editor with TinyMCE.
*/
add_action( 'add_meta_boxes', array ( 'T5_Richtext_Excerpt', 'switch_boxes' ) );
class T5_Richtext_Excerpt
{
/**
* Replaces the meta boxes.
*
* @return void
*/
public static function switch_boxes()
{
if ( ! post_type_supports( $GLOBALS['post']->post_type, 'excerpt' ) )
{
return;
}
remove_meta_box(
'postexcerpt', // ID
'', // Screen, empty to support all post types
'normal' // Context
);
add_meta_box(
'postexcerpt2', // Reusing just 'postexcerpt' doesn't work.
__( 'Excerpt' ), // Title
array ( __CLASS__, 'show' ), // Display function
null, // Screen, we use all screens with meta boxes.
'normal', // Context
'core', // Priority
);
}
/**
* Output for the meta box.
*
* @param object $post
* @return void
*/
public static function show( $post )
{
?>
<label class="screen-reader-text" for="excerpt"><?php
_e( 'Excerpt' )
?></label>
<?php
// We use the default name, 'excerpt', so we don’t have to care about
// saving, other filters etc.
wp_editor(
self::unescape( $post->post_excerpt ),
'excerpt',
array (
'textarea_rows' => 15,
'media_buttons' => FALSE,
'teeny' => TRUE,
'tinymce' => TRUE
)
);
}
/**
* The excerpt is escaped usually. This breaks the HTML editor.
*
* @param string $str
* @return string
*/
public static function unescape( $str )
{
return str_replace(
array ( '<', '>', '"', '&', ' ', '&nbsp;' ),
array ( '<', '>', '"', '&', ' ', ' ' ),
$str
);
}
}
function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }
혼동하는 위치