Are you trying to import any post type contents from one website to another website ?
1. Create a folder in the root directory of the site i.e PARENT_SITE. I have created services folder in the root directory and created the php file named news.php
2. Include wp-load.php the files so that we could use all the WordPress available functions
3. Write a code that encode all the posts/contents related to ‘post_type’=>’post’. We can replace ‘post_type’ => ‘post’ by any other custom post types
include '../wp-load.php'; $args = ['post_type'=>'post', 'posts_per_page' => -1, 'post_status'=> 'publish' ]; $query = new WP_Query($args); if(!($query->have_posts())){ die("no post"); } $jsonPost = []; while ($query->have_posts() ) { $query->the_post(); $postCategories = get_the_category($post->ID); $postTags = get_the_terms($post->ID,'post_tag'); $attachedImage = get_the_post_thumbnail_url( $post->ID, 'full' ); $imageUrl = !empty($attachedImage)?$attachedImage:''; $categories = []; // $postTerms = []; $communeTerms = []; // The Loop if(!empty($postTags)): $postTerms = saveTermInArray($postTags); endif; if(!empty($postCategories)): $categories = saveTermInArray($postCategories); endif; /* * saves the post and related terms & categories in an array */ $jsonPost[]= [ 'post_title' => get_the_title(), 'post_content'=> get_the_content(), 'post_date'=> get_the_time('Y-m-d'), 'post_cat' => $categories, 'post_terms'=>$postTerms, 'post_image_url'=>$imageUrl, 'post_permalink'=> get_permalink($post->ID) ]; } echo json_encode($jsonPost); /* * function to save related terms in an array */ function saveTermInArray($tagArray) { $saveTerm =[]; foreach ($tagArray as $postTag) { $saveTerm[] =[ 'slug'=> $postTag->slug, 'name'=>$postTag->name, 'term_id'=>$postTag->term_id, 'parent_term_id'=> $postTag->parent ]; }; return $saveTerm; }
We can check the encoded post contents in the Url : http://PARENT_SITE/services/news.php
4. Create a folder in the root directory of the site, I call it AS CHILD_SITE where we want to import the all the contents of posts from the PARENT_SITE. I have created app folder in the root directory of CHILD_SITE and created the php file named import-news.php inside the folder:
5. I have created custom post type named ‘imported-news’ and two meta fields , using acf to save the thumbnail and permalink of imported posts
p.s. I like to display the thumbnail of news directly from the source instead of saving it in my site and I might need the source of the news in the future
6. I have created main_site_url field using ACF in Options Page so that user can input the source url from where they can get the json encoded posts to be imported
7. I have created Importer class that handles the import part. Provided the post_type and source link of import in the Object of Importer Class and in return calling import method, it works like a charm . To parse the json encoded contents I have used Guzzle
8. Before importing the posts, we shall delete existing posts and meta related to imported post_type
9. After deleting the posts and meta’s , we shall insert the imported post and categories. If the imported category doesn’t exist, we shall create it and assign the post to the created category.
require __DIR__.'/../wp-load.php'; require '/vendor/autoload.php'; class Importer { protected $dbHandler; protected $importFromUrl =''; protected $postType = ""; /** * Importer constructor. * @param $importURl * f */ public function __construct($importFromUrl,$postType) { global $wpdb; $this->dbHandler = $wpdb; $this->postType = $postType; $this->importFromUrl = $importFromUrl; if(empty($importFromUrl)) : $mainSiteUrl = get_field('main_site_url','options'); $this->importFromUrl = $mainSiteUrl.'services/news.php'; endif; } /* * Delete all the existing posts and it's meta for the given post type * */ public function deletePostsByType() { $newsPostID = get_posts([ 'fields' => 'ids', 'posts_per_page' => -1, 'post_type' => $this->postType ]); $post_IDS = []; foreach ($newsPostID as $cId) { $postID = (int) $cId; array_push($post_IDS, $postID); } $implodedPostID = implode(',',$post_IDS); $deleteFormPostQuery = "DELETE FROM ".$this->dbHandler->posts." WHERE post_type = '{$this->postType}';"; $this->dbHandler->query($deleteFormPostQuery); $deleteQuery = "DELETE FROM " . $this->dbHandler->postmeta . " WHERE post_id IN (". $implodedPostID.")"; $this->dbHandler->query($deleteQuery); /* * Delete Orphan Meta */ $query = "DELETE pm FROM ".$this->dbHandler->postmeta." pm LEFT JOIN ".$this->dbHandler->posts." p ON pm.post_id = p.ID WHERE p.ID IS NULL ;"; $this->dbHandler->query($query); } /* * Function to import posts */ public function import() { $this->deletePostsByType(); $importNewsUrl = $this->importFromUrl; $client = new \GuzzleHttp\Client(); $response = $client->request('GET', $importNewsUrl); $items = json_decode($response->getBody()); if(!empty($items)): $postCount = 0; foreach ($items as $item): $post = array( 'post_title' => $item->post_title, 'post_content'=>$item->post_content, 'post_date'=>$item->post_date, 'post_status'=>'publish', 'post_type'=>$this->postType, 'post_author' => 1, 'post_permalink'=>$item->post_permalink ); $postID = wp_insert_post($post); if(!empty($item->post_image_url)): update_field('news_featured_image', $item->post_image_url, $postID); endif; if(!empty($item->post_permalink)): update_field('news_source', $item->post_permalink, $postID); endif; $termsArray = []; /* * if post term is not empty check if the term exist in the database * if exists, getTermsID() returns the id of the term * if doesn't exist creates Term */ if(!empty($item->post_terms )): foreach($item->post_terms as $postTag) { $termID = $this->getTermsID($postTag,'post_tag'); array_push($termsArray, $termID); } endif; /* * if post category is not empty check if the category exist in the database * if exists, getTermsID() returns the id of the category * if doesn't exist creates category */ if(!empty($item->post_cat )): foreach($item->post_cat as $cat) { $categoryID = $this->getTermsID($cat,'category'); array_push($termsArray, $categoryID); } endif; /* * function inserts all the terms related to post_tag, category, taxonomy in the database */ $this->insertRelatedTermsInDb ($termsArray,$postID); $postCount++; endforeach; echo $postCount. ' posts are imported !!'; endif; } /* * Returns term id of the inserted post */ protected function getTermsID($termArray,$taxonomy) { $postTerm = term_exists( $termArray->slug, $taxonomy ); // array is returned if taxonomy is given if(empty($postTerm)) { $insertedTerm = wp_insert_term( $termArray->name, // the term $taxonomy, // the taxonomy array( 'slug' => $termArray->slug ) ); $termID = $insertedTerm['term_id']; update_term_meta($termID, 'id_main_site', $termArray->term_id); update_term_meta($termID, 'parent_id_main_site', $termArray->parent_term_id); }else { $termID = $postTerm['term_id']; } return $termID; } /* * Insert related terms associated with the post */ protected function insertRelatedTermsInDb($termsArray,$postID) { // wp_defer_term_counting( true ); $tax_fields = []; $tax_string = "INSERT INTO ".$this->dbHandler->term_relationships." (object_id, term_taxonomy_id, term_order) VALUES "; $termPlace_holders = []; foreach ($termsArray as $termID) { $term = (int)$termID; array_push($tax_fields, $postID, $term, '0'); $termPlace_holders[] = "('%d', '%d', '%d')"; } $tax_string .= implode(', ', $termPlace_holders); $this->dbHandler->query($this->dbHandler->prepare("$tax_string ", $tax_fields)); } } $importNews = new Importer('','imported-news'); $importNews->import();
10. Last but not the list, run the import file in the CHILD_SITE to import the news : http://CHILD_SITE/app/import-news.php
P.S. The process is long and I haven’t displayed any screen-shots so that you could try it on your own; provided the full code 😛
Views: 86