web-dev-qa-db-ja.com

静的フロントページを取得する方法は? REST API?

バックエンドとしてWordPress Angular AP​​Iを使用するREST 2 SPAを作成したいです。ユーザーが自分のフロントページとして設定したページを取得するためにAPIを使用する方法を教えてください。

4
Connel

独自のエンドポイントを実装することができます。

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フィルタを適用することで他のフィールドや rendering contentをサポートするように拡張できます。

5
birgire

WordPressのバックエンドとのフロントエンド用にいくつかのPolymer&Angular SPAを作成したので、この目的のためにプラグインを作成しました https://wordpress.org/plugins/wp-rest-api-frontpage/

これが役立つことを願っています...

基本的に、ネイティブのREST AP​​Iを新しいルートで拡張します。

wp-json/wp/v2/frontpage

乾杯!

2

私はこれをプラグイン '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 => {});
}
1
Connel

これはとても簡単なことです。 WordPressはデフォルトでフロントページエンドポイントを持っていませんが、あなたはこのようなものを作成することができます。

// 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();
}
0
mustra