2017-07-17 3 views
-2

Ok, so per RamRaider, habe ich die gesamte Funktion enthalten. Ich mache mir immer Sorgen, dass ich am Ende eine Variable nicht zuordnen oder einen Tippfehler enthalten werde, wenn ich es generischer mache, also hoffentlich keinen dieser Fehler.PHP Funktion nur letzten Wert des Arrays

function my_custom_popular_posts_html_list($mostpopular, $instance){ 
    $output = 'https://startofwebaddress'; 
      $weekday = date("N")-1; 
      $excerpt = ''; 
       $popularPost = get_post($mostpopular[$weekday]->id); 
       $popularPostUrl = get_permalink($popularPost->ID); 
       $featuredImgUrl = get_the_post_thumbnail_url($popularPost->ID, 'full'); 
       $popularPostTitle = esc_html(get_the_title($popularPost)); 
       $popularProduct = wc_get_product($popularPost); 
       $popularProductLowPrice = $popularProduct->get_price(); 
       $excerpt = get_keywords_by_id($mostpopular[$weekday]->id); //most popular = 0, 2nd most = 1, 3rd most = 2, etc. 
       $initial = array("oldterms"); 
       $replace = array("newterms"); 
       $excerpt = preg_replace($initial,$replace,$excerpt); 
       $commonName = str_replace("+"," ",$excerpt); 
      $output .= $excerpt; 
      $output .= 'endofwebaddress'; 
     //Get Key for second input 
     $First_url = $output; 
     $xml = new DOMDocument(); 
     $ch = curl_init ($First_url); 
     curl_setopt($ch, CURLOPT_VERBOSE, 1); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//return xml 
     curl_setopt($ch, CURLOPT_HEADER, FALSE);//ignore 
     $xml->loadXML(curl_exec($ch)); 
     curl_close ($ch); 
     $TagName1 = $xml->getElementsByTagName('TagName1')->item(0)->nodeValue; 

     //Email URL 
     $EmailURL = "urlthatneeds&TagName1="; 
     $EmailURL .= $TagName1; 
     $EmailURL .= "restofurl"; 

    $text=file_get_contents($EmailURL); 
    $res = preg_match_all(
    "/[a-z0-9]+[_a-z0-9.-]*[a-z0-9][email protected][a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})/i", 
    $text, 
    $matches 
    ); 
     session_start(); 
    foreach(array_unique($matches[0]) as $email) { 
    $url = 'https://api.sendgrid.com/'; 
    $user = 'user'; 
    $pass = 'password'; 

    $json_string = array(
     'to' => $email, 
     'category' => 'most_popular', 
     'asm_group_id' => '1141', 
    ); 
    } 
    $params = array(
     'api_user' => $user, 
     'api_key' => $pass, 
     'x-smtpapi' => json_encode($json_string), 
     'to'  => '[email protected]', //This should be ignored 
     'subject' => $commonName . ' Detailed Protocols and Products.', 
     'html'  => 'A whole ton of HTML', 
     'text'  => 'Text Version of HTML', 
     'from'  => '[email protected]', 
    ); 


    $request = $url.'api/mail.send.json'; 

    // Generate curl request 
    $session = curl_init($request); 
    // Tell curl to use HTTP POST 
    curl_setopt ($session, CURLOPT_POST, true); 
    // Tell curl that this is the body of the POST 
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params); 
    // Tell curl not to return headers, but do return the response 
    curl_setopt($session, CURLOPT_HEADER, false); 
    // Tell PHP not to use SSLv3 (instead opting for TLS) 
    curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
    // obtain response 
    $response = curl_exec($session); 
    curl_close($session); 



    // print everything out 
    print_r($response); 


    } 
    add_filter('wpp_custom_html', 'my_custom_popular_posts_html_list', 10, 2); 

    function get_keywords_by_id($post_id){ 

     // Get post data 
     $the_post = get_post($post_id); 
     // Get post_content 
     $the_post_id = $the_post -> post_title; 

     return $the_post_id; 
    } 

Hoffentlich kann ich das Problem vereinfachen. $ EmailUrl enthält eine Zeichenfolge mit allen E-Mail-Adressen. Ich parse es mit der Regex im Code, um alle E-Mail-Adressen heraus zu bekommen, und diese werden in einem Array ausgegeben.

