Получение записей с удаленного wordpress сайта

Код ниже написан для примера и показывает как можно получить данные с удаленного WordPress сайта, при условии, что WordPress REST API не отключено.

get_posts() — вернет ассоциативный массив с данными:

  • post_url — ссылка на полную запись
  • post_title — заголовок записи
  • post_author_name — имя автора записи
  • post_author_link — ссылка на страницу автора
  • post_featured_image_url — урл картинки
  • post_featured_image_alt — alt картинки

Код при необходимости можно расширить, добавив любые данные которые есть в json, например категории или теги.

get_author() — добавление нужной информации об авторе

get_featured_image() — добавление нужной информации об картинке

get_data() — кешированние для json и возврат данных в ассоциативном массиве

get_json() — получение json данных


class Get_Remote_Posts {
    private $posts_info = array();

    private static $instance;
    
    private function __construct(){}
    
    private function __clone() {}
    
    private function __wakeup() {}
    
    public static function get_instance() { 
	if ( empty(self::$instance) ) {
	    self::$instance = new self();
	}
	return self::$instance;
    }

    public function get_posts( $posts_json_url ){
        $data = $this->get_data( $posts_json_url );
        
        if( $data ) {
            foreach( $data as $info ){
                $this->posts_info[ $info['id'] ] = array(
                                'post_url' => $info['link'],
                                'post_title' => $info['title']['rendered'],
                                );
                
                if( isset( $info['_links']['author'][0]['href'] ) ){
                    $this->get_author( $info['id'], $info['_links']['author'][0]['href'] );
                }
                
                if( isset( $info['_links']['wp:featuredmedia'][0]['href'] ) ){
                    $this->get_featured_image( $info['id'], $info['_links']['wp:featuredmedia'][0]['href'] );
                }
            }
        }

        return $this->posts_info;
    }
    
    private function get_author( $post_id, $post_author_json_url ){
        $data = $this->get_data( $post_author_json_url );
        
        if( $data ) {
            $this->posts_info[ $post_id ]['post_author_name'] = $data['name'];
            $this->posts_info[ $post_id ]['post_author_link'] = $data['link'];
        }
    }
    
    private function get_featured_image( $post_id, $post_featured_image_json_url ){
        $data = $this->get_data( $post_featured_image_json_url );
        
        if( $data ) {
            $this->posts_info[ $post_id ]['post_featured_image_url'] = $data['media_details']['sizes']['medium']['source_url'];
            $this->posts_info[ $post_id ]['post_featured_image_alt'] = $data['alt_text'];
        }
    }
    
    private function get_data( $url ){
	require_once( ABSPATH . 'wp-admin/includes/file.php' );
	
	if ( ! defined('FS_METHOD') )
	    define('FS_METHOD', 'direct' );
		
	global $wp_filesystem;
	
	if( is_null( $wp_filesystem ) )
	    WP_Filesystem();

	$upload = wp_upload_dir();
	$upload_dir = $upload['basedir'];
	$cache_folder = $upload_dir . '/remote_posts_json/';
	$cache_period = 3600;
	$set_cache = true;
    
	if( ! $wp_filesystem->exists( $cache_folder ) ) {
	    $wp_filesystem->mkdir( $cache_folder );
	}
        
        if( $wp_filesystem->is_dir( $cache_folder ) ){
            $cache_file_name = md5( $url );
            $cache_file = $cache_folder . $cache_file_name . '.json';
            
            if( $wp_filesystem->exists( $cache_file ) ){
                $last_change = time() - $wp_filesystem->mtime( $cache_file );
                
                if( $last_change < $cache_period ){
                    $json = $wp_filesystem->get_contents( $cache_file );
                    $set_cache = false;
                }
            }
            
            if( $set_cache ) {
                $json = $this->get_json( $url );
                $wp_filesystem->put_contents( $cache_file, $json );
            }
        }
        
        return ( isset( $json ) and $json !== false ) ? json_decode( $json, true ) : false;
    }
	
    private function get_json( $url ){
        $response = wp_remote_get( $url );
        $response_code = wp_remote_retrieve_response_code( $response );
        if( $response_code == 200 ) {
            $json = wp_remote_retrieve_body( $response );
            
            return $json;
        }
        
        return false;
    }
}

$_posts = Get_Remote_Posts::get_instance()->get_posts( 'http://wordrpess.site/wp-json/wp/v2/posts?per_page=5' );

var_dump($_posts );