设置最大标题长度-类似于Single.php外部的摘录长度

时间:2011-10-02 作者:japanworm

我一直在搜索一段代码片段,该代码片段允许我限制标题长度,类似于您可以使用\\u摘录来限制标题长度,然后只显示“(…)”如果标题太长。我想在单曲外的循环中使用它。例如,在我的侧边栏中,过长的标题会损害布局。

我只能找到这个代码片段,但这显然不是我想要的。

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\');
有可能吗?

我正在寻找类似的内容,只是不是摘录,而是标题:

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

3 个回复
最合适的回答,由SO网友:EAMann 整理而成

这完全取决于你如何获得冠军。如果您使用的是全局对象(即。$post->post_title 然后,您不需要通过任何过滤器,您必须使用一些奇特的后处理来缩减标题。

但是,如果您在post循环中,请使用the_title() 回应当前帖子的标题或get_the_title() 以编程方式返回。

如果您使用这两个功能中的一个,WordPress会自动将文章标题通过过滤器传递,然后再将其返回给您。

然后,您可以将以下内容添加到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 );
现在,每次你提到the_title()get_the_title() 在侧边栏中,他们将返回自动缩短的版本,而不是完整版本。

只需记住在sidebar.php 文件,否则它也将应用于主题的其他地方:

remove_filter( \'the_title\', \'japanworm_shorten_title\' );
如果您想要一个可以在任何地方使用的功能,我建议您制作自己的版本get_the_title()the_title() 并在代码中使用它们。例如:

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;
}
这些是从原件中复制的the_title()get_the_title() 函数,因此它们应该以相同的方式在循环中工作。不过,我还没有测试过这个。

SO网友:Leo Caseiro

您可以使用wp_trim_excerpt() 作用

如果需要指定字符限制,则应该能够使用excerpt_length 滤器

<?php echo wp_trim_excerpt( get_the_title() ); ?>

SO网友:PlusA

Wordpress API Solution

如果要修剪纯英语或纯字符语言,请使用substring 这是正确的方式。但是,如果您想修剪语言,如Chinese, Japanese 或者其他人,使用子字符串可能很糟糕,因为他们使用unicode来表示。

使用wp_trim_words() 将是解决您问题的简单而直接的方法。

wp_trim_words( $text, $num_words = 55, $more = null );
p.s.灵感来自Leo Caseiro。

CSS Only Solution

如果您想了解如何动态剪裁单词,尤其是在响应式设计中,您应该像这样使用CSS:

.card-title {
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}

结束

相关推荐

自定义帖子类型:将POST_TITLE设置为自定义帖子类型字段

我为一家公司的员工创建了一个自定义帖子类型,其中包含一些他们必须填写的字段(如电子邮件、电话等)和一个选择框,该框从另一个名为“公司”的自定义帖子类型中获取一些值。我已经禁用/删除了员工职位类型的编辑器,但现在我很难在概述中列出它们,因为每个“员工”都缺少一个标题(post\\u title)。如何将员工的post\\u title设置为与自定义字段“Name”相等?有很多代码在工作,所以我只显示我为每个员工保存数据的部分:foreach ($meta_box[\'fields\'] as $field)