如果某个类别的帖子对应一个类别,我会尝试为每个帖子指定一个特定的背景色。我的函数可以工作,但仅限于在结果中显示一篇文章。如果我删除此功能,将显示所有帖子。
更多信息:
在我的页面上,我有按类别筛选帖子的按钮。如果单击一次,我将显示该类别的所有帖子。但每个帖子都包含几个类别。我选择了一些类别来为每个帖子设置背景色,但这些类别与过滤器按钮不同。
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循环以及如何使用!
谢谢
最合适的回答,由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版本上的标记破坏站点后,它实际上可能会导致一个容易错过的错误。