使用API​​从一个站点获取数据以在另一个站点上显示

时间:2015-12-11 10:28:09

标签: json wordpress api

我在Wordpress上有一个网站,我试图找到创建下拉列表的最佳方法,该下拉列表显示来自自定义分类的数据,最终将其集成到不同的网站(也在Wordpress上)。

我去的地方是尝试获取正确的路由/网址以获取此信息。

我有一个名为listings的帖子类型,其中有一个名为listing_area的分类,其中有不同的区域,其中关联帖子,例如威尔士,东安格利亚。

到目前为止,我已经决定使用Plugin WP-API(这是否是我不知道的正确的事情,我知道Wordpress现在有一个API在它的新更新)。我设法让这个网址正常运行并引用listing_area - http://scd.blaze.wpengine.com/wp-json/taxonomies/listing_area/terms/174

的条款

这是我要去的测试页面,它依次链接到这些URL -

http://scd.blaze.wpengine.com/test/

我不知道我是否在这里做正确的事情,而且我对它有非常基本的了解,如果有人能指出我正确的方向,我会非常感激!

由于

2 个答案:

答案 0 :(得分:3)

您正走在正确的道路上,但如果您可以将网站升级到4.4,我建议您直接使用新的Wordpress REST API。否则你仍然可以使用你的REST插件,因为它几乎是一样的。我将尝试解释如何完成您想要实现的目标(浏览远程Wordpress网站的术语并显示与此术语相关的帖子)。

从其他WP获取条款

使用新的WP REST API,这是一个小函数,可用于获取分类术语:

public function getDistantTerms($taxonomy) {
    $response = wp_remote_get('http://www.yourwebsite.com/wp-json/wp/v2/terms/' . $taxonomy);
    if(is_wp_error($response)) {
        return array();
    }
    return json_decode(wp_remote_retrieve_body($response));
}

在这里,我使用wp_remote_get函数从REST函数terms获取JSON返回,方法是将其作为参数传递给分类标本slug(例如:listing_area) - {{3}它返回的内容。将此功能添加到 functions.php ,然后在模板中使用它来构建您的选择:

<select name="term_select">
  <option value="">Please choose a term</option>
  <?php foreach(getDistantTerms('listing_area') as $term): ?>
  <option value="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
  <?php endforeach; ?>
</select>

这似乎与你实际上的相似。

将您的选择链接到自定义模板

因此,下一步是重定向到列出您选择的字词的帖子的页面。首先我们在JS中处理重定向:

$('select[name="term_select"]').change(function() {
  if($(this).val() != "") {
    window.location = "/show-post-term/" + $(this).val();
  }
});

我们添加了一些重写规则来将此网址(将其更改为您想要的任何内容)重定向到我们名称​​ distant-posts.php 的模板(所有这些都发生在您的主题 functions.php ):

<强> 1。添加重写规则

add_action('init', 'distantposts_rewrite_rules');
function distantposts_rewrite_rules() {
  add_rewrite_rule('show-post-term/([^/]+)/?$', 'index.php?term_slug=$matches[1]&distant_post=true', 'top');
}

<强> 2。添加两个查询变量

add_filter('query_vars', 'distantposts_query_vars' );
function distantposts_query_vars($vars) {
    $vars[] = 'term_slug';
    $vars[] = 'distant_post';
    return $vars;
}

第3。如果设置了查询变量,则重定向到模板

add_filter('template_include', 'yourpluginname_blah_template_include', 1, 1); 
function yourpluginname_blah_template_include($template) {
    global $wp_query;
    $distant_post = $wp_query->query_vars['distant_post'];
    $term_slug = $wp_query->query_vars['term_slug'];
    if($distant_post && $term_slug) {
        $tpl = locate_template(array('distant-posts.php'));
        if(!empty($tpl)) {
            return $tpl;
        }
    }
    return $template;
}

简而言之,我们在这里做的是:我们添加一条处理/show-post-term/term-slug网址的规则,将其重定向到两个查询变量的索引:一个告诉我们&#39; 34;远程职位&#34;模式和带有术语slug的模式。然后我们将这些查询变量声明为Wordpress,并使用它们来更改Worpdress在设置时应显示的模板。

列出分类术语中的distants帖子

返回REST API。我们使用GET REST函数here is a demo将它作为GET参数传递给分类法名称作为键,将术语slug作为值传递。 posts你获得了什么样的回报。

进一步的重要说明:在更新到WP 4.4之后,您需要更改分类声明才能使其正常工作。您需要将参数show_in_rest设置为true添加到声明中,并将query_var设置为true

所以我们将这个小函数添加到 functions.php 以从模板中检索帖子:

public function getDistantPosts($taxonomy, $term) {
    $response = wp_remote_get('http://www.yourwebsite.com/wp-json/wp/v2/posts?' . $taxonomy . '=' . $term);
    if(is_wp_error($response)) {
        return array();
    }
    return json_decode(wp_remote_retrieve_body($response));
}

然后在你的模板中,你这样称呼它:

global $wp_query;
$posts = getDistantPosts('listing_area', $wp_query->query_vars['term_slug']);

然后使用$posts数组显示您的帖子(它包含常规帖子对象)。

更进一步

现在您已经建立了上下文,您可能想要做的一些事情:

  • 将缓存添加到REST返回

    为了避免主网站服务器过载,您应该考虑缓存REST调用结果。我不会在这里详细说明,因为有一些工作要做,但一个好的开始可能是Here is a demo

  • 为您的远程帖子模板添加分页

    如果您的条款中有很多帖子,则可能需要添加分页。您可以更改远程帖子REST功能,为此添加page参数 - this script

  • 添加&#34;单页&#34;为你的远程职位

    您可能希望在主网站上为远程帖子设置单独的页面,因为列表模式的文本可能太长。您可以从 distant-posts.php 代码开始,添加post_id查询var,然后使用REST posts函数获取您的帖子:{{1} }

要了解WP REST API的基础知识,我强烈建议您访问see the documentation网站。 wpmudev.org上的REST API上有一个wp-api.org,您也可以阅读。如果您需要了解REST基础知识,建议您阅读pretty good article

希望你能设法通过这个,玩得开心!

答案 1 :(得分:0)

我发现这个网址给了我我需要的结果 -

http://scd.blaze.wpengine.com/wp-json/posts?type=listings&filter[listing_area]=channel

我的帖子类型为listings,而我的期限为channel