是否可以使用arraywalk()将术语附加到帖子数组中?

时间:2019-01-11 作者:Dan

我正在创建一个由动物组成的砖石柱网。我计划通过切换类来过滤可见的帖子。这些课程将依次成为邮报的。

我使用的是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;

1 个回复
最合适的回答,由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.

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果