Pro RichGoldMD (danke für die Vorschläge), habe ich session_start() außerhalb der Schleife verschoben und zusätzliche Variablen eliminiert, um E-Mails direkt zu übergeben. Wenn Sie dies tun, sendet die Funktion nur eine E-Mail an [email protected] Wenn ich das erste "to" -Attribut anwende und es von der Variablen in eine durch Kommas getrennte Liste ändere, erhalte ich E-Mails, die an die kommagetrennte Liste gesendet werden. Wenn ich jedoch versuche, die Array-Variable einzugeben, oder wenn ich versuche, die Array-Variable in eine kommagetrennte Liste zu bringen (was irgendwie vorher so war), bekomme ich nur eine E-Mail an [email protected] Wenn ich das erste Attribut 'to' in [$ email, '[email protected]'] ändere, erhalte ich eine E-Mail an [email protected] und sende eine E-Mail an die letzte E-Mail im Array, aber keine E-Mail sendet zu den anderen ~ 1500 E-Mail-Adressen.

Hoffentlich macht dies ein wenig mehr Sinn und tut leid für den Mangel an Kontext. Lassen Sie mich wissen, ob mehr Informationen das nützlich machen würden. Ich bin auch glücklich, dies etwas generischer zu machen, wenn es für andere Menschen nützlicher wäre.

Danke!

+1

eine Sache zu beachten - using'echo' vor 'session_start' ist ein no-no und mit der Verwendung von' session_start() 'in einer Schleife kombiniert ....... ... nicht gut. Das Problem könnte deutlicher zu sehen sein, aber wenn Sie den Code in seiner Gesamtheit eher als Bits n Stücke – RamRaider

+0

Ich entfernte das Echo, so dass dieses Problem lösen sollte. Ich habe auch den vollständigen Code gepostet. Irgendwelche Vorschläge? – TomM0419

Antwort

0

OK - Ich habe das Problem identifiziert. Die foreach-Schleife wird über Ihr E-Mail-Array verschoben und ersetzt dabei den Wert $json_string jedes Mal. Nur der Wert der letzten Iteration wird an das Array $params übergeben.

Ich schlage vor, die foreach-Linie und Ende Klammer zu beseitigen, und die $ json_string ersetzen somit:

$json_string = array(
     'to' => array_unique($matches[0]), 
     'category' => 'most_popular', 
     'asm_group_id' => '1141', 
    ); 

dh:

$res = preg_match_all(
    "/[a-z0-9]+[_a-z0-9.-]*[a-z0-9][email protected][a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})/i", 
    $text, 
    $matches 
    ); 
     session_start(); 
    // foreach(array_unique($matches[0]) as $email) { <-- Removed foreach 
    $url = 'https://api.sendgrid.com/'; 
    $user = 'user'; 
    $pass = 'password'; 

    $json_string = array(
     'to' => array_unique($matches[0]), // <-- Corrected "to" 
     'category' => 'most_popular', 
     'asm_group_id' => '1141', 
    ); 
    // } <-- Removed brace 
    $params = array(.... 

--------- Zurück Antwort folgt - ----

Verschieben Sie session_start unbedingt aus der Schleife (es ist nicht das Problem, aber es gehört in keinem Fall in die Schleife).

Wenn die API ein Array erwartet, löschen Sie die Zeile mit implode und übergeben Sie $ email direkt, anstatt es in $ emailAddresses zu massieren.

Die implode -Anweisung führt zu einer Zeichenfolge, aber Ihre Kommentare zeigen an, dass ein Array erwartet wird.

foreach(array_unique($matches[0]) as $email) {   
    $url = 'https://api.sendgrid.com/'; 
    $user = 'User'; 
    $pass = 'Password'; 
    $json_string = array(
    'to' => $email, 
    'category' => 'my_category', 
    'asm_group_id' => '1234', 
); 

...

+0

@ TomM0419 Was ist der Wert von $ Übereinstimmungen [0]? Ist es das, was Sie erwarten? Sie können es zurückgeben oder es mit error_log in das Fehlerprotokoll ablegen (print_r ($ matches [0], true)); – RichGoldMD

+0

Ich frage mich auch, ob Send Grid ein Limit für die Anzahl der Ziele in einem einzigen Befehl hat - haben Sie die Send Grid Protokolle überprüft? – RichGoldMD

+0

Ehrfürchtig.Das hat mich gereizt und war sehr nah dran. Wenn unique_array ($ matches [0]) getan hat, dann hat die Funktion ein leeres Array zurückgegeben und als default auf [email protected] gesetzt. Wenn ich 'to' editiere, um '' to '=' passt [0], 'und dann' x-smtpapi 'in $ params zu '' x-smtpapi '=> json_encode (array_unique ($ json_string)),' dann klappt es! Danke für die Hilfe. Randnotiz: Ich bin auf Ihren Link zu cancerexpertnow.com gestoßen. Ich habe ein ähnliches Interesse mit einem anderen Blickwinkel (PhD-Perspektive, um MD Perspective zu beglückwünschen), über den ich gerne reden würde, wenn Sie Zeit haben. Könnten Sie Kontaktinformationen senden? – TomM0419

Verwandte Themen