当前位置: 首页 > 知识库问答 >
问题:

无法显示来自Wordpress REST API自定义endpoint的自定义字段

隆飞驰
2023-03-14

我使用Wordpress Rest API将内容从WordPres斯网站导入到PHP应用程序中。这并不复杂,只是一个包含帖子列表和个人帖子页面的主页。

我在API响应中添加了一些字段,特别是获取帖子中插入的第一张图片的url的字段。

这是该部分的代码:

add_action('rest_api_init', function () {
    register_rest_field('post', 'post_images', array(
        'get_callback'    => 'get_first_image',
        'update_callback' => null,
        'schema'          => null
    ));
});

function get_first_image($obj, $name, $request)
{
    $images = get_attached_media('image', $obj['id']);
    $imagesArray = (array) $images;
    reset($imagesArray);
    $firstImageId = current($imagesArray)->ID;
    $imageSrc = wp_get_attachment_image_url($firstImageId);
    return $imageSrc;
}

当我在主页中列出帖子时,它可以正常工作,但在单个帖子页面中,字段为空。对此,我唯一能给出的解释是,我有一个用于单个帖子的自定义endpoint:

function post_by_slug(WP_REST_Request $request)
{
    $postSlug = $request->get_param('post_slug');
    $lang     = $request->get_param('my_lang');
    $myPost   = get_page_by_path($postSlug, OBJECT, 'post');
    $targetPostId   = apply_filters('wpml_object_id', $myPost->ID, 'post',
        false, $lang);
    $targetPost     = get_post($targetPostId);
    $postController = new \WP_REST_Posts_Controller($targetPost->post_type);
    $response       = $postController->prepare_item_for_response($targetPost,
        $request);

    return rest_ensure_response($response);
}

add_action('rest_api_init', function () {
    register_rest_route('pc/v1',
        "/post-slug/(?P<post_slug>\S+)/(?P<my_lang>\w+)", [
            'methods'  => 'GET',
            'callback' => 'post_by_slug',
            'args'     => [
                'post_slug' => 'required',
                'my_lang'   => 'required'
            ]
        ]);
});

在我的应用程序中,我这样称呼它:

$client = new Client([
    'base_uri' => 'http://example.com/wp-json/pc/v1/',
    'headers' => [
        'Content-Type' => 'application/json',
        "Accept" => "application/json",
    ],
    'verify' => false,
]);

var_dump(json_decode($client->get("post-slug/$slug/$lang")
                             ->getBody()->getContents()));

奇怪的是,直接从浏览器访问同一个endpoint,我可以正确地看到所有字段。我是不是错过了什么?

共有1个答案

米裕
2023-03-14

只是回答我自己的问题,因为我已经找到了导致endpoint在我的浏览器中正常工作的原因,但在通过Guzzle访问时却没有。

问题是我是以管理员身份登录的,所以我用来管理网站上多种语言的WPML插件设置了这个cookie:

wp-wpml_current_admin_language_d41d8cd98f00b204e9800998ecf8427e:"de"

所以问题与这个插件有关,我实际上在post_by_slug函数中使用了这个插件。不知何故,像我在这里所做的那样指定语言是不够的,或者只是服务于不同的目的,不确定:

$targetPostId   = apply_filters('wpml_object_id', $myPost->ID, 'post', false, $lang);

我可以找到两种解决方案:

1)使用pluginswitch_lang()方法显式设置语言:

function post_by_slug(WP_REST_Request $request) {
  global $sitepress;
  $postSlug = $request->get_param('post_slug');
  $lang = $request->get_param('my_lang');
  $sitepress->switch_lang($lang);

2)更改guzzle GET请求以将语言作为查询参数传递,这似乎会自动与插件一起使用:

$response = $client->get("post-slug/$slug", ['query' => ['lang' => $lang]])->getBody()->getContents();

我意识到这是一个非常具体的问题,但也许对其他人会有帮助。

 类似资料:
  • 在Wordpress中,我创建了一个名为“Sports”的自定义帖子类型,其分类法为“sport_locations”。使用高级自定义字段(ACF)插件,我创建了用于显示分类术语的字段。我把一切都准备好了,但是我在输出上传的图像时遇到了问题。 在ACF中,我可以选择图像的返回值为:对象,url或ID。现在我已将其设置为对象。 下面是我到目前为止的代码。我正在single-sports.php中编写

  • 我正在尝试prestashop 1.7,但在创建自定义模块时遇到了一个问题。我在“modules”文件夹中创建了一个文件夹“mymodule”,正如文档中所示,我创建了一个简单的mymodule。其中的php文件: 然后我进入“模块”下的管理页面- 我犯了什么错误? 谢谢 泽维尔

  • 我是新来的wordpress, im创建一个自定义职位与字段的custom_meta_box(位置,着装) 所以在我的自定义帖子列表中,我想查看我在custom_meta_box上创造的价值。 这是我目前的代码:

  • 在keycloak中实现自定义restendpoint时,我使用了以下示例:

  • 介绍 model 参考文档已经介绍了如何使用 Django 的标准字段类;例如 CharField, DateField,等等。对于很多应用来说,这些类足够用了。 但是在某些情况下, 你所用的Django 不具备你需要的某些精巧功能,或是你想使用的字段与 Django 自带字段完全不同。 Django 内置的字段类型并不能覆盖所有可能遇到的数据库的列类型,仅仅是些普通的字段类型,例如VARCHAR