Forked from jessepearson/adding_new_webhook_topics.php
Created
September 14, 2023 10:27
-
-
Save TioBorracho/54583b87c57ac86896f464ca358f9b98 to your computer and use it in GitHub Desktop.
How to add a new custom Webhook topic in WooCommerce, with example of order filtering.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php // do not copy this line | |
/** | |
* add_new_topic_hooks will add a new webhook topic hook. | |
* @param array $topic_hooks Esxisting topic hooks. | |
*/ | |
function add_new_topic_hooks( $topic_hooks ) { | |
// Array that has the topic as resource.event with arrays of actions that call that topic. | |
$new_hooks = array( | |
'order.custom_filter' => array( | |
'custom_order_filter', | |
), | |
); | |
return array_merge( $topic_hooks, $new_hooks ); | |
} | |
add_filter( 'woocommerce_webhook_topic_hooks', 'add_new_topic_hooks' ); | |
/** | |
* add_new_topic_events will add new events for topic resources. | |
* @param array $topic_events Existing valid events for resources. | |
*/ | |
function add_new_topic_events( $topic_events ) { | |
// New events to be used for resources. | |
$new_events = array( | |
'custom_filter', | |
); | |
return array_merge( $topic_events, $new_events ); | |
} | |
add_filter( 'woocommerce_valid_webhook_events', 'add_new_topic_events' ); | |
/** | |
* add_new_webhook_topics adds the new webhook to the dropdown list on the Webhook page. | |
* @param array $topics Array of topics with the i18n proper name. | |
*/ | |
function add_new_webhook_topics( $topics ) { | |
// New topic array to add to the list, must match hooks being created. | |
$new_topics = array( | |
'order.custom_filter' => __( 'Order Custom Filter', 'woocommerce' ), | |
); | |
return array_merge( $topics, $new_topics ); | |
} | |
add_filter( 'woocommerce_webhook_topics', 'add_new_webhook_topics' ); | |
/** | |
* my_order_item_check will check an order when it is created through the checkout form, | |
* if it has product ID 10603 as one of the items, it will fire off the action `custom_order_filter` | |
* | |
* @param int $order_id The ID of the order that was just created. | |
* @param array $posted_data Array of all of the data that was posted through checkout form. | |
* @param object $order The order object. | |
* @return null | |
*/ | |
function my_order_item_check( $order_id, $posted_data, $order ) { | |
$order = wc_get_order( $order_id ); | |
$items = $order->get_items(); | |
foreach ( $items as $item ) { | |
if ( is_a( $item, 'WC_Order_Item_Product' ) ) { | |
if ( 10603 === $item->get_product_id() ) { | |
do_action( 'custom_order_filter', $order_id, $posted_data, $order ); | |
return; | |
} | |
} | |
} | |
} | |
add_action( 'woocommerce_checkout_order_processed', 'my_order_item_check', 10, 3 ); | |
/** | |
* The two below actions are what the order.created webhook is tied into, it is up to you to use these if you wish. | |
*/ | |
// add_action( 'woocommerce_process_shop_order_meta', 'my_order_item_check' ); | |
// add_action( 'woocommerce_api_create_order', 'my_order_item_check' ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment