Respostas:
GUIA COMPLETO DE PERCERTOS
Recentemente, respondi a algumas perguntas sobre trechos, por isso darei uma explicação detalhada sobre o máximo que puder.
PREFÁCIO
Parece haver algumas perguntas decorrentes desta resposta sobre onde o código deve ir, e a resposta é: depende realmente de você e como você achar melhor. Existem algumas opções em que você pode colocar o código (se não explicitamente indicado):
No arquivo functions.php do seu tema, use qualquer arquivo de funções. Lembre-se de quando você fizer isso, se o tema não for seu, todas as alterações serão perdidas quando você atualizar seu tema
Uma maneira melhor seria usar o código em um tema filho. Como acima, no arquivo functions.php ou relacionado às funções
Use o código em um plugin. Essa é a maneira preferida, pois disponibiliza o código em todos os temas. Se você alternar temas, não precisará se preocupar em reescrever o mesmo código.
Espero que isso esclareça as coisas um pouco :-)
TAGS / FORMATO DO HTML
the_excerpt()
Antes de tudo, não aceita nenhum parâmetro; portanto, nada pode ser passado para ele. É um fato que the_excerpt()
apara o conteúdo em 55 palavras e todas as tags HTML são removidas antes de retornar o texto. the_excerpt()
está localizado em wp-includes / post-template.php . Para permitir determinadas ou todas as tags HTML no trecho, um novo trecho deve ser criado.
Primeiro, a função original precisa ser removida primeiro e, em seguida, a nova função precisa ser conectada get_the_excerpt
. Observe que este novo trecho ainda poderá ser chamado como the_excerpt()
nos arquivos de modelo, sem necessidade de alterar isso. get_the_excerpt()
está localizado em wp-includes / post-template.php .
O trecho é usado wp_trim_excerpt
para retornar o texto aparado; portanto, precisamos wp_trim_excerpt
primeiro remover o filtro do trecho. wp_trim_excerpt()
está localizado em wp-includes / formatting.php , linha 2355. É assim:
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
Agora você pode adicionar seu novo trecho a get_the_excerpt
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');
Para permitir tags / formatação html, precisaremos especificar quais tags você precisará permitir. Você pode usar a seguinte strip_tags
declaração para conseguir isso
$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());
O segundo argumento wpse_allowedtags()
é uma pequena função usada para adicionar as tags the_excerpt()
permitidas. Para obter uma lista completa de tags HTML 5 válidas, vá e confira aqui . Aqui está a função, adicione tags HTML a isso que você precisa permitir / manter
function wpse_allowedtags() {
// Add custom tags to this string
return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>';
}
Se você precisar permitir todas as tags HTML, ou seja, nenhuma remoção de nenhuma tag, a strips_tags()
função poderá ser omitida / removida completamente.
Um ponto a ser observado, no entanto, quando as tags html são permitidas, essas tags são contadas como palavras; portanto, sua contagem de palavras para trechos com tags e sem tags não será a mesma. Para corrigir isso, você precisará remover essas tags da contagem real de palavras primeiro, para que apenas as palavras sejam contadas.
Escrevi um trecho que permitirá todas as tags, conte apenas palavras como palavras e complete uma frase após a quantidade definida de palavras (para que o texto não seja aparado no meio da frase) e adicione mais um texto após a última palavra .
Aqui está o código completo
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');
Você pode simplesmente remover o '//' das funções que você precisa extra.
COMPRIMENTOS COM EXCERTOS PERSONALIZADOS
Às vezes, você precisa exibir trechos simples de diferentes comprimentos e não é viável escrever um trecho para cada post / função / página. Aqui está uma pequena função agradável usandowp_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>');
}
O que essa pequena função faz é pegar get_the_excerpt
, aparar para $limit
definir pelo usuário e retornar o texto com um link leia mais no final.
Você pode chamar esse trecho da seguinte forma no seu modelo
echo wpse_custom_excerpts($limit);
onde $limit
será sua contagem de palavras, então um trecho de 30 palavras será
echo wpse_custom_excerpts(30);
Apenas uma coisa a lembrar aqui, se você definir seu limite para mais de 55 palavras, apenas 55 serão retornadas, pois o trecho terá apenas 55 palavras. Se forem necessários trechos mais longos, use-o get_the_content
.
COMPRIMENTO EXCERTO PERSONALIZADO
Se você apenas precisar alterar o comprimento the_excerpt()
, poderá usar a seguinte função
function wpse_excerpt_length( $length ) {
return 20;
}
add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 );
Lembre-se de que você precisará definir uma prioridade maior que 10 para que sua função personalizada seja executada após o padrão.
ADICIONAR LEIA MAIS LINK
Todo o texto retornado pelo trecho tem o ódio [...]
no final que não é clicável. Para adicionar um texto para ler mais no lugar dos hellips, use esta função
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' );
EDITAR
Trecho do primeiro parágrafo
Eu quero manter isso completo, então aqui está o trecho que apara após o primeiro parágrafo.
Aqui está uma função que mantém as tags HTML intactas, adiciona um link "Leia mais" no final do trecho e apara o trecho após o primeiro parágrafo.
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');
Para qualquer pessoa que precise de uma solução alternativa para não exibir o link ler mais após o trecho, quando o trecho for menor que a quantidade de palavras definida, consulte a seguinte pergunta e resposta
functions.php
. Você pode adicionar que um pouco acima if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :
da suafunctions.php
Adicione mais tags se precisar $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);
}
Você também pode adicionar um editor de texto rico para trechos, adicionar o código abaixo no arquivo do plug-in ou no arquivo function.php do tema e poderá ver o editor HTML para trechos. Além disso, ele renderizará trechos no formato HTML também. #Felicidades
Eu copiei isso de algum lugar, mas não me lembro da fonte. Estou usando isso em todos os meus projetos e está funcionando.
/**
* 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>'; }
im confuso