我如何减少这个特定代码块中的if和Else if的数量?

时间:2015-12-06 作者:Tom Devaney

我的循环中有一些代码将确定自定义分类法中的术语,如果它是特定的术语,它将输出特定的图像。

<?php if( has_term(\'10\', \'review-score\' ) ) { ?>
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
<img src="<?php echo get_stylesheet_directory_uri(); ?>
/images/review-scores-thumbs/10.jpeg" /> </a>
它的工作方式正是我所希望的,但在它之后,我有一个else if for如果这个词是9.5,9,8.5。。。还有很多其他的ifs,我不确定这对我的网站速度有什么好处。为了解决这个问题,我正在考虑获取当前帖子的术语(我正在自定义归档页面循环中执行此操作),然后执行类似操作。

<?php $term = get_term($post->ID, \'review\'score\'); ?>
<img src="<?php echo get_stylesheet_directory_uri(); ?>
/images/review-scores-thumbs/$term.jpeg" /> </a>
考虑到我的JPEG文件都是这样命名的,这将起作用,但我有两个问题。get\\u术语很奇怪。我以为它只会返回一个学期,但当我这样做的时候。

<?php $term = get_term($post->ID, \'review-score\'); ?>
<?php if ($term = \'10\') { ?>
It worked
<?php } ?>
它显示它在任何地方都有效,即使特定事物的术语是9或8。

那么除此之外,我似乎不能

<?php $term = get_term($post->ID, \'review-score\'); ?>
<img src="<?php echo get_stylesheet_directory_uri(); ?>
/images/review-scores-thumbs/$term.jpeg" /> </a>
因为$术语在引号中。

那么,我所做的是可能的吗?它是否值得(即,如果使用所有其他的If那么糟糕的话)?get\\u term是如何工作的?

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

你做错了

  • get_term() 是用于将术语附加到帖子的错误函数。get_term() 用于从db中获取给定术语ID的术语对象。第一个参数接受术语ID,而不是post ID。要使用get_the_terms() 将条款附在帖子上

    这里确实不需要任何if/else语句,只需根据图像的命名方式将术语ID/slug/name作为图像名称传递即可。为了回答OP中的eact示例,我使用了术语id作为图像名称。根据您的具体需要进行更改。

    正如另一个答案中所述,您需要== 要比较两个值,= 将值赋给另一个或变量

    如您所述has_term() 工作正常,因此我们可以执行以下操作来解决问题:(我编写了一个函数,您可以在functions.phpo中添加该函数,然后在需要时在循环中调用该函数)

    NOTE:

    所有代码都未经测试,可能存在错误。请确保在调试设置为true的测试安装上测试它。代码还需要至少PHP 5.4

    function get_term_related_image( $taxonomy = \'category\' )
    {
        // Invoke the global $post object
        global $post;
    
        // Check if we have a taxonomy and if it is valid, else return false
        if ( !$taxonomy )
            return false;    
    
        if ( $taxonomy !== \'category\' )
            $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
    
        // Get the terms assigned to the post
        $terms = get_the_terms( $post->ID, $taxonomy );
    
        // Make sure we actually have terms, if not, return false
        if (    !$terms
             || is_wp_error( $terms )
        )
            return false;
    
        // Get the first term from the array of terms
        $term = $terms[0];
    
        // Get the image
        $image = get_stylesheet_directory_uri() . \'/images/review-scores-thumbs/\' . $term->term_id . \'.jpeg\';
    
        // Check if we actually have an image before returning it
        if ( !getimagesize( $image ) ) 
           return false;
    
        // We have made it, YEAH!!!, return the image
        $permalink  = get_the_permalink( $post );
        $title_attr = the_title_attribute( [\'echo\' => false, \'post\' => $post] );
    
        return \'<a href="\' . $permalink . \'" title="\' . $title_attr . \'"><img src="\' . $image . \'"/></a>\';
    }
    
    Inside 在循环中,可以按如下方式调用函数:(如果不使用内置分类法,请记住将分类法名称作为第一个参数传递category

    echo get_term_related_image( \'review-score\' );
    
    编辑:代码现在已测试并按预期工作

SO网友:Tom J Nowell

首先,我们来了解一下实际评分,get_term 需要一个术语ID,我们没有,所以让我们使用wp_get_object_terms 相反

$terms = wp_get_object_terms($post->ID, \'review-score\' );
到目前为止,代码假设只有一个术语,这很糟糕。但是,为了得到这个答案,让我们使用这个假设,并说我们只处理第一个术语:

if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
    $term = $terms[0];
$terms 是一个术语对象列表,因此让我们确保该列表不是空的,并且不是错误。如果是的话,那么我们就不要放弃,做点别的。

在这里$term 是表示WP_Term 对象,您使用slug来保存审核分数,因此您需要:

    $term->slug
您可以使用WordPress Codex和官方开发者中心来查找此信息。

在PHP中输出术语

仅在html中声明变量名称是不够的,您必须将其回显出来,因此这将不起作用:

<span>The term is: $term->slug </span>
您没有打开任何PHP标记,因此没有执行任何PHP,并且您没有像下面这样放置echo语句来对其进行回显:

<span>The term is: <?php echo $term->slug; ?> </span>
有了这些信息,您应该能够更正最终的代码块,以执行您想要的操作。

其他错误

<?php if ($var = \'10\') { ?>
这是你的作业。代码的内容是“使$term等于then,然后使其10位起作用”,所以它总是正确的。相反,使用== 这意味着等效,或=== 这意味着完全等于。

相反,我建议交换顺序:

<?php if ( \'10\' == $var ) {
如果您意外键入= 而不是== 它将生成一个PHP错误,而不是导致一个隐藏的逻辑错误,问题将立即显现出来

相关推荐

echo a tax term in loop

对于列表中的每个项目,我需要在之后在此循环中回显CPT的一个术语。感谢您的指导或帮助。原始代码来自Stackoverflow。com,因为它起作用了。 <?php $da_place = get_field(\'smart_place\'); //acf field $args = array( \'post_type\' => \'to_do_items\', \'tax_query\' => array