wordpress 如果ACF返回格式是Post Object,则应用与WP JSON相同的post格式?

f0brbegy  于 2023-04-29  发布在  WordPress
关注(0)|答案(1)|浏览(139)

我已经为实现“相关文章”功能奋斗了几天,不幸的是PHP/WordPress不是我的强项。
目前,我在我的前端上击中了这个端点:

posts?slug=${slug}&orderby=date&order=desc&categories=4&acf_format=standard

这将返回主Post对象,其中包含我所期望的内容,例如slug、status、sticky等。在这个对象中是acf对象,在这里我可以看到我的related_posts数组。我的问题来自于这样一个事实,即这些Post对象是用完全不同的字段表示的,大多数前缀是单词“post_”。
我在acf-to-rest-api插件上发现了this Github issue,它和我面临的问题几乎一样(我甚至偷了他们的问题标题!),然而到目前为止还无法实现它,而且它也是从2017年开始的,所以我不确定什么是过时的。
有办法返回正常的WP Post JSON格式吗?

sd2nnvve

sd2nnvve1#

一种可能的方法是使用add_filter() function添加filter to your Wordpress's theme function.php
在您的示例中,您可以检查ACF响应中是否存在related_posts字段。
如果是,过滤器会将related_posts数组Map到相应的WP Post JSON格式,并替换响应中的原始related_posts字段。
确保调整字段名称和附加字段(例如例如,yoast_head,如果您使用的是Yoast SEO plugin)根据您的设置。
您可能还需要flush WordPress caching plugins来测试该过滤器。

function modify_acf_to_rest_api_response($response, $request) {
    if (isset($response->data['acf']['related_posts'])) {
        $related_posts = $response->data['acf']['related_posts'];

        // Map related_posts to their WP Post JSON format
        $related_posts_json = array_map(function ($related_post) {
            $post_data = get_post($related_post->ID);
            $post_json = array(
                'id' => $post_data->ID,
                'date' => $post_data->post_date,
                'date_gmt' => $post_data->post_date_gmt,
                'guid' => $post_data->guid,
                'modified' => $post_data->post_modified,
                'modified_gmt' => $post_data->post_modified_gmt,
                'slug' => $post_data->post_name,
                'status' => $post_data->post_status,
                'type' => $post_data->post_type,
                'link' => get_permalink($post_data->ID),
                'title' => array(
                    'rendered' => $post_data->post_title
                ),
                'content' => array(
                    'rendered' => apply_filters('the_content', $post_data->post_content),
                    'protected' => false
                ),
                'excerpt' => array(
                    'rendered' => apply_filters('the_excerpt', $post_data->post_excerpt),
                    'protected' => false
                ),
                'author' => (int) $post_data->post_author,
                'featured_media' => (int) get_post_thumbnail_id($post_data->ID),
                'comment_status' => $post_data->comment_status,
                'ping_status' => $post_data->ping_status,
                'sticky' => false,
                'template' => '',
                'format' => get_post_format($post_data->ID),
                'meta' => array(),
                'categories' => wp_get_post_categories($post_data->ID),
                'tags' => wp_get_post_tags($post_data->ID),
                'yoast_head' => '', // If using Yoast SEO plugin
                '_links' => array()
            );

            return $post_json;
        }, $related_posts);

        // Replace the related_posts with the WP Post JSON format
        $response->data['acf']['related_posts'] = $related_posts_json;
    }

    return $response;
}

add_filter('rest_prepare_post', 'modify_acf_to_rest_api_response', 10, 2);

OP J. Jackson在评论中补充道:
我在ACF中使用标签选择,而不是WordPress的标签。
我该如何使用这些填充标签数组?
这意味着您需要使用ACF标记填充Tags数组,方法是获取ACF标记字段值并将其包含在$post_json数组的tags键中。
我假设标签的ACF字段名是custom_tags,但如果不同,请将' custom_tags '替换为ACF标签字段的实际字段名。

function modify_acf_to_rest_api_response($response, $request) {
    if (isset($response->data['acf']['related_posts'])) {
        $related_posts = $response->data['acf']['related_posts'];

        // Map related_posts to their WP Post JSON format
        $related_posts_json = array_map(function ($related_post) {
            $post_data = get_post($related_post->ID);
            $custom_tags = get_field('custom_tags', $related_post->ID); // Fetch ACF custom_tags field value

            $post_json = array(
                // ... other fields remain the same
                'tags' => $custom_tags, // Replace this line with the ACF custom_tags field value
                '_links' => array()
            );

            return $post_json;
        }, $related_posts);

        // Replace the related_posts with the WP Post JSON format
        $response->data['acf']['related_posts'] = $related_posts_json;
    }

    return $response;
}

add_filter('rest_prepare_post', 'modify_acf_to_rest_api_response', 10, 2);

相关问题