Foreach循环内的if/ellif in_array仅显示一个POST的问题

时间:2020-08-10 作者:imagIne

如果某个类别的帖子对应一个类别,我会尝试为每个帖子指定一个特定的背景色。我的函数可以工作,但仅限于在结果中显示一篇文章。如果我删除此功能,将显示所有帖子。

更多信息:

在我的页面上,我有按类别筛选帖子的按钮。如果单击一次,我将显示该类别的所有帖子。但每个帖子都包含几个类别。我选择了一些类别来为每个帖子设置背景色,但这些类别与过滤器按钮不同。

Wordpress显示此错误;您的站点出现严重错误,请了解有关调试WordPress的详细信息"E;在显示第一个帖子之后。

以下是我的全部代码:

<?php

add_action(\'wp_ajax_nopriv_filter\', \'filter_ajax\');
add_action(\'wp_ajax_filter\',\'filter_ajax\');

function filter_ajax(){

$category = $_POST[\'category\'];

$argsf = array(
    \'post_type\' => \'post\',
    \'posts_per_page\' => -1,
    \'order\' => \'ASC\'
);

if(isset($category)){
    $argsf[\'category__in\'] = array($category);
}

$postsf = get_posts($argsf);    

if (!empty($postsf)) {
    foreach ($postsf as $post) {
        
        $link_post = get_permalink( $post->ID );
        $image_post = get_the_post_thumbnail_url( $post->ID, $size = \'large\' );
        $item1 = get_post_meta($post->ID, \'item1\', true);
        $item2 = get_post_meta($post->ID, \'item2\', true);
        $item3 = get_post_meta($post->ID, \'item3\', true);
        $item4 = get_post_meta($post->ID, \'item4\', true);
        $title = get_the_title($post->ID); 
        $post_slug = $post->post_name;
        $cats_post = wp_get_post_categories( $post->ID );
        
        function test($cats_post){
            if (in_array("14", $cats_post)){ echo\'#710000\';}
            elseif(in_array("5", $cats_post)){ echo\'#0a005d\';}
            elseif(in_array("16", $cats_post)){ echo\'#65a0e8\';}
            elseif(in_array("13", $cats_post)){ echo\'#90744b\';}
        }
    
?>  
<div class="shop w-24 pb-1" style="height:320px; min-width:320px;">
    <div class="w-100 h-100 p-2">
            
        <div class=" " style="background-color:<?php test($cats_post); ?>">
            <div class="">
                <!--<div class="" title="Locer">
                <a href="<?= $item2; ?>"><i class="icofont-opposite "></i></a>
                </div>-->
                <div class="" title="something">
                    <a href="tel:<?= $item3; ?>"><i class="im im-phone"></i> </a>
                </div>
                <div class="">
                    <span><?= $item1; ?></span>
                </div> 
            </div>
            <span class="text-uppercase col-white tsh332 fwlr text-center" style="font-size:2rem;">
                <?= $title; ?>
            </span>
            <?php if ( metadata_exists( \'post\', $post->ID , \'item4\' ) ){ ?> 
                <div class="">
                    <div class="b-yellow b-100">
                        <span><?= $item4; ?> </span>
                    </div>
                </div>
            <?php } ?>
        </div>
                
    </div>
</div>
<?php  }  /* fin foreach */
    }  /* fin if  */
wp_reset_postdata();
die();
}

?>
我试过了,但没用:

获取\\u类别而不是wp\\u get\\u post\\u类别我不知道是否必须使用其他foreach循环以及如何使用!

谢谢

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这里有几个致命的假设,还有一个更好的方法。

1。在函数中声明函数这将在PHP的未来版本中导致致命错误,使调试变得非常困难。但最糟糕的是,这完全没有必要。

这是:


function foo () { 
    function bar () {
        //
    }
    bar();
}
应该是这样的:

function bar() {
    //
}
function foo() {
    bar();
}

2。比较字符串和数字in_array

1 不是"1", 但由于第三个参数从未设置为true,1"1". 它也是true, 还有很多其他的”;“真实的”;价值观

3。依靠硬编码的魔法值,不要硬编码类别ID。如果您意外删除它并重新创建它,ID将更改。如果迁移到新站点,ID将更改。它很容易折断。

如果您不能让用户选择一个术语,至少使用一个已知的slug/名称,以便可以重新创建/设置它。

4。假设函数将返回类别ID

wp_get_post_categories 不返回类别ID或类别名称。它返回术语对象。这些对象包含名称、描述、ID等。我希望您的代码生成PHP警告。

5。硬编码内联样式

不应使用内联样式。使用HTML类

正确的方法使用post_class 要打印posts html类,请执行以下操作:

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
这为您提供了可以使用CSS针对帖子类型、标记、类别、ID等的类。它会自动执行此操作,因此您无需告诉它添加类。

以下是我自己网站上的一个示例:

<article id="post-931" class="post-931 post type-post status-publish format-standard has-post-thumbnail hentry category-development category-gutenberg tag-block-editor tag-comments tag-gutenberg tag-javascript tag-plugins tag-react tag-releases tag-wordpress">
post_class 自动为我生成这些HTML类,如果我将该帖子添加到名为test, 然后category-test 也将作为HTML类出现在前端。

因此,现在您可以使用CSS文件定位类别中的所有帖子,从而获得更好的样式、更小的HTML和更易于理解的代码,例如。

.category-development { 
    background: red;
}
现在我在development 类别具有红色背景。

别忘了body_class 功能也一样。它为使用的模板、存档等添加HTML类

最后一点,不要在?>. 这是没有必要的,而且在关闭旧PHP版本上的标记破坏站点后,它实际上可能会导致一个容易错过的错误。

相关推荐

如果(!$loop->Have_Posts())条件不起作用-WP_QUERY

所以我几乎可以肯定的是,我让它工作得很好,然后不知从哪里出来,它似乎没有工作。我到处修补,让它把一切都隐藏起来,然后什么也不隐藏。想知道是否有人发现我做错了什么?下面的代码基本上可以扫描我的所有产品-simple & variable - 看看是否有IN STOCK 产品有sale 它们的价格。如果没有IN STOCK 具有的产品sale 价格,隐藏某个CSS ID。否则,什么也不做。不知道我错过了什么。。。// -----------------------------------------&