我正在创建一个由动物组成的砖石柱网。我计划通过切换类来过滤可见的帖子。这些课程将依次成为邮报的。
我使用的是MVC主题,希望在控制器中获取所有数据,而不必在主题循环中进行多次查询。
我在想这样的事情:
<?php
namespace App\\Controllers;
use Sober\\Controller\\Controller;
class PageOurAnimals extends Controller
{
protected $acf = true;
public function animals() {
$args = [
\'posts_per_page\' => -1,
\'post_type\' => \'portfolio\',
\'post_status\' => \'publish\',
\'order_by\' => \'date\',
\'order\' => \'DESC\',
];
return array_map(function($post) {
$post->terms = [];
// Maps terms to posts (doesn\'t work)
array_map(function($term) {
if (isset($term)) {
array_push($post->terms, $term->slug);
}
}, wp_get_post_terms($post->ID, \'category\'));
}, get_posts($args));
}
}
。
{-- Blade Template --}
@foreach($animals as $i => $animal)
<div class="cell {{ implode(\' \', $animal->terms }}">
<div class="animal animated rollin">
<figure class="zoom zoom__container animal__figure">
{!!
get_the_post_thumbnail($animal->ID, \'medium\', [
\'title\' => $animal->post_title,
\'class\' => \'zoom__image\'
])
!!}
<div class="animal__overlay"></div>
</figure>
<div class="animal__caption">
<span class="animal__name">
{{ $animal->post_title }}
</span>
</div>
</div>
</div>
@endforeach
Edit: 我查阅了文档,发现array\\u map没有修改原始数组,实际上我想要的是
array_walk()
.
我已经将代码更新为下面的内容,但它仍然返回一个空数组。
$posts = get_posts($args);
array_walk($posts, function(&$post, $index) {
$terms = wp_get_post_terms($post->ID, \'category\');
if (isset($terms)) {
$post->terms = [];
array_walk($terms, function(&$term, $term_index) {
// die(print_r($term));
if (isset($term->slug)) {
array_push($post->terms, $term->slug);
}
});
}
});
return $posts;
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成
我想这里的变量作用域有问题。
array_walk($terms, function(&$term, $term_index) {
// die(print_r($term));
if (isset($term->slug)) {
array_push($post->terms, $term->slug);
}
});
在代码的这一部分中,您使用匿名函数,并在其中使用
$post
变量但它是一个不同于前几行的变量-您现在处于不同的函数中。
但您可以大大简化代码:
$posts = get_posts($args);
array_walk($posts, function(&$post, $index) {
$terms = wp_get_post_terms($post->ID, \'category\');
if ( ! empty($terms) && ! is_wp_error($terms) ) {
$post->terms = [];
foreach ($terms as $term) {
$post->terms[] = $term->slug;
}
}
});
return $posts;
更简单的是,如果你知道一些“神奇”的WP函数,比如
wp_list_pluck
$posts = get_posts($args);
array_walk($posts, function(&$post, $index) {
$terms = wp_get_post_terms($post->ID, \'category\');
$post->terms = []; // Prevents error on blade template\'s implode()
if ( ! empty($terms) && ! is_wp_error($terms) ) {
$post->terms = wp_list_pluck( $terms, \'slug\' );
}
});
return $posts;
另外,您的$参数中也有一些错误。
$args = [
\'posts_per_page\' => -1,
\'post_type\' => \'portfolio\',
\'post_status\' => \'publish\',
\'order_by\' => \'date\',
\'order\' => \'DESC\',
];
应该是这样的
orderby
而不是
oder_by
.