Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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();
@malasaad82

This comment has been minimized.

Copy link

malasaad82 commented Feb 25, 2018

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

This comment has been minimized.

Copy link

marcusquiroga commented May 25, 2018

@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
You can’t perform that action at this time.