register_init_hook(); } return self::$instance; } private function register_scripts() { /** * Paypal heavily discourages putting that script in your own server: * @see https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/add-paypal-button/ */ wp_register_script( 'paypal-checkout-js', 'https://www.paypalobjects.com/api/checkout.js', array(), null, true ); wp_register_script( 'paypal-express-checkout', plugins_url( '/paypal-express-checkout.js', __FILE__ ), array( 'jquery', 'paypal-checkout-js' ), self::$version ); } private function register_init_hook() { add_action( 'init', array( $this, 'init_hook_action' ) ); } private function register_shortcode() { add_shortcode( self::$shortcode, array( $this, 'parse_shortcode' ) ); } public function init_hook_action() { add_filter( 'rest_api_allowed_post_types', array( $this, 'allow_rest_api_types' ) ); add_filter( 'jetpack_sync_post_meta_whitelist', array( $this, 'allow_sync_post_meta' ) ); $this->register_scripts(); $this->register_shortcode(); $this->setup_cpts(); add_filter( 'the_content', array( $this, 'remove_auto_paragraph_from_product_description' ), 0 ); } function remove_auto_paragraph_from_product_description( $content ) { if ( get_post_type() === self::$post_type_product ) { remove_filter( 'the_content', 'wpautop' ); } return $content; } function get_blog_id() { if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) { return get_current_blog_id(); } return Jetpack_Options::get_option( 'id' ); } function parse_shortcode( $attrs, $content = false ) { if ( empty( $attrs['id'] ) ) { return; } $product = get_post( $attrs['id'] ); if ( ! $product || is_wp_error( $product ) ) { return; } if ( $product->post_type !== self::$post_type_product ) { return; } // We allow for overriding the presentation labels $data = shortcode_atts( array( 'blog_id' => $this->get_blog_id(), 'dom_id' => uniqid( self::$css_classname_prefix . '-' . $product->ID . '_', true ), 'class' => self::$css_classname_prefix . '-' . $product->ID, 'title' => get_the_title( $product ), 'description' => $product->post_content, 'cta' => get_post_meta( $product->ID, 'spay_cta', true ), 'multiple' => get_post_meta( $product->ID, 'spay_multiple', true ) || '0' ), $attrs ); $data['price'] = $this->format_price( get_post_meta( $product->ID, 'spay_formatted_price', true ), get_post_meta( $product->ID, 'spay_price', true ), get_post_meta( $product->ID, 'spay_currency', true ), $data ); $data['id'] = $attrs['id']; if ( ! wp_script_is( 'paypal-express-checkout', 'enqueued' ) ) { wp_enqueue_script( 'paypal-express-checkout' ); } if ( ! wp_style_is( 'simple-payments', 'enqueued' ) ) { wp_enqueue_style( 'simple-payments', plugins_url( 'simple-payments.css', __FILE__ ) ); } wp_add_inline_script( 'paypal-express-checkout', sprintf( "try{PaypalExpressCheckout.renderButton( '%d', '%d', '%s', '%d' );}catch(e){}", esc_js( $data['blog_id'] ), esc_js( $attrs['id'] ), esc_js( $data['dom_id'] ), esc_js( $data['multiple'] ) ) ); return $this->output_shortcode( $data ); } function output_shortcode( $data ) { $items = ''; $css_prefix = self::$css_classname_prefix; if ( $data['multiple'] ) { $items="
"; } $image = ""; if( has_post_thumbnail( $data['id'] ) ) { $image = "
" . get_the_post_thumbnail( $data['id'], 'full' ) . "
"; } return "
{$image}

{$data['title']}

{$data['description']}

{$data['price']}

{$items}
"; } function format_price( $formatted_price, $price, $currency, $all_data ) { if ( $formatted_price ) { return $formatted_price; } return "$price $currency"; } /** * Allows custom post types to be used by REST API. * @param $post_types * @see hook 'rest_api_allowed_post_types' * @return array */ function allow_rest_api_types( $post_types ) { $post_types[] = self::$post_type_order; $post_types[] = self::$post_type_product; return $post_types; } function allow_sync_post_meta( $post_meta ) { return array_merge( $post_meta, array( 'spay_paypal_id', 'spay_status', 'spay_product_id', 'spay_quantity', 'spay_price', 'spay_customer_email', 'spay_currency', 'spay_cta', 'spay_email', 'spay_multiple', 'spay_formatted_price', ) ); } /** * Sets up the custom post types for the module. */ function setup_cpts() { /* * ORDER data structure. holds: * title = customer_name | 4xproduct_name * excerpt = customer_name + customer contact info + customer notes from paypal form * metadata: * spay_paypal_id - paypal id of transaction * spay_status * spay_product_id - post_id of bought product * spay_quantity - quantity of product * spay_price - item price at the time of purchase * spay_customer_email - customer email * ... (WIP) */ $order_capabilities = array( 'edit_post' => 'edit_posts', 'read_post' => 'read_private_posts', 'delete_post' => 'delete_posts', 'edit_posts' => 'edit_posts', 'edit_others_posts' => 'edit_others_posts', 'publish_posts' => 'publish_posts', 'read_private_posts' => 'read_private_posts', ); $order_args = array( 'label' => esc_html__( 'Order', 'jetpack' ), 'description' => esc_html__( 'Simple Payments orders', 'jetpack' ), 'supports' => array( 'custom-fields', 'excerpt' ), 'hierarchical' => false, 'public' => false, 'show_ui' => false, 'show_in_menu' => false, 'show_in_admin_bar' => false, 'show_in_nav_menus' => false, 'can_export' => true, 'has_archive' => false, 'exclude_from_search' => true, 'publicly_queryable' => false, 'rewrite' => false, 'capabilities' => $order_capabilities, 'show_in_rest' => true, ); register_post_type( self::$post_type_order, $order_args ); /* * PRODUCT data structure. Holds: * title - title * content - description * thumbnail - image * metadata: * spay_price - price * spay_formatted_price * spay_currency - currency code * spay_cta - text with "Buy" or other CTA * spay_email - paypal email * spay_multiple - allow for multiple items * spay_status - status. { enabled | disabled } */ $product_capabilities = array( 'edit_post' => 'edit_posts', 'read_post' => 'read_private_posts', 'delete_post' => 'delete_posts', 'edit_posts' => 'edit_posts', 'edit_others_posts' => 'edit_others_posts', 'publish_posts' => 'publish_posts', 'read_private_posts' => 'read_private_posts', ); $product_args = array( 'label' => esc_html__( 'Product', 'jetpack' ), 'description' => esc_html__( 'Simple Payments products', 'jetpack' ), 'supports' => array( 'title', 'editor','thumbnail', 'custom-fields' ), 'hierarchical' => false, 'public' => false, 'show_ui' => false, 'show_in_menu' => false, 'show_in_admin_bar' => false, 'show_in_nav_menus' => false, 'can_export' => true, 'has_archive' => false, 'exclude_from_search' => true, 'publicly_queryable' => false, 'rewrite' => false, 'capabilities' => $product_capabilities, 'show_in_rest' => true, ); register_post_type( self::$post_type_product, $product_args ); } } Jetpack_Simple_Payments::getInstance();