如何使用REST API获取静态首页?

时间:2016-11-13 作者:Connel

我想创建一个Angular 2 SPA,它使用WordPress REST API作为后端。如何使用API获取用户设置为其首页的页面?

4 个回复
SO网友:birgire

我们可以实现自己的端点:

https://example.tld/wpse/v1/frontpage
下面是一个简单的演示(PHP 5.4+):

<?php
/** 
 * Plugin Name: WPSE - Static Frontpage Rest Endpoint
 */
namespace WPSE\\RestAPI\\Frontpage;

\\add_action( \'rest_api_init\', function()
{
    \\register_rest_route( \'wpse/v1\', \'/frontpage/\', 
        [
            \'methods\'   => \'GET\',
            \'callback\'  => __NAMESPACE__.\'\\rest_results\'
        ] 
    );
} );

function rest_results( $request )
{
    // Get the ID of the static frontpage. If not set it\'s 0
    $pid  = (int) \\get_option( \'page_on_front\' );    

    // Get the corresponding post object (let\'s show our intention explicitly)
    $post = ( $pid > 0 ) ? \\get_post( $pid ) : null;  

    // No static frontpage is set
    if( ! is_a( $post, \'\\WP_Post\' ) )
        return new \\WP_Error( \'wpse-error\', 
           \\esc_html__( \'No Static Frontpage\', \'wpse\' ), [ \'status\' => 404 ] );

    // Response setup
    $data = [
        \'ID\'      => $post->ID,
        \'content\' => [ \'raw\' => $post->post_content ]
    ];

    return new \\WP_REST_Response( $data, 200 );     
}
成功的响应如下:

{"ID":123,"content":{"raw":"Some content"}}
错误响应如下所示:

{"code":"wpse-error","message":"No Static Frontpage","data":{"status":404}}
然后,我们可以通过应用the_content 滤器

SO网友:Marnix Harderwijk

因为我建造了几个聚合物&;Angular SPA用于前端和WordPress后端我为此创建了一个插件https://wordpress.org/plugins/wp-rest-api-frontpage/

我希望这有助于。。。

基本上,它使用新的路由扩展了本机REST API:

wp-json/wp/v2/frontpage
干杯!

SO网友:Connel

我刚刚使用插件“WP-API-Options”实现了这一点。您可以在此处找到插件:https://en-gb.wordpress.org/plugins/wp-rest-api-options/

它允许您查看已配置为首页的页面。下面是使用“wp api angular”包的TypeScript代码段。

getFrontPage(): Promise<any> {
    return this.wpApiPages
      .httpGet(\'/options/page_on_front\')
      .toPromise()
      .then(response => response.json())
      .then(body => body.page_on_front)
      .then(frontPageId => this.wpApiPages
        .get(frontPageId)
        .toPromise()
        .then(response => response.json()))
      .catch(error => {});
}

SO网友:mustra

这碰巧很简单。默认情况下,WordPress没有frontpage端点,但您可以创建这样的端点。

// Register Front Page route.
// URL will be: domainname.ext/wp-json/my-namespace/v1/frontpage/
register_rest_route(
  \'my-namespace/v1\', \'/frontpage\',
  array(
      \'methods\'  => \'GET\',
      \'callback\' => [ $this, \'get_frontpage\' ],
  )
);


// Callback function.
function get_frontpage( $object ) {

  // Get WP options front page from settings > reading.
  $frontpage_id = get_option(\'page_on_front\');

  // Handle if error.
  if ( empty( $frontpage_id ) ) {
    // return error
    return \'error\';
  }

  // Create request from pages endpoint by frontpage id.
  $request  = new \\WP_REST_Request( \'GET\', \'/wp/v2/pages/\' . $frontpage_id );

  // Parse request to get data.
  $response = rest_do_request( $request );

  // Handle if error.
  if ( $response->is_error() ) {
     return \'error\';
  }

  return $response->get_data();
}