J'aimerais créer un Angular 2 SPA utilisant l'API WordPress REST comme back-end. Comment puis-je utiliser l'API pour récupérer la page que l'utilisateur a définie comme page d'accueil?
Nous pourrions implémenter notre propre terminal:
https://example.tld/wpse/v1/frontpage
Voici une démonstration simple ( 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 );
}
Une réponse réussie est comme:
{"ID":123,"content":{"raw":"Some content"}}
et une réponse d'erreur est comme:
{"code":"wpse-error","message":"No Static Frontpage","data":{"status":404}}
Ensuite, nous pouvons l’étendre pour prendre en charge d’autres champs ou rendus contenu en appliquant le filtre the_content
.
Parce que je construis plusieurs Polymer & Angular SPA pour l'interface avec des backends WordPress, j'ai créé un plugin à cet effet https://wordpress.org/plugins/wp-rest-api-frontpage/
J'espère que ça aide...
Fondamentalement, il étend l'API native REST avec un nouvel itinéraire:
wp-json/wp/v2/frontpage
À votre santé!
Je viens de travailler avec le plugin 'WP API Options'. Vous pouvez trouver le plugin ici: https://en-gb.wordpress.org/plugins/wp-rest-api-options/
Il vous permet de voir quelle page a été configurée comme page d'accueil. Vous trouverez ci-dessous un extrait de code TypeScript utilisant le package 'wp-api-angular'.
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 => {});
}
Cela se trouve être très simple. WordPress n'a pas de point de terminaison frontpage par défaut, mais vous pouvez en créer un comme celui-ci.
// 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();
}