Auf der Startseite unserer Firmenwebsite wollten wir künftig die letzten Beiträge dieses Blogs einblenden. Da beide Sites innerhalb einer Multisiteumgebung laufen, wäre es durchaus möglich gewesen, die Abfrage direkt aus der Datenbank zu machen. Doch besser als das gefiel mir die Idee, über die REST API zu gehen.
Dafür muss die Schnittstelle auch für anonyme Besucher zugänglich sein. Das lässt sich feststellen, indem man als nicht angemeldeter User https://website-adresse.com/wp-json/
abfragt, resp. https://website-adresse.com/wp-json//wp/v2 .
Einen kleinen Haken allerdings gab es, ich kam nicht an das jeweilige Beitragsbild heran. Auf der Blogseite brauchte es also auch einen kleinen Eingriff. Für das Beispiel beziehen sich die Daten auf das Bild in Thumbnailgröße. Bei Bedarf könnten durchaus auch andere Bildgrößen oder alle zugänglich gemacht werden.
add_action('rest_api_init', 'register_rest_images' );
function register_rest_images(){
register_rest_field( array('post'),
'featured_image_url',
array(
'get_callback' => 'get_rest_featured_image',
'update_callback' => null,
'schema' => null,
)
);
}
function get_rest_featured_image( $object, $field_name, $request ) {
if( $object['featured_media'] ){
$img = wp_get_attachment_image_src( $object['featured_media'], 'thumbnail' );
return array($img[0],$img[1],$img[2]);
}
return false;
}
Gegen-seitig hätte es ein Shortcode sein können, oder ein Block, doch ich beschloss, einfach über den Content-Filter zu gehen, allerdings nur, wenn sich wer auf der Startseite befand. Der Performance zuliebe wurde die Abfrage nicht bei jedem Aufruf neu gemacht, sondern vorübergehend in einem transient gespeichert.
add_filter( 'the_content', function ( $content ) {
if ( !is_front_page() ) return $content;
$trans = '_trans_posts_remote_cache';
if ( false === $blog_posts = get_transient( $trans ) ) {
$response = wp_remote_get( add_query_arg( array(
'per_page' => 8
), 'https://blog.webentwicklerin.at/wp-json/wp/v2/posts?_embed' ) );
if( !is_wp_error( $response ) && $response['response']['code'] == 200 ) {
$remote_posts = json_decode( $response['body'] ); // our posts are here
// echo '<pre>' . print_r($remote_posts) . '</pre>';
foreach( $remote_posts as $remote_post ) {
$blog_posts[ strtotime( $remote_post->date_gmt ) ] = $remote_post;
}
}
set_transient( $trans, $blog_posts, 3600 );
}
if ( empty($blog_posts) ) return $content;
...
foreach ( $blog_posts as $s_post ) {
$img = $s_post->featured_image_url;
if ( isset( $img ) ) {
$content .= sprintf('<img src="%1$s" width="%2$s" height="%3$s" alt="%4$s" />',
esc_url( $img[0] ),
esc_attr( $img[1] ),
esc_attr( $img[2] ),
esc_html( $s_post->title->rendered )
);
...
}
}
...
return $content;
} );
Über $s_post->featured_image_url
im Loop auf die neuesten Beiträge kommt ein Array mit den Bildinformationen zurück: URL, Breite, Höhe.
Schreibe einen Kommentar