我想在WordPress中创建一个定制的插件并输出JSON。我该怎么做呢?

时间:2015-02-18 作者:envysea

我有一个数组:

 $cats = array(\'Hobbes\', \'Simba\', \'Grumpy Cat\');
我想创建一个名为“的自定义端点”http://example.com/cats“。每当您访问此URL时,让它将数组输出为JSON:

 header(\'Content-Type: application/json\');
 $cats = array(\'Hobbes\', \'Simba\', \'Grumpy Cat\');
 echo json_encode($cats);
理想情况下,可以动态创建这些函数。php。所以创造“/狗”或“/鸟”。

6 个回复
最合适的回答,由SO网友:Ben 整理而成

您可以使用pre_get_posts 按照建议,但只需检查全局$wp 请求url的对象。。像这样:

add_action( \'pre_get_posts\', function ($query ){
    global $wp;

    if ( !is_admin() && $query->is_main_query() ) {
        if ($wp->request == \'cats\'){
            header(\'Content-Type: application/json\');
            $cats = array(\'Hobbes\', \'Simba\', \'Grumpy Cat\');
            echo json_encode($cats);
            exit;
        }
    }
});
(本例中为PHP 5.3+)

Note 1: 这个$query->is_main_query() 测试很重要,因为它将阻止它在后续的WP\\U查询实例上下文中再次运行(例如,如果使用WP\\U查询获取CAT列表,那么最终将得到一个无限嵌套循环)。is_admin() 不是很重要,但这是一个很好的实践。

Note 2: Wordpress似乎在request 所以这对/cats &;/cats/ 同样的方式

Note 3:must exit; 在处理程序中,否则它将继续执行常规wordpress工作流,并可能显示404页面。

SO网友:jphase

这是一种添加重写规则的方法,用于将WP想要呈现的模板(通常是404模板)替换为其他模板。在你的例子中,你只是想用一些JSON数据来结束生命,所以有很多不同的方法来实现这一点。这是一种“按部就班”的方法,可以添加重写规则,而不是自己检查URL。如果有人需要了解如何使用一些编码数据交换模板或模具,那么将在此处发布此内容。

<?php

function cats_rewrite() {
    add_rewrite_rule( \'cats/(.*)/?\', \'index.php?cats=$matches[1]\', \'top\' );
}
add_action( \'init\', \'cats_rewrite\' );

function filter_query_vars( $query_vars ) {
    $query_vars[] = \'cats\';

    return $query_vars;
}
add_filter( \'query_vars\', \'filter_query_vars\' );

function my_template_include( $template ) {
    global $wp_query;

    // You could normally swap out the template WP wants to use here, but we\'ll just die
    if ( isset( $wp_query->query_vars[\'cats\'] ) && ! is_page() && ! is_single() ) {
        $wp_query->is_404 = false;
        $wp_query->is_archive = true;
        $wp_query->is_category = true;
        $cats = array( \'Hobbes\', \'Simba\', \'Grumpy Cat\' );
        header( \'Content-Type: application/json\' );
        die( json_encode( $cats ) );
    } else {
        return $template;
    }
}
add_filter( \'template_include\', \'my_template_include\' );
Important: 不要忘记刷新永久链接设置。只需访问(管理)设置>永久链接。您甚至不需要单击“保存”,因为当您访问管理页面时,“刷新”了重写设置。

SO网友:Uriel Hernández

我能想到的最简单的方法(也是唯一的方法)是使用您指示的永久链接创建一个页面,在您的主题文件夹中创建一个自定义模板,比如json\\U输出。包含以下内容的php:

<?php
/*
* Template Name: JSON Output
*/
header(\'Content-Type: application/json\');
$cats = array(\'Hobbes\', \'Simba\', \'Grumpy Cat\');
echo json_encode($cats);
在wordpress admin中创建页面时,请选择新创建的模板,在这种情况下,它必须命名为JSON Output

enter image description here

好了,发布页面,您将得到您想要的:enter image description here

希望有帮助

SO网友:pixeline

在我看来,您可以使用pre\\u get\\u posts操作挂钩来修改查询,但这感觉有点像黑客。不管怎样,像这样的?

add_action( \'pre_get_posts\', \'cats_endpoint\' );

function cats_endpoint($query ){
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->query_vars[\'post_type\'] == \'cats\'){
      header(\'Content-Type: application/json\');
      $cats = array(\'Hobbes\', \'Simba\', \'Grumpy Cat\');
      echo json_encode($cats);
      exit;
     }
  }
}
请记住,每个页面请求都会运行pre\\u get\\u posts。此外,您可能需要注册cats post\\u类型(如果无法在开箱即用)。

SO网友:Eric_WVGG

我相信有更好的方法可以做到这一点,但我会将其添加到函数中。php…

add_action(\'parse_request\', \'json_cats\');
function json_cats() {
  if(!empty($_SERVER[\'REQUEST_URI\']) || isset($_SERVER[\'argv\'])) {
    $urlvars = explode(\'/\', $_SERVER[\'REQUEST_URI\']);
    if( ( isset($_SERVER[\'argv\']) && count($_SERVER[\'argv\']) > 1 && $_SERVER[\'argv\'][1] == \'cats\' ) || ( count($urlvars) > 1 && $urlvars[1] == \'cats\' ) ) {
      header(\'Content-Type: application/json\');
      $cats = array(\'Hobbes\', \'Simba\', \'Grumpy Cat\');
      echo json_encode($cats);
    }
  }
}

SO网友:Nathan Roberts

这是另一个解决方案

<?php

//Configruations
$endpoints = array(
    \'/\'     => array( \'homepage\', \'404 Not found\' ),
    \'cats\'  => array( \'Hobbes\', \'Simba\', \'Grumpy Cat\' ),
    \'dogs\'  => array( \'Hobbes Dog\', \'Simba Dog\', \'Grumpy Dog\' ),
    \'birds\' => array( \'Hobbes Bird\', \'Simba Bird\', \'Grumpy Bird\' ),
);

//Parsing Request :: Take the last element from endpoint /abc/def/xyz
$endpoint = isset( $_SERVER[\'REQUEST_URI\'] ) ? strtolower( $_SERVER[\'REQUEST_URI\'] ) : "/";
$endpoint = parse_url( $endpoint, PHP_URL_PATH );
$endpoint = array_filter(explode("/", $endpoint));
$endpoint = array_pop($endpoint);
$endpoint = array_key_exists($endpoint, $endpoints) ? $endpoint : "/";

//Print Response
header(\'Content-Type: application/json\');
echo json_encode($endpoints[$endpoint], JSON_PRETTY_PRINT);

结束