'webhook', 'plural' => 'webhooks', 'ajax' => false, ) ); } /** * No items found text. */ public function no_items() { esc_html_e( 'No webhooks found.', 'woocommerce' ); } /** * Get list columns. * * @return array */ public function get_columns() { return array( 'cb' => '', 'title' => __( 'Name', 'woocommerce' ), 'status' => __( 'Status', 'woocommerce' ), 'topic' => __( 'Topic', 'woocommerce' ), 'delivery_url' => __( 'Delivery URL', 'woocommerce' ), ); } /** * Column cb. * * @param WC_Webhook $webhook Webhook instance. * @return string */ public function column_cb( $webhook ) { return sprintf( '', $this->_args['singular'], $webhook->get_id() ); } /** * Return title column. * * @param WC_Webhook $webhook Webhook instance. * @return string */ public function column_title( $webhook ) { $edit_link = admin_url( 'admin.php?page=wc-settings&tab=advanced&section=webhooks&edit-webhook=' . $webhook->get_id() ); $output = ''; // Title. $output .= '' . esc_html( $webhook->get_name() ) . ''; // Get actions. $actions = array( /* translators: %s: webhook ID. */ 'id' => sprintf( __( 'ID: %d', 'woocommerce' ), $webhook->get_id() ), 'edit' => '' . esc_html__( 'Edit', 'woocommerce' ) . '', /* translators: %s: webhook name */ 'delete' => 'get_name() ) ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'delete' => $webhook->get_id(), ), admin_url( 'admin.php?page=wc-settings&tab=advanced§ion=webhooks' ) ), 'delete-webhook' ) ) . '">' . esc_html__( 'Delete permanently', 'woocommerce' ) . '', ); $actions = apply_filters( 'webhook_row_actions', $actions, $webhook ); $row_actions = array(); foreach ( $actions as $action => $link ) { $row_actions[] = '' . $link . ''; } $output .= '
' . implode( ' | ', $row_actions ) . '
'; return $output; } /** * Return status column. * * @param WC_Webhook $webhook Webhook instance. * @return string */ public function column_status( $webhook ) { return $webhook->get_i18n_status(); } /** * Return topic column. * * @param WC_Webhook $webhook Webhook instance. * @return string */ public function column_topic( $webhook ) { return $webhook->get_topic(); } /** * Return delivery URL column. * * @param WC_Webhook $webhook Webhook instance. * @return string */ public function column_delivery_url( $webhook ) { return $webhook->get_delivery_url(); } /** * Get the status label for webhooks. * * @param string $status_name Status name. * @param int $amount Amount of webhooks. * @return array */ private function get_status_label( $status_name, $amount ) { $statuses = wc_get_webhook_statuses(); if ( isset( $statuses[ $status_name ] ) ) { return array( 'singular' => sprintf( '%s (%s)', esc_html( $statuses[ $status_name ] ), $amount ), 'plural' => sprintf( '%s (%s)', esc_html( $statuses[ $status_name ] ), $amount ), 'context' => '', 'domain' => 'woocommerce', ); } return array( 'singular' => sprintf( '%s (%s)', esc_html( $status_name ), $amount ), 'plural' => sprintf( '%s (%s)', esc_html( $status_name ), $amount ), 'context' => '', 'domain' => 'woocommerce', ); } /** * Table list views. * * @return array */ protected function get_views() { $status_links = array(); $data_store = WC_Data_Store::load( 'webhook' ); $num_webhooks = $data_store->get_count_webhooks_by_status(); $total_webhooks = array_sum( (array) $num_webhooks ); $statuses = array_keys( wc_get_webhook_statuses() ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended $class = empty( $_REQUEST['status'] ) && empty( $_REQUEST['legacy'] ) ? ' class="current"' : ''; /* translators: %s: count */ $status_links['all'] = "" . sprintf( _nx( 'All (%s)', 'All (%s)', $total_webhooks, 'posts', 'woocommerce' ), number_format_i18n( $total_webhooks ) ) . ''; foreach ( $statuses as $status_name ) { $class = ''; if ( empty( $num_webhooks[ $status_name ] ) ) { continue; } // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( isset( $_REQUEST['status'] ) && sanitize_key( wp_unslash( $_REQUEST['status'] ) ) === $status_name ) { $class = ' class="current"'; } $label = $this->get_status_label( $status_name, $num_webhooks[ $status_name ] ); $status_links[ $status_name ] = "" . sprintf( translate_nooped_plural( $label, $num_webhooks[ $status_name ] ), number_format_i18n( $num_webhooks[ $status_name ] ) ) . ''; } $legacy_webhooks_count = wc_get_container()->get( WebhookUtil::class )->get_legacy_webhooks_count(); if ( $legacy_webhooks_count > 0 ) { $class = ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( 'true' === sanitize_key( wp_unslash( $_REQUEST['legacy'] ?? '' ) ) ) { $class = ' class="current"'; } $label = $this->get_status_label( __( 'Legacy', 'woocommerce' ), $legacy_webhooks_count ); $status_links['legacy'] = "" . sprintf( translate_nooped_plural( $label, $legacy_webhooks_count ), number_format_i18n( $legacy_webhooks_count ) ) . ''; } return $status_links; } /** * Get bulk actions. * * @return array */ protected function get_bulk_actions() { return array( 'delete' => __( 'Delete permanently', 'woocommerce' ), ); } /** * Process bulk actions. */ public function process_bulk_action() { $action = $this->current_action(); $webhooks = isset( $_REQUEST['webhook'] ) ? array_map( 'absint', (array) $_REQUEST['webhook'] ) : array(); // WPCS: input var okay, CSRF ok. if ( false !== $action ) { check_admin_referer( 'woocommerce-settings' ); if ( ! current_user_can( 'manage_woocommerce' ) ) { wp_die( esc_html__( 'You do not have permission to edit Webhooks', 'woocommerce' ) ); } if ( 'delete' === $action ) { WC_Admin_Webhooks::bulk_delete( $webhooks ); } } } /** * Generate the table navigation above or below the table. * Included to remove extra nonce input. * * @param string $which The location of the extra table nav markup: 'top' or 'bottom'. */ protected function display_tablenav( $which ) { echo '
'; if ( $this->has_items() ) { echo '
'; $this->bulk_actions( $which ); echo '
'; } $this->extra_tablenav( $which ); $this->pagination( $which ); echo '
'; echo '
'; } /** * Search box. * * @param string $text Button text. * @param string $input_id Input ID. */ public function search_box( $text, $input_id ) { if ( empty( $_REQUEST['s'] ) && ! $this->has_items() ) { // WPCS: input var okay, CSRF ok. return; } $input_id = $input_id . '-search-input'; $search_query = isset( $_REQUEST['s'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['s'] ) ) : ''; // WPCS: input var okay, CSRF ok. echo ''; } /** * Prepare table list items. */ public function prepare_items() { $per_page = $this->get_items_per_page( 'woocommerce_webhooks_per_page' ); $current_page = $this->get_pagenum(); // Query args. $args = array( 'limit' => $per_page, 'offset' => $per_page * ( $current_page - 1 ), ); // Handle the status query. if ( ! empty( $_REQUEST['status'] ) ) { // WPCS: input var okay, CSRF ok. $args['status'] = sanitize_key( wp_unslash( $_REQUEST['status'] ) ); // WPCS: input var okay, CSRF ok. } if ( ! empty( $_REQUEST['s'] ) ) { // WPCS: input var okay, CSRF ok. $args['search'] = sanitize_text_field( wp_unslash( $_REQUEST['s'] ) ); // WPCS: input var okay, CSRF ok. } $args['paginate'] = true; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( 'true' === sanitize_key( wp_unslash( $_REQUEST['legacy'] ?? null ) ) ) { $args['api_version'] = -1; } // Get the webhooks. $data_store = WC_Data_Store::load( 'webhook' ); $webhooks = $data_store->search_webhooks( $args ); $this->items = array_map( 'wc_get_webhook', $webhooks->webhooks ); // Set the pagination. $this->set_pagination_args( array( 'total_items' => $webhooks->total, 'per_page' => $per_page, 'total_pages' => $webhooks->max_num_pages, ) ); } }