Wordpress - 如何使 URL 返回具有自定义内容类型的动态 JSON?

Posted

技术标签:

【中文标题】Wordpress - 如何使 URL 返回具有自定义内容类型的动态 JSON?【英文标题】:Wordpress - How does one make a URL return dynamic JSON with custom Content Type? 【发布时间】:2019-11-05 18:21:40 【问题描述】:

先了解一些背景知识,我正在尝试按照此处的说明进行操作:

https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW1

获取适用于我的 ios 设备网站的通用链接。我的 wordpress 站点处于共享托管环境中,因此我无权访问服务器或任何根文件。我将文件放在我网站的根目录(httpdocs),当我导航到该页面时,它没有加载。在谷歌搜索中,我发现了一个 *** 帖子,指出您必须配置服务器以让它知道以“application/pkcs7-mime”的内容类型提供该文件(使用 wordpress 配置 apple-app-site-association 文件) .如前所述,我无权访问它。

我有一个子域,它是一个我非常熟悉的 microsoft web api 项目。我为“apple-app-site-association”创建了一个端点,并在代码中动态构建了 json 响应并设置了内容类型并返回了它。这最终奏效了,Apple 检测到它和一切。这很有趣,因为我不需要服务器上的文件,因为我是动态生成的,而且我不需要更改任何服务器方面的内容。

但问题是我需要将主站点域作为通用链接,而不是 Windows 子域。主站点是wordpress。我在想是否可以在 wordpress 中做同样的事情,我导航到 mydomain.com/apple-app-site-association 并即时生成 json 和 content-type 并提供它。

我从来没有用 wordpress 做任何编码,甚至不知道从哪里开始。

如果可能的话,我想明确以下方向:

使 mydomain.com/apple-app-site-association 指向提供 json 的自定义函数或页面。 拥有使 json 动态提供的代码。 具有将响应的内容类型设置为“application/pkcs7-mime”的代码。 当然,如果有人知道如何在没有这种方法的情况下解决共享服务器无法提供的文件,我也对此持开放态度。据我所知,这可能是假设可以做到这一点的唯一方法。

【问题讨论】:

creating a custom REST API endpoint 怎么样? (那里有易于遵循的指南/示例)但我很好奇,您是否希望 URL 返回 JSON 编码的字符串,但是 Content-Typeapplication/pkcs7-mime 但是,如果您不需要/使用任何 WordPress 函数,如 get_posts(),那么您可以将 URL 重写为生成并提供动态内容的 php 文件。 @SallyCJ 我读到的关于创建自定义端点的所有内容都表明,总是需要一个命名空间,它出现在 wp-json 之后,所以我的域/wp-json/custom-namespace/customendpoint。我需要 mydomain.com/apple-app-site-association。对于您的第一条评论,是的,它将是一个 JSON 编码的字符串,其内容类型是 pkcs7-mime 的。苹果不会检测到应用程序/json。您的第二条评论听起来可能更容易,如果我有一个指向动态 php 文件甚至静态文件的 URL,并且可以更改它应该工作的内容类型。我该怎么办? @mickmackusa 为什么要等到赏金结束?为什么不现在做呢?我相信它是具体的,我怎样才能让 Apple apple-app-site-association URL 在共享的 Wordpress 环境中工作?谷歌搜索时你会发现没有可用的答案。 【参考方案1】:

注意:我假设 WordPress 安装在根文件夹中。

因此,如果您希望 http://example.com/apple-app-site-association 提供像 this 这样的 JSON 内容并将内容类型(Content-Type 标头)设置为 application/pkcs7-mime,您可以选择以下选项:

动态内容

因为您使用的是 WordPress,所以这可能比手动编辑 .htaccess 文件更适合您。

您可以使用parse_request 挂钩;这样,您不需要任何自定义 (WordPress) 重写规则,不需要自定义 Page(帖子类型为 page),也不需要创建任何 JSON 文件。

并确保根文件夹中没有名为 apple-app-site-association 的文件,或者 WordPress 页面中没有包含 apple-app-site-association 的 slug。

所以这将进入您的主题函数文件(例如wp-content/themes/your-theme/functions.php):

<?php
add_action( 'parse_request', 'serve_apple_app_site_association', 0 );
function serve_apple_app_site_association( $wp ) 
    // Check if the request is /apple-app-site-association
    if ( 'apple-app-site-association' !== $wp->request ) 
        return;
    

    // Array version of the JSON data.
    $data = array(
        'applinks'    => array(
            'apps'    => array(),
            'details' => array(
                array(
                    'appID' => '9JA89QQLNQ.com.apple.wwdc',
                    'paths' => array(
                        '/wwdc/news/',
                        '/videos/wwdc/2015/*',
                    ),
                ),
                array(
                    'appID' => 'ABCD1234.com.apple.wwdc',
                    'paths' => array(
                        '*',
                    ),
                ),
            ),
        ),
    );

    // Send headers.
    status_header( 200 );
    nocache_headers();
    header( 'Content-Type: application/pkcs7-mime' );

    // And serve the JSON data.
    echo wp_json_encode( $data );
    exit;

静态内容

    将 JSON 数据放入名为 apple-app-site-association(即无扩展名)的文件中,并将文件保存在可以看到 wp-config.php.htaccess 文件的根文件夹中。

    李>

    将此添加到您的 .htaccess 文件中:

<Files apple-app-site-association>
        Header set Content-Type application/pkcs7-mime
</Files>

如果 &lt;Files&gt; 和/或 Header 不/不适合您,那么您可以只使用上面的第一个选项,但使用类似 readfile() 的东西来读取静态文件.

或者(特别是如果 URL 重写在您的站点上不可用/不支持),您可以在根文件夹中创建一个名为 apple-app-site-association 的文件夹,并将 index.php 添加到该文件夹​​和该文件中:

<?php
header( 'Content-Type: application/pkcs7-mime' );
// Read the static file or just generate a dynamic content.
@readfile( __DIR__ . '/apple-app-site-association.json' );
exit;

【讨论】:

我删除了我之前的评论,因为事实证明,由于我的根目录已经有一个同名的静态文件,所以它不起作用。我无法让静态方法在 web.config 文件中工作,因为这是一个 Windows 服务器。尽管现在我删除了静态文件并且苹果等检测到了所有内容,但动态方法确实可以完美运行。非常感谢!对于阅读本文的任何人,虽然我没有使用静态方法,但该方法似乎很合理,因此某些人这样做可能更容易。如果您正在使用动态方式,请确保静态文件不存在。 我已经修改了答案 - 感谢您注意到 Content-Type 错字!还有文件冲突。 :) 只想说这是我见过的最有用的堆栈溢出答案之一。网络上关于这个话题的信息非常少,这个答案清晰透彻。 @9gt53wS 非常感谢您的支持,很高兴回答对您有所帮助。 :) 感谢您的详细解答!很有帮助!就我而言,我必须将 application/pkcs7-mime 更改为 application/json 才能使其工作:)

以上是关于Wordpress - 如何使 URL 返回具有自定义内容类型的动态 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复此 WordPress 功能使其不返回 404 页面?

如何将 Wordpress 注销重定向到自定义 URL

如何在使用 wordpress 以自定义表单提交之前获取图像 url 并发送邮件?

Wordpress 子菜单链接到页面的一部分

谁在 wordpress 中自定义媒体 URL?

具有多个 postmeta 左连接的 Wordpress 自定义 SQL 查询