'', 'button_text' => '', ); /** * Merges external product data into the parent object. * @param int|WC_Product|object $product Product to init. */ public function __construct( $product = 0 ) { $this->data = array_merge( $this->data, $this->extra_data ); parent::__construct( $product ); } /* |-------------------------------------------------------------------------- | Getters |-------------------------------------------------------------------------- | | Methods for getting data from the product object. */ /** * Get internal type. * @return string */ public function get_type() { return 'external'; } /** * Get product url. * * @return string */ public function get_product_url() { return esc_url( $this->data['product_url'] ); } /** * Get button text. * * @return string */ public function get_button_text() { return $this->data['button_text'] ? $this->data['button_text'] : __( 'Buy product', 'woocommerce' ); } /* |-------------------------------------------------------------------------- | Setters |-------------------------------------------------------------------------- | | Functions for setting product data. These should not update anything in the | database itself and should only change what is stored in the class | object. */ /** * Set product URL. * * @since 2.7.0 * @param string $product_url Product URL. */ public function set_product_url( $product_url ) { $this->data['product_url'] = $product_url; } /** * Set button text. * * @since 2.7.0 * @param string $button_text Button text. */ public function set_button_text( $button_text ) { $this->data['button_text'] = $button_text; } /** * External products cannot be stock managed. * * @since 2.7.0 * @param bool */ public function set_manage_stock( $manage_stock ) { $this->data['manage_stock'] = false; if ( true === $manage_stock ) { $this->error( 'product_external_invalid_manage_stock', __( 'External products cannot be stock managed.', 'woocommerce' ) ); } } /** * External products cannot be stock managed. * * @since 2.7.0 * @param bool */ public function set_stock_status( $stock_status ) { $this->data['stock_status'] = 'instock'; if ( 'instock' !== $stock_status ) { $this->error( 'product_external_invalid_stock_status', __( 'External products cannot be stock managed.', 'woocommerce' ) ); } } /** * xternal products cannot be backordered. * * @since 2.7.0 * @param string $backorders Options: 'yes', 'no' or 'notify'. */ public function set_backorders( $backorders ) { $this->data['backorders'] = 'no'; if ( 'no' !== $backorders ) { $this->error( 'product_external_invalid_backorders', __( 'External products cannot be backordered.', 'woocommerce' ) ); } } /* |-------------------------------------------------------------------------- | Other Actions |-------------------------------------------------------------------------- */ /** * Returns false if the product cannot be bought. * * @access public * @return bool */ public function is_purchasable() { return apply_filters( 'woocommerce_is_purchasable', false, $this ); } /** * Get the add to url used mainly in loops. * * @access public * @return string */ public function add_to_cart_url() { return apply_filters( 'woocommerce_product_add_to_cart_url', $this->get_product_url(), $this ); } /** * Get the add to cart button text for the single page. * * @access public * @return string */ public function single_add_to_cart_text() { return apply_filters( 'woocommerce_product_single_add_to_cart_text', $this->get_button_text(), $this ); } /** * Get the add to cart button text. * * @access public * @return string */ public function add_to_cart_text() { return apply_filters( 'woocommerce_product_single_add_to_cart_text', $this->get_button_text(), $this ); } /* |-------------------------------------------------------------------------- | CRUD methods |-------------------------------------------------------------------------- */ /** * Reads a product from the database and sets its data to the class. * * @since 2.7.0 * @param int $id Product ID. */ public function read( $id ) { parent::read( $id ); $this->set_props( array( 'product_url' => get_post_meta( $id, '_product_url', true ), 'button_text' => get_post_meta( $id, '_button_text', true ), ) ); do_action( 'woocommerce_product_loaded', $this ); do_action( 'woocommerce_product_' . $this->get_type() . '_loaded', $this ); } /** * Helper method that updates all the post meta for an external product. * * @since 2.7.0 */ protected function update_post_meta() { parent::update_post_meta(); update_post_meta( $this->get_id(), '_product_url', $this->get_product_url() ); update_post_meta( $this->get_id(), '_button_text', $this->get_button_text() ); } }