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

Sol*_*444 5 php api wordpress json url-rewriting

首先是一些背景,我试图按照这里的说明进行操作:

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

获取适用于我的 iOS 设备网站的通用链接。我的 wordpress 站点处于共享托管环境中,因此我无权访问服务器或任何根文件。我将该文件放在我的网站 (httpdocs) 的根目录下,当我导航到该页面时,它不会加载。在谷歌搜索中,我发现了一个 stackoverflow 帖子,指出您必须配置服务器以让它知道提供内容类型为“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”的代码。当然,如果有人知道如何解决在没有这种方法的情况下无法提供共享服务器的文件,我也对此持开放态度。据我所知,这可能是假设可以做到的唯一方法。

Sal*_* CJ 9

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

所以,如果你想http://example.com/apple-app-site-association以服务JSON内容像这样和有内容类型(Content-Type头)设置为application/pkcs7-mime,这里有一些你可以选择的选项:

动态内容

由于您使用的是 WordPress,这对您来说可能比手动编辑.htaccess文件更好。

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

并确保apple-app-site-association根文件夹中没有命名的文件,或具有 slug 的 WordPress 页面apple-app-site-association

所以这将进入您的主题功能文件(例如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;
}
Run Code Online (Sandbox Code Playgroud)

静态内容

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

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

<Files apple-app-site-association>
        Header set Content-Type application/pkcs7-mime
</Files>
Run Code Online (Sandbox Code Playgroud)

如果<Files>和/或Header不/不适合您,那么您可以只使用上面的第一个选项,但使用类似readfile()读取静态文件的方法。

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

<Files apple-app-site-association>
        Header set Content-Type application/pkcs7-mime
</Files>
Run Code Online (Sandbox Code Playgroud)

  • 只是想说这是我见过的最有帮助的堆栈溢出答案之一。网上关于这个话题的信息很少,这个答案是清晰而彻底的。 (3认同)