Skip to content

Instantly share code, notes, and snippets.

@tomazzaman
Created March 31, 2015 18:03
Show Gist options
  • Save tomazzaman/2aae1d082cddae8d5c8b to your computer and use it in GitHub Desktop.
Save tomazzaman/2aae1d082cddae8d5c8b to your computer and use it in GitHub Desktop.
Import JSON into WordPress
<?php
// Published under GPL
// tutorial here: https://codeable.io/community/how-to-import-json-into-wordpress/
class Developer_Import {
public function __construct() {
add_action( 'wp_ajax_import_developer', array( $this, 'import_developer' ) );
add_action( 'wp_ajax_nopriv_import_developer', array( $this, 'import_developer' ) );
}
public function import_developer() {
$developer_data = json_decode( file_get_contents( 'php://input' ) );
if ( $this->compare_keys() ) {
$this->insert_or_update($developer_data);
}
wp_die();
}
private function insert_or_update($developer_data) {
if ( ! $developer_data)
return false;
// We search by the custom field 'developer_id' which stores the id of the
// object that is stored in the external service
$args = array(
'meta_query' => array(
array(
'key' => 'developer_id',
'value' => $developer_data->id
)
),
'post_type' => 'developer',
'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit'),
'posts_per_page' => 1
);
$developer = get_posts( $args );
$developer_id = '';
if ( $developer )
$developer_id = $developer[0]->ID;
$developer_post = array(
'ID' => $developer_id,
'post_title' => $developer_data->full_name,
'post_content' => $developer_data->bio,
'post_type' => 'developer',
// If developer exists then it reuses its post status
'post_status' => ( $developer ) ? $developer[0]->post_status : 'publish'
);
$developer_id = wp_insert_post( $developer_post );
if ( $developer_id ) {
update_post_meta( $developer_id, 'developer_id', $developer_data->id );
update_post_meta( $developer_id, 'json', addslashes( file_get_contents( 'php://input' ) ) );
// Remove if you don't need to import tags and make sure
// the tag name is correct if you do
wp_set_object_terms( $developer_id, $developer_data->tags, 'developer_tag' );
$this->generate_background_images( $developer_data->full_name, $developer_data->avatar->large_url );
}
print_r( $developer_id );
}
private function compare_keys() {
// Signature should be in a form of algorihm=hash
// for example: X-Codeable-Signature: sha1=246d2e58593645b1f261b1bbc867fe2a9fc1a682
if ( ! isset( $_SERVER['HTTP_X_CODEABLE_SIGNATURE'] ) ) {
throw new \Exception( "HTTP header 'X-Codeable-Signature' is missing." );
}
list( $algo, $hash ) = explode( '=', $_SERVER['HTTP_X_CODEABLE_SIGNATURE'], 2 ) + array( '', '' );
$raw_post = file_get_contents( 'php://input' );
// Don't forget to define your key!
if ( $hash !== hash_hmac( $algo, $raw_post, CODEABLE_KEY ) ) {
throw new \Exception( 'Secret hash does not match.' );
}
return true;
}
}
new Developer_Import();
@Wooody82
Copy link

Hi,
What if we have many JSON files and big data on each file. How to destroy insert_or_update after each import so the memory free?

Thanks

@marcusquiroga
Copy link

@malasaad82 I'm with the same issue like you in a project. How did you solve your problem? Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment