Beitragsbilder über REST API zugänglich machen

über Schnittstellen verbinden
fotografiert von Gabriele Lässer

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.

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable