Webhooks verwenden
-
Hallo Hallo,
ich versuche mich grade darin webhooks zu nutzen. Ich benutze keine Plugins und möchte das vermeiden.
Der Webhook soll ausgelöst werden, wenn eine Veränderung auf dem Custom Post Type „event“ ausgelöst wurde. Soweit so gut.
Nun möchte ich unterscheiden ob es sich um
- einen brandneuen Post handelt
- einen modifizierten bereits existenten Post handelt
Und hier wird es kompliziert!
Denn wenn ein neuer Post veröffentlicht wird, wird die Funktion 3 x ausgelöst und zwar mit folgenden Status:
[10-Oct-2023 19:18:43 UTC] New Status: auto-draft [10-Oct-2023 19:18:43 UTC] Old Status: new [10-Oct-2023 19:19:04 UTC] New Status: publish [10-Oct-2023 19:19:04 UTC] Old Status: auto-draft [10-Oct-2023 19:19:06 UTC] New Status: publish [10-Oct-2023 19:19:06 UTC] Old Status: publishWenn ein existierender Post angepasst wird, wird die Funktion 2 x getriggert
[10-Oct-2023 19:23:04 UTC] NEW Status: publish [10-Oct-2023 19:23:04 UTC] OLD Status: publish [10-Oct-2023 19:23:05 UTC] NEW Status: publish [10-Oct-2023 19:23:05 UTC] OLD Status: publishIch kann im empfangenden Programm durchaus dafür sorgen das Dinge nicht doppelt verarbeitet werden. Jedoch finde ich einfach kein Kriterium um zu unterscheiden ob es sich um ein neuen Post handelt oder um einen existierenden.
functions.php:
// Add a custom REST API endpoint for the webhook function custom_webhook_endpoint() { register_rest_route('custom-webhooks/v1', '/trigger', array( 'methods' => 'POST', 'callback' => 'custom_webhook_callback', )); } // Callback function to handle incoming webhook requests function custom_webhook_callback($request) { // Process the webhook data and trigger your Python script or other actions // Example: $data = $request->get_json_params(); // Implement your logic here // Return a response if needed return rest_ensure_response(array('message' => 'Webhook received successfully')); } add_action('rest_api_init', 'custom_webhook_endpoint'); function trigger_webhook_on_new_event($new_status, $old_status, $post) { // Check if the post type is 'event' error_log('New Status: ' . $new_status); error_log('Old Status: ' . $old_status); if ($post->post_type === 'event') { // Check if the post is being published (new or update) if ($post->post_type === 'event' && $new_status === 'publish' && $old_status !== 'publish') { // This is a new post // Set up the URL for your Python web handler for new posts $webhook_base = 'http://localhost:5000/webhook/add'; } elseif ($new_status === 'publish') { // This is an update that changes the post_status to publish // Set up the URL for your Python web handler for updates that publish $webhook_base = 'http://localhost:5000/webhook/modify'; } // Get post meta data $all_post_meta = get_post_meta($post->ID); $start = isset($all_post_meta['start'][0]) ? $all_post_meta['start'][0] : ''; // Define the data you want to send in the POST request $data = array( 'id' => $post->ID, 'description' => $post->post_content, 'excerpt' => $post->post_excerpt, 'title' => $post->post_title, 'url' => get_permalink($post->ID), 'start' => $start, ); // Send a POST request to your Python web handler $response = wp_safe_remote_post($webhook_base, array( 'body' => json_encode($data), 'headers' => array('Content-Type' => 'application/json'), )); // Check for errors in the response, if needed if (is_wp_error($response)) { // Handle errors here error_log('Webhook error: ' . $response->get_error_message()); } } } add_action('transition_post_status', 'trigger_webhook_on_new_event', 10, 3); function trigger_webhook_on_new_event($new_status, $old_status, $post) { // Check if the post type is 'event' error_log('New Status: ' . $new_status); error_log('Old Status: ' . $old_status); if ($post->post_type === 'event') { // Check if the post is being published (new or update) if ($post->post_type === 'event' && $new_status === 'publish' && $old_status !== 'publish') { // This is a new post // Set up the URL for your Python web handler for new posts $webhook_base = 'http://localhost:5000/webhook/add'; } elseif ($new_status === 'publish') { // This is an update that changes the post_status to publish // Set up the URL for your Python web handler for updates that publish $webhook_base = 'http://localhost:5000/webhook/modify'; } // Get post meta data $all_post_meta = get_post_meta($post->ID); $start = isset($all_post_meta['start'][0]) ? $all_post_meta['start'][0] : ''; // Define the data you want to send in the POST request $data = array( 'id' => $post->ID, 'description' => $post->post_content, 'excerpt' => $post->post_excerpt, 'title' => $post->post_title, 'url' => get_permalink($post->ID), 'start' => $start, ); // Send a POST request to your Python web handler $response = wp_safe_remote_post($webhook_base, array( 'body' => json_encode($data), 'headers' => array('Content-Type' => 'application/json'), )); // Check for errors in the response, if needed if (is_wp_error($response)) { // Handle errors here error_log('Webhook error: ' . $response->get_error_message()); } } } add_action('transition_post_status', 'trigger_webhook_on_new_event', 10, 3);python_webhandler.py
from flask import Flask, request app = Flask(__name__) # Import the google_maps class here from google_maps import google_maps # Create an instance of the google_maps class google_maps_instance = google_maps() # Create variables to track the last post ID for modify and add webhooks # WordPress call save post twice. I don't know why. last_modify_post_id = None last_add_post_id = None @app.route('/webhook/modify', methods=['POST']) def receive_webhook_modify(): global last_modify_post_id # Get the JSON data from the incoming webhook request data = request.json # Check if the received post ID is the same as the last one for modify if data['id'] == last_modify_post_id: print("Webhook already processed for modify with post ID:", last_modify_post_id) return "Webhook already processed" # If it's a new post ID, process the webhook for modify last_modify_post_id = data['id'] print("Received Webhook on modify:") print(data) # You can add your custom logic here to process the webhook data for modify return "Webhook received successfully" @app.route('/webhook/add', methods=['POST']) def receive_webhook_add(): global last_add_post_id # Get the JSON data from the incoming webhook request data = request.json # Check if the received post ID is the same as the last one for add if data['id'] == last_add_post_id: print("Webhook already processed for add with post ID:", last_add_post_id) return "Webhook already processed" # If it's a new post ID, process the webhook for add last_add_post_id = data['id'] print("Received Webhook on add:") print(data) # You can add your custom logic here to process the webhook data for add google_maps_instance.create_event(data) return "Webhook received successfully" if __name__ == '__main__': app.run(port=5000)
Das Thema „Webhooks verwenden“ ist für neue Antworten geschlossen.