Aktion zum Veröffentlichen oder Aktualisieren ausführen?

Gibt es eine Möglichkeit, einen Codeabschnitt nur dann auf einer Vorlage auszuführen, wenn der Beitrag gerade veröffentlicht oder aktualisiert wurde?

Was muss ich um diesen Code herum wickeln?

AKTUALISIEREN:

Ich muss prüfen, ob einer meiner benutzerdefinierten Beitragstypen namens “Mitglieder” gespeichert wurde. Die Vorlage, die ich verwende, um die Beiträge anzuzeigen, ist single-members.php.

Wenn der Beitrag gespeichert wurde, dann muss ich in meiner single-members.php Vorlage get_template_part('geocode');aber nur wenn der Post gespeichert wurde .

Ich möchte nicht, dass dies in der ADMIN AREA passiert, dies muss passieren, Front-End der Website. Offensichtlich ist das Einzige, was ich im Admin-Bereich tun möchte, ist das Klicken auf PUBLISH / UPDATE.

Hier ist, was in der Datei geocode.php ist:

 Response->Status->code; if (strcmp($status, "200") == 0) { // Successful geocode $geocode_pending = false; $coordinates = $xml->Response->Placemark->Point->coordinates; $coordinatesSplit = split(",", $coordinates); // Format: Longitude, Latitude, Altitude $lat = $coordinatesSplit[1]; $lng = $coordinatesSplit[0]; $query = sprintf("UPDATE markers " . " SET lat = '%s', lng = '%s' " . " WHERE id = '%s' LIMIT 1;", mysql_real_escape_string($lat), mysql_real_escape_string($lng), mysql_real_escape_string($id)); $update_result = mysql_query($query); if (!$update_result) { die("Invalid query: " . mysql_error()); } } else if (strcmp($status, "620") == 0) { // sent geocodes too fast $delay += 1000; } else { // failure to geocode $geocode_pending = false; echo "Address " . $address . " failed to geocoded. "; echo "Received status " . $status . " \n"; } usleep($delay); } } ?> 

Solutions Collecting From Web of "Aktion zum Veröffentlichen oder Aktualisieren ausführen?"

Warum wickelst du es nicht in post save_post und post_publish Hooks?

Sie haben Beispiele hier: http://codex.wordpress.org/Function_Reference/add_action

Wie es geht: Fügen Sie dies zu Ihrer functions.php Datei hinzu:

 function my_data_update () { $company = get_field('company_name'); $address = get_field('address'); $city = get_field('city'); $post_code = get_field('post_code'); //etc etc... } add_action('publish_post', 'my_data_update'); add_action('save_post', 'my_data_update'); 

Ich hatte kürzlich fast genau den gleichen Anwendungsfall:

  • Überprüfen Sie beim Speichern eines benutzerdefinierten Post-Typs, ob einige Metadaten vorhanden sind.
  • Wenn es existiert, geocodieren Sie es mit der Google Geocode API.
  • Speichere das Ergebnis als neues Metafeld (dieses ist versteckt, damit der Benutzer es nicht vermasseln kann).
  • Hinweis: Was ich mit den Daten auf der Vorderseite der Website mache, wird in einer Vorlagendatei mithilfe von JavaScript und der Google Maps-API verarbeitet.

Es sieht so aus, als würden Sie mehrere Felder zusammenstellen, um die Adresse zu erhalten (ich habe sie in einem gespeichert), und Sie speichern das resultierende Format anders, aber hoffentlich dient dies als gutes Beispiel, von dem Sie sich etwas ausleihen können. Wie ich immer versuche, habe ich die WordPress-API-functionen zum Abfragen und Speichern in der database verwendet. Es ist sicher und zukunftssicher.

Genau wie @OriginalEXE vorschlägt, habe ich den save_post Hook benutzt . Ich glaube nicht, dass Sie publish_post brauchen:

save_post ist eine Aktion, die immer dann ausgetriggers wird, wenn ein Post oder eine Seite erstellt oder aktualisiert wird. Dies kann ein Import-, Post / Page-Bearbeitungsformular, xmlrpc oder Post per E-Mail sein.

Noch ein paar Anmerkungen:

  • Notieren Sie die niedrigere Priorität der Aktion. Ich habe festgestellt, dass es die Standardpriorität beließ und die zuvor gespeicherten Daten (die unter Verwendung der erweiterten benutzerdefinierten Felder gespeichert wurden, wie es aussieht) anzeigt.
  • Die Geokodierungsklasse war nicht meine und hat mir eine Menge Zeit gespart. Ich habe geändert, was Sergiy veröffentlicht hat, um die function wp_remote_get() verwenden, die eine bessere file_get_contents als curl oder file_get_contents . Es verwendet die JSON-Anfrage (von Google empfohlen) und nicht XML.

Ich habe dies in ein functions-Plugin eingefügt, aber es würde in der functions.php dasselbe functions.php :

 /* function wc_add_latlong() * take address from post, geocode it, and save as a custom meta field * @parameter $post_id, id of the post being saved, passed by save_post hook * @returns nothing **************************************/ function wc_add_latlong( $post_id ) { // get the address from ACF field $address = get_field( 'wc_map_address', $post_id ); // Check to see if the post type is right, it's not a revision, and there is an address to geocode if( get_post_type( $post_id ) == 'wc_biz' && !wp_is_post_revision( $post_id ) && $address ) { // call the geocoder class below $coords = geocoder::getLocation( $address ); // split latLngObject with a comma and space $lat_long_string = $coords['lat'] . ', ' . $coords['lng']; // either add that value as a new post meta field OR update the existing one add_post_meta( $post_id, '_wc_lat_long', $lat_long_string, true ) || update_post_meta( $post_id, '_wc_lat_long', $lat_long_string ); } } // This runs on the save_post hook add_action( 'save_post', 'wc_add_latlong', 11 ); // Thank you Sergiy! // http://erlycoder.com/45/php-server-side-geocoding-with-google-maps-api-v3 // a class to get the lat and long of an address _server-side_ class geocoder{ // The base URL for a non-sensor json Google Geocode API request static private $url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address="; static public function getLocation($address){ // append URL-friendly address to base URL $url = self::$url.urlencode($address); // request the Geocode JSON object from Google $resp_json = wp_remote_get($url); // decode the body of the response $resp = json_decode( wp_remote_retrieve_body($resp_json), true ); // make sure the remove_get was successful and it geocoded the address if( !is_wp_error( $resp_json ) && $resp['status']='OK' ) { // success! return the lat and long return $resp['results'][0]['geometry']['location']; }else{ // we failed, return false return false; } } } 

UPDATE: Ich habe den gesamten Code kommentiert, damit Sie verstehen können, was vor sich geht. Sie müssen es von dort anpassen.