Je cherchais un extrait de code qui me permette de limiter la longueur du titre de manière similaire à ce que vous pouvez obtenir avec the_excerpt et d'afficher simplement "(...)" si le titre est trop long. Je voudrais utiliser cela dans les boucles en dehors de single.php, par exemple. dans ma barre latérale où un titre extrêmement long nuirait à la mise en page.
Tout ce que je pouvais trouver était cet extrait de code, mais cela ne correspond évidemment pas à ce que je veux.
function maxWord($title)
{
global $post;
$title = $post->post_title;
if (str_Word_count($title) >= 10 ) //set this to the maximum number of words
wp_die( __('Error: your post title is over the maximum Word count.') );
}
add_action('publish_post', 'maxWord');
Est-ce possible?
Je cherche quelque chose de similaire comme ceci, mais pas pour l'extrait, mais pour le titre:
function excerpt($limit) {
$excerpt = explode(' ', get_the_excerpt(), $limit);
if (count($excerpt)>=$limit) {
array_pop($excerpt);
$excerpt = implode(" ",$excerpt).' (...)';
} else {
$excerpt = implode(" ",$excerpt);
}
$excerpt = preg_replace('`\[[^\]]*\]`','',$excerpt);
return $excerpt;
}
function content($limit) {
$content = explode(' ', get_the_content(), $limit);
if (count($content)>=$limit) {
array_pop($content);
$content = implode(" ",$content).' (...)';
} else {
$content = implode(" ",$content);
}
$content = preg_replace('/\[.+\]/','', $content);
$content = apply_filters('the_content', $content);
$content = str_replace(']]>', ']]>', $content);
return $content;
}
Cela dépend à 100% de la façon dont vous obtenez le titre. Si vous utilisez un objet global (c'est-à-dire $post->post_title
, vous ne le transmettez à aucun filtre et vous devrez recourir à un post-traitement sophistiqué pour réduire le titre.
Cependant, si vous êtes dans une boucle de publication, utilisez soit the_title()
pour rappeler le titre du message actuel, soit get_the_title()
pour le renvoyer par programme.
Si vous utilisez l'une de ces deux fonctions, WordPress transmettra automatiquement le titre de l'article à travers un filtre avant de vous le restituer.
Ensuite, vous pouvez ajouter ce qui suit à le haut de votre fichier sidebar.php
:
function japanworm_shorten_title( $title ) {
$newTitle = substr( $title, 0, 20 ); // Only take the first 20 characters
return $newTitle . " …" // Append the elipsis to the text (...)
}
add_filter( 'the_title', 'japanworm_shorten_title', 10, 1 );
Désormais, chaque fois que vous référencerez the_title()
ou get_the_title()
dans votre barre latérale, ils renverront la version automatiquement raccourcie au lieu de la version complète.
N'oubliez pas de supprimer ce filtre à la fin de votre fichier sidebar.php
ou il s'appliquera également ailleurs dans votre thème:
remove_filter( 'the_title', 'japanworm_shorten_title' );
Si vous voulez une fonction que vous pouvez utiliser n'importe où, je vous recommande de créer vos propres versions de get_the_title()
et the_title()
et de les utiliser dans votre code. Par exemple:
function japanworm_get_the_title( $length = null, $id = 0 ) {
$post = &get_post($id);
$title = isset($post->post_title) ? $post->post_title : '';
$id = isset($post->ID) ? $post->ID : (int) $id;
if ( !is_admin() ) {
if ( !empty($post->post_password) ) {
$protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));
$title = sprintf($protected_title_format, $title);
} else if ( isset($post->post_status) && 'private' == $post->post_status ) {
$private_title_format = apply_filters('private_title_format', __('Private: %s'));
$title = sprintf($private_title_format, $title);
}
}
// Shorten the title
if ( null != $length ) {
$length = (int) $length;
$title = substr( $title, 0, $length ); // Only take the first 20 characters
$title .= " …";
}
return apply_filters( 'the_title', $title, $id );
}
function japanworm_the_title($before = '', $after = '', $echo = true, $length = null) {
$title = get_the_title($length);
if ( strlen($title) == 0 )
return;
$title = $before . $title . $after;
if ( $echo )
echo $title;
else
return $title;
}
Celles-ci sont copiées à partir des fonctions the_title()
et get_the_title()
originales, de sorte qu'elles devraient / fonctionnent dans la boucle de la même manière. Je n'ai pas testé cela, cependant.
Vous pouvez utiliser la fonction wp_trim_excerpt () .
Si vous souhaitez définir une limite de caractères, vous devriez pouvoir utiliser le filtre excerpt_length .
<?php echo wp_trim_excerpt( get_the_title() ); ?>
Solution API Wordpress
Si vous voulez couper uniquement l'anglais ou une langue de caractère, utilisez substring
serait la bonne solution. Cependant, si vous voulez couper une langue comme Chinese , Japanese ou les autres, utiliser une sous-chaîne peut être terrible, car ils utilisent unicode pour représenter.
Utiliser wp_trim_words () serait un moyen simple et direct de résoudre votre problème.
wp_trim_words( $text, $num_words = 55, $more = null );
p.s. inspiré par Leo Caseiro.
Solution CSS uniquement
Si vous voulez savoir comment couper les mots de manière dynamique, en particulier dans le design réactif, utilisez CSS comme ceci:
.card-title {
text-overflow: Ellipsis;
white-space: nowrap;
overflow: hidden;
}