web-dev-qa-db-fra.com

Définir la longueur maximale du titre - similaire à la longueur de l'extrait pour l'extérieur de single.php

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;
    }
1
japanworm

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' );

Mise à jour 10/3/2011

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.

2
EAMann

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() ); ?>
0
Leo Caseiro

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;
}
0
PlusA