2017-06-28 7 views
0

Ich habe hier eine kleine Herausforderung, ich importiere Post-Daten von der wp Rest API von Websites in einem Netzwerk mit mehreren Standorten. Die URLs werden als Optionen hinzugefügt, und dann gehe ich durch jede Option mit einer foreach-Schleife mit einer benutzerdefinierten Funktion wie unten gezeigt.wp_insert_post in foreach loop laufen

function import_posts() { 
    global $wpdb; 
    $query_name = $wpdb->prefix . 'options'; 
$options = $wpdb->get_results("SELECT option_name, option_value FROM $query_name WHERE option_name LIKE 'city_%'"); 

// array of option names 
foreach ($options as $key => $row) { 
    $url = $row->option_value; 
    $city_name = $row->option_name; 
    create_import_post_from_url($url,$city_name); 
} 
echo"The Import Is Finished"; 

wp_die(); 
} 

Und hier ist die create_post_from_url() Funktion

function create_import_post_from_url($url, $city_name) { 
$post_url = file_get_contents($url); 
    $post_data = json_decode($post_url, true); 
    $i=1; 
    foreach($post_data as $article_array) { 
     $post_color = $article_array['post-meta-fields']['color']['0']; 
     $post_image = $article_array['post-meta-fields']['feat_url']['0']; 
     $title = $article_array['title']['rendered']; 
     $post_title_check = get_page_by_title($title, OBJECT, 'post'); 
     if ($post_title_check == NULL){ 
     $post_args = array(
     'post_author' => $article_array['author'], 
     'post_content' => $article_array['content']['rendered'], 
     'post_content_filtered' => '', 
     'post_title' => $article_array['title']['rendered'], 
     'post_excerpt' => $article_array['excerpt']['rendered'], 
     'post_status' => $article_array['status'], 
     'post_type' => $article_array['type'], 
     'comment_status' => $article_array['comment_status'], 
     'ping_status' => $article_array['ping_status'], 
     'post_password' =>$article_array['post_password'], 
     'to_ping' => $article_array['to_ping'], 
     'pinged' => $article_array['pinged'], 
     'post_parent' => $article_array['post_parent'], 
     'menu_order' => $article_array['menu_order'], 
     'guid' => $article_array['guid']['rendered'], 
     'import_id' => 0, 
     'context' => '', 
     'meta_input' => array(
     'city_name' => $city_name, 
     'import' => 'import', 
     'color' => $post_color, 
     'featured_image' => $post_image, 
) 
     ); 

    } 
    wp_insert_post($post_args, $wp_error); 
     } 
    } 

Wenn die Funktion es 2 erzeugt von jedem Pfosten ausgeführt wird, Ich habe Probleme, um dieses Problem aufzuspüren, so wird jede Hilfe dankbar!

EDIT: Wenn ich den Wert von $ post_url auf eine einzige URL (e.x http://example.com/wp-json/wp/v2/posts) setzen, dann läuft es ohne ein Problem. Das Problem scheint zu passieren, wenn ich versuche, create_import_post_from_url() in der foreach-Schleife der Funktion import_posts() auszuführen.

+0

Ihre $ post_data Dump zuerst. Beenden Sie die Schleife in der ersten Schleife, um festzustellen, ob der Post zweimal eingefügt wurde. – TurtleTread

+0

Das Problem scheint von der letzten foreach-Schleife zu kommen, die ausgeführt wird. Wenn ich mehr als eine URL an die foreach-Schleife übergebe, erstellt sie die Duplikate jedes Posts. –

Antwort

0

Die Antwort ist, dass meine letzte Klammer für die if-Anweisung, die für vorhandene Beiträge überprüft wurde, nicht unter der wp_insert_posts-Funktion platziert wurde. Hier

ist die korrigierte Funktion, falls jemand stolpert über dieses

function create_import_post_from_url($url, $city_name) { 
$post_url = file_get_contents($url); 
    $post_data = json_decode($post_url, true); 
$i = 1; 
    foreach($post_data as $article_array) { 

     $post_color = $article_array['post-meta-fields']['color']['0']; 
     $post_image = $article_array['post-meta-fields']['feat_url']['0']; 
     $title = $article_array['title']['rendered']; 
     $post_title_check = get_page_by_title($article_array['title']['rendered'], 'OBJECT', 'post'); 
     if ($post_title_check == NULL){ 
      $var_str = var_export($article_array['title']['rendered'], true); 
    $var = "<?php\n\n\$text = $var_str;\n\n?>"; 
    file_put_contents('url'. $i++ .'.php', $var); 
     $post_args = array(
     'post_author' => $article_array['author'], 
     'post_content' => $article_array['content']['rendered'], 
     'post_content_filtered' => '', 
     'post_title' => $article_array['title']['rendered'], 
     'post_excerpt' => $article_array['excerpt']['rendered'], 
     'post_status' => $article_array['status'], 
     'post_type' => $article_array['type'], 
     'comment_status' => $article_array['comment_status'], 
     'ping_status' => $article_array['ping_status'], 
     'import_id' => 0, 
     'context' => '', 
     'meta_input' => array(
     'city_name' => $city_name, 
     'import' => 'import', 
     'color' => $post_color, 
     'featured_image' => $post_image, 
) 
     ); 
wp_insert_post($post_args, $wp_error); 
    unset($post_data[$article_array]); 
    } 
} 
}