2011-10-04 10 views
5

Ho un sito wordpress che si collega a un server soap. Il problema è che ogni volta che eseguo lo script, "wp_insert_post" sta usando di nuovo lo stesso risultato. Vorrei verificare se post_title esistente corrisponde al valore di $ title, quindi se corrispondono, impedire a wp_insert_post di utilizzare di nuovo lo stesso valore.Come evitare il post duplicato controllando se il titolo del post esiste prima di eseguire "wp_insert_post"?

Ecco il codice:

try { 
    $client = new SoapClient($wsdl, array('login' => $username, 'password' => $password)); 
    } catch(Exception $e) { 
     die('Couldn\'t establish connection to weblink service.'); 
    } 
$publications = $client->GetPublicationSummaries(); 
foreach ($publications->GetPublicationSummariesResult->PublicationSummaries->PublicationSummary as $publication_summary) { 

    // get the complete publication from the webservice 
    $publication = $client->getPublication(array('PublicationId' => $publication_summary->ID))->GetPublicationResult->Publication; 

    // get all properties and put them in an array 
    $properties = array(); 
    foreach ($publication->Property as $attribute => $value) { 
     $properties[$attribute] = $value; 
    } 

    // Assemble basic title from properties 
    $title = $properties['Address']->Street . ' ' . $properties['Address']->HouseNumber . $properties['Address']->HouseNumberExtension . ', ' . $properties['Address']->City->_; 
} 

$my_post = array(
    'post_title'=>$title, 
    'post_content'=>'my contents', 
    'post_status'=>'draft', 
    'post_type'=>'skarabeepublication', 
    'post_author'=>1, 
); 
wp_insert_post($my_post); 

Grazie per qualsiasi aiuto.

+2

si dovrebbe provare questo codice. require (dirname (__ FILE__). '/wp-load.php'); globale $ wpdb; echo $ count = $ wpdb-> get_var ("seleziona COUNT (*) da $ wpdb-> post dove' post_title' come '$ title' "); – Robot

risposta

4

Ci scusiamo per il ritardo di risposta. Ho usato quello che dice Robot nel commento e questo ha risolto il mio problema. Grazie

$post_if = $wpdb->get_var("SELECT count(post_title) FROM $wpdb->posts WHERE post_title like '$title_from_soap'"); 
if($post_if < 1){ 
    //code here 
} 
13

È possibile utilizzare get_page_by_title() poiché ora supporta i tipi di post personalizzati.

if (!get_page_by_title($title, OBJECT, 'skarabeepublication')) : 

    $my_post = array(
     'post_title'=>$title, 
     'post_content'=>'my contents', 
     'post_status'=>'draft', 
     'post_type'=>'skarabeepublication', 
     'post_author'=>1, 
    ); 
    wp_insert_post($my_post); 

endif; 

informazioni Codex here

+2

Mi piace questo metodo per sfruttare le funzioni integrate per i migliori risultati. Credo che la prima riga dovrebbe essere: "if (! Get_page_by_title ($ title, OBJECT, 'skarabeepublication')):" – Jake

+0

Hai assolutamente ragione, grazie! – CookiesForDevo

+0

'OBJECT' non dovrebbe avere apostrofi, ma in caso contrario questo metodo funziona perfettamente ed è ancora valido da WordPress 4.7.3. – Arinthros

4

Sorpreso di non vedere menzione di post_exists funzione nel wp-includes/post.php. Vedi entry on wpseek. Non vi è alcuna voce nel codice. Al più semplice funziona come get_page_by_title ma restituisce un post id (o 0 se non trovato) invece dell'oggetto (o null).

$post_id = post_exists($my_title); 
if (!$post_id) { 
    // code here 
} 
+0

C'è ora una [voce su post_exists] (https://developer.wordpress.org/reference/functions/post_exists/) nel codice di riferimento per sviluppatori di Wordpress. – Jon

0

campionatore:

if(!get_page_by_path('mypageslug',OBJECT,'post')){ 
    //your codes 
} 
Problemi correlati