512 || preg_match( '/\s/', $value ) ) { return ''; } return $value; } function x_pixel_sanitize_token( $value ) { $current = (string) get_option( X_PIXEL_OPTION_CAPI, '' ); if ( ! is_string( $value ) || trim( $value ) === '' ) { return $current; } $token = x_pixel_clean_token( $value ); if ( $token === '' ) { add_settings_error( X_PIXEL_OPTION_CAPI, 'x_pixel_capi_token_invalid', __( 'The Conversion API token was not saved because it contains spaces or is too long.', 'x-pixel' ) ); return $current; } return $token; } function x_pixel_register_settings() { $fields = array( X_PIXEL_OPTION_ID => 'x_pixel_sanitize_id', X_PIXEL_OPTION_CAPI => 'x_pixel_sanitize_token', X_PIXEL_OPTION_EVENT_PURCHASE => 'x_pixel_sanitize_id', X_PIXEL_OPTION_EVENT_ATC => 'x_pixel_sanitize_id', X_PIXEL_OPTION_EVENT_CHECKOUT => 'x_pixel_sanitize_id', X_PIXEL_OPTION_EVENT_VIEW => 'x_pixel_sanitize_id', ); foreach ( $fields as $option => $callback ) { register_setting( X_PIXEL_OPTION_GROUP, $option, array( 'type' => 'string', 'sanitize_callback' => $callback, 'default' => '', 'show_in_rest' => false, ) ); } add_settings_section( 'x_pixel_main', '', '__return_false', 'x-pixel' ); add_settings_field( X_PIXEL_OPTION_ID, __( 'Pixel ID', 'x-pixel' ), 'x_pixel_render_id_field', 'x-pixel', 'x_pixel_main' ); add_settings_field( X_PIXEL_OPTION_CAPI, __( 'Conversion API token', 'x-pixel' ), 'x_pixel_render_capi_field', 'x-pixel', 'x_pixel_main' ); add_settings_field( X_PIXEL_OPTION_EVENT_PURCHASE, __( 'Purchase event ID', 'x-pixel' ), 'x_pixel_render_event_purchase_field', 'x-pixel', 'x_pixel_main' ); add_settings_field( X_PIXEL_OPTION_EVENT_ATC, __( 'Add to cart event ID', 'x-pixel' ), 'x_pixel_render_event_atc_field', 'x-pixel', 'x_pixel_main' ); add_settings_field( X_PIXEL_OPTION_EVENT_CHECKOUT, __( 'Checkout event ID', 'x-pixel' ), 'x_pixel_render_event_checkout_field', 'x-pixel', 'x_pixel_main' ); add_settings_field( X_PIXEL_OPTION_EVENT_VIEW, __( 'Content view event ID', 'x-pixel' ), 'x_pixel_render_event_view_field', 'x-pixel', 'x_pixel_main' ); } add_action( 'admin_init', 'x_pixel_register_settings' ); function x_pixel_render_text_field( $option, $description ) { $value = get_option( $option, '' ); printf( '', esc_attr( $option ), esc_attr( $value ) ); echo '

' . esc_html( $description ) . '

'; } function x_pixel_render_id_field() { x_pixel_render_text_field( X_PIXEL_OPTION_ID, __( 'From X Ads Manager → Events Manager → Install Pixel.', 'x-pixel' ) ); } function x_pixel_render_capi_field() { $saved = get_option( X_PIXEL_OPTION_CAPI, '' ) !== ''; printf( '', esc_attr( X_PIXEL_OPTION_CAPI ), esc_attr( $saved ? __( 'Token saved. Leave blank to keep it.', 'x-pixel' ) : '' ) ); echo '

'; echo esc_html__( 'Optional. Generate in Events Manager → Conversion API. Used for server-side events.', 'x-pixel' ); echo '

'; } function x_pixel_render_event_purchase_field() { x_pixel_render_text_field( X_PIXEL_OPTION_EVENT_PURCHASE, __( 'Optional. Web event tag ID for purchases (WooCommerce, Easy Digital Downloads, WP eCommerce).', 'x-pixel' ) ); } function x_pixel_render_event_atc_field() { x_pixel_render_text_field( X_PIXEL_OPTION_EVENT_ATC, __( 'Optional. Web event tag ID for add to cart (WooCommerce, Easy Digital Downloads, WP eCommerce).', 'x-pixel' ) ); } function x_pixel_render_event_checkout_field() { x_pixel_render_text_field( X_PIXEL_OPTION_EVENT_CHECKOUT, __( 'Optional. Web event tag ID for checkout started (WooCommerce, Easy Digital Downloads, WP eCommerce).', 'x-pixel' ) ); } function x_pixel_render_event_view_field() { x_pixel_render_text_field( X_PIXEL_OPTION_EVENT_VIEW, __( 'Optional. Web event tag ID for product views (WooCommerce, Easy Digital Downloads, WP eCommerce).', 'x-pixel' ) ); } function x_pixel_add_settings_page() { add_options_page( __( 'X Pixel', 'x-pixel' ), __( 'X Pixel', 'x-pixel' ), 'manage_options', 'x-pixel', 'x_pixel_render_settings_page' ); } add_action( 'admin_menu', 'x_pixel_add_settings_page' ); function x_pixel_render_settings_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } echo '
'; echo '

' . esc_html__( 'X Pixel', 'x-pixel' ) . '

'; echo '

'; echo ''; echo get_option( X_PIXEL_OPTION_ID, '' ) !== '' ? esc_html__( 'Reconnect X Ads', 'x-pixel' ) : esc_html__( 'Connect X Ads', 'x-pixel' ); echo ''; if ( get_option( X_PIXEL_OPTION_ID, '' ) !== '' ) { echo ' '; echo esc_html__( 'Disconnect', 'x-pixel' ); echo ''; } echo '

'; echo '

'; echo esc_html__( 'Connects this site to your X Ads account, creates a pixel if needed, and fills in the Pixel ID, Conversion API token, and store event IDs used by WooCommerce, Easy Digital Downloads, and WP eCommerce. You can also paste those values below.', 'x-pixel' ); echo '

'; echo '

'; echo esc_html__( 'Once a Pixel ID is saved, visitors load the X pixel script from static.ads-twitter.com and store events are sent to X. You are responsible for any visitor consent notice required in your jurisdiction.', 'x-pixel' ); echo ' ' . esc_html__( 'X Privacy Policy', 'x-pixel' ) . ''; echo ' | ' . esc_html__( 'X Terms of Service', 'x-pixel' ) . ''; echo '

'; echo '
'; settings_fields( X_PIXEL_OPTION_GROUP ); do_settings_sections( 'x-pixel' ); submit_button(); echo '
'; echo '
'; } function x_pixel_plugin_action_links( $links ) { $url = admin_url( 'options-general.php?page=x-pixel' ); $links[] = '' . esc_html__( 'Settings', 'x-pixel' ) . ''; return $links; } add_filter( 'plugin_action_links_' . plugin_basename( X_PIXEL_FILE ), 'x_pixel_plugin_action_links' );