限制分类术语的显示数量

时间:2016-09-04 作者:Mostafa AHmadi

我有2个分类集product_cattvshows_cat.

每一个都有12个术语。一个产品可能会应用1个或12个术语。

我使用此代码在产品页面中显示术语列表:

$cats = get_the_term_list($post->ID, \'product_cat\', \'\', \'  \', \'\'); 
$tvcats = get_the_term_list($post->ID, \'tvshows_cat\', \'\', \'  \', \'\'); 

if (!empty($cats)){
    echo strip_tags($cats, \'   \');
}elseif(!empty($tvcats)){
    echo strip_tags($tvcats, \'    \');
}
结果是:

动作、戏剧、冒险、传记、动画

问题是它没有足够的空间来显示所有的术语。

我需要将术语的数量限制为2个术语。

问题

如何将应用的术语数量限制为两个?

2 个回复
最合适的回答,由SO网友:Mostafa AHmadi 整理而成

Instead using get_the_term_list() function, you should use get_the_terms() which will give you directly an array of terms (asget_the_term_list() 正在使用get_the_terms() 如果您查看该函数的源代码,请参阅她自己的代码)

然后你可以建立一个custom function 要得到你想要的(我会的not use implode() functionany other one php函数,因为我们只需要2个术语。)

Note: 你不需要strip_tags() 此处的函数

因此,您的代码将是:

// This function goes first
function get_my_terms( $post_id, $taxonomy ){
    $cats = get_the_terms( $post_id, $taxonomy );

    foreach($cats as $cat) $cats_arr[] = $cat->name;

    if ( count($cats_arr) > 1) $cats_str = $cats_arr[0] . \', \' . $cats_arr[1]; // return first 2 terms
    elseif ( count($cats_arr) == 1) $cats_str = $cats_arr[0]; // return one term
    else $cats_str = \'\';

    return $cats_str;
}
此代码将起作用。活动子主题(或主题)的php文件或任何插件文件…

下面是您的代码:

$cats = get_my_terms( $post->ID, \'product_cat\' ); 
$tvcats = get_my_terms( $post->ID, \'tvshows_cat\' ); 

// Displaying 2 categories terms max
echo $cats . $tvcats;
这段代码放在php模板文件中

— update — 或者如果没有函数,您的代码将是:

// Product categories
$cats = get_the_terms( $post->ID, \'product_cat\' );

foreach($cats as $cat) $cats_arr[] = $cat->name;

if ( count($cats_arr) > 1) $cats_str = $cats_arr[0] . \', \' . $cats_arr[1]; // return first 2 terms
elseif ( count($cats_arr) == 1) $cats_str = $cats_arr[0]; // return one term
else $cats_str = \'\';

// TV shows categories
$tvcats = get_the_terms( $post->ID, \'tvshows_cat\' );

foreach($tvcats as $tvcat) $tvcat_arr[] = $tvcat->name;

if ( count($tvcat_arr) > 1) $tvcats_str = $tvcat_arr[0] . \', \' . $tvcat_arr[1]; // return first 2 terms
elseif ( count($tvcat_arr) == 1) $tvcats_str = $tvcat_arr[0]; // return one term
else $tvcats_str = \'\';

// The Display of 2 categories
echo $cats_str . $tvcats_str;
此代码在您的php templates 文件

SO网友:birgire

我们可以使用

// Add filter
add_filter( \'get_the_terms\', \'wpse_limit_terms\' );

// Get terms
$cats   = get_the_term_list($post->ID, \'product_cat\', \'\', \'  \', \'\'); 
$tvcats = get_the_term_list($post->ID, \'tvshows_cat\', \'\', \'  \', \'\'); 

// Remove filter
remove_filter( \'get_the_terms\', \'wpse_limit_terms\' );
其中,我们将过滤器回调定义为:

function wpse_limit_terms( $terms )
{
    // Adjust to your needs
    $length = 2;

    // Slice the terms array
    if( is_array( $terms ) && count( $terms ) > $length )   
        $terms = array_slice( $terms, $offset = 0, $length );

    return $terms;
}
更新:OP似乎只想得到一个以逗号分隔的术语名称列表。

我们也可以执行以下操作:

$taxonomy = \'product_cat\'; // Adjust to your needs
$terms = get_the_terms( get_the_ID(), $taxonomy );
if( is_array( $terms ) && ! empty( $terms ) )
    echo join( \',\', wp_list_pluck( array_slice( $terms, 0, 2 ), \'name\' ) 
我们还可以为此创建一个通用包装器。这里有一个未经测试的建议:

/**
 * Custom wrapper
 *
 * @return string Comma seperated term attribute values
 */
function get_wpse_terms_attribute_csv( $post_id, $taxonomy, $attribute, $length = 0 )
{
    $csv = \'\';

    // Nothing to do for non-attributes 
    if( ! in_array( $attribute, [ \'name\', \'term_id\', \'slug\' ] ) )
        return $csv;

    // Nothing to do if taxonomy doesn\'t exists
    if( ! taxonomy_exists( $taxonomy ) )
        return $csv;

    // Fetch terms
    $terms = get_the_terms( $post_id, $taxonomy );

    // Nothing to do if we don\'t have a non-empty array of terms 
    if( ! is_array( $terms ) || empty( $terms ) )
        return $csv;

    // Slice the array if needed
    if( (int) $length > 0 )
        $terms = array_slice( $terms, 0, (int) $length )

    // Pluck the terms array   
    $terms = wp_list_pluck( $terms, $attribute );

    // Generate a list of comma separated term attribute values 
    $csv = join( \',\', $terms );

    return $csv;   
 ) 
然后我们可以在循环中使用它,如:

echo get_wpse_terms_attribute_csv( 
    $post_id   = get_the_ID(), 
    $taxonomy  = \'product_cat\', 
    $attribute = \'name\', 
    $length    = 2 
);
希望您可以根据自己的需要进一步调整!