Добавление персонализированного типа сообщения / публикации в Woocommerce

У меня есть личная тема «А», и я хочу, чтобы она также могла работать без Woocommerce. Когда добавлен плагин Woocommerce «WC», я бы интегрировал продукты A с WC. У меня есть пользовательский тип сообщения, называемый «объекты», как я могу сделать «объект» доступным для покупки через WC?

Я уже видел этот ответ на StackOverflow. Добавление пользовательских типов сообщений в Woocommerce. Решение в конце дает бесплатный (не более) плагин для решения.

Я бы предпочел сделать это самостоятельно, без помощи плагина. Мне любопытно, и предварительное решение не то, что я ищу.

Мы можем попробовать легко. Вы хотите, чтобы пользовательский тип сообщения сохранял ваши продукты, а когда WooCommerce интегрирован, добавленные продукты в вашем пользовательском типе сообщений могут работать как продукты woocommerce.

  1. Проверьте, установлена ​​ли woocommerce ot not.

  2. Если нет, то создайте собственный тип сообщения как «продукт» (аналогично woocommerce).

  3. Добавьте настраиваемые поля, похожие на Woocommerce, и добавьте в них продукты. (Изображение добавлено для пользовательских полей с помощью Woocommerce)
  4. Теперь добавьте продукты под настраиваемый тип сообщений, и когда будет добавлена ​​woocommerce, у него возникнет проблема с тем, что пользовательский тип сообщения уже существует.
  5. Поэтому, если в будущем вы хотите добавить woocommerce на свой сайт, отключите функцию register_post_Type и установите WooCommerce.
  6. Все продукты, созданные в пользовательском типе сообщения, будут видны в вариантах продуктов Woocommerce.

Чтобы проверить, активен ли woocommerce или нет, этот код

<?php if ( class_exists( 'WooCommerce' ) ) { // code that requires WooCommerce } else { // you don't appear to have WooCommerce activated } ?> 

введите описание изображения здесь

Я создал простой учебник, поскольку добавление его здесь было бы слишком длинным.

Чтобы достичь своей цели, ваш тип сообщения должен иметь цену. Тем не менее, пользовательское поле цены должно иметь мета-ключ _price .

если у вас уже есть мета-ключ, который не является _price , вы можете добавить фильтр в woocommerce_get_price показанный ниже.

 add_filter('woocommerce_get_price','reigel_woocommerce_get_price',20,2); function reigel_woocommerce_get_price($price,$post){ if ($post->post->post_type === 'post') // change this to your post type $price = get_post_meta($post->id, "price", true); // assuming your price meta key is price return $price; } 

При этом теперь вы можете добавить любое сообщение в свой тип сообщения в корзину. Сделайте так, как http://localhost/wordpress/cart/?add-to-cart=1 где 1 – это идентификатор вашего сообщения в вашем типе сообщения.

Образец результата изображения после посещения этой ссылки:

reigelgallarde.me

Теперь вам нужно настроить форму, как показано ниже.

 <form action="" method="post"> <input name="add-to-cart" type="hidden" value="<?php echo $post->ID ?>" /> <input name="quantity" type="number" value="1" min="1" /> <input name="submit" type="submit" value="Add to cart" /> </form> 

вам нужно иметь это, чтобы получить кнопку «Добавить в корзину». Имя входов должно быть как есть.

Я столкнулся с той же проблемой. Проведя дни, я понял, как он должен работать и его решение.

Вот что я сделал

  1. Сохраняйте мета-цену в качестве _price для моей персонализированной почты
  2. Изменено условие if в классе woocommerce/includes/class-wc-product-factory.php Функция get_product_class следующим образом:

    до

     if ( 'product' === $post_type){ 

    после

     if ( 'product' === $post_type || 'packages' === $post_type ){ 

Он отлично работал.

Теперь я хочу изменить этот тип продукта, используя некоторый метод фильтрации. Кто-нибудь может сообщить мне об этом:

 if ( 'product' === $post_type || 'packages' === $post_type ){ 

Я продаю плагин, который позволит использовать Custom Post Type как «продукт» WooCommerce . Я много работал над этим, чтобы сделать его совместимым с WooCommerce 3.0

Но вот самая важная часть.
Вы должны создать свой собственный хранилище данных, например:

сначала создайте класс, который распространяется на WC_Product_Data_Store_CPT . Идея состоит в том, чтобы перезаписать существующую функцию этого класса, которая проверяет тип сообщения. Я нашел read и get_product_type который выполняет проверку.

 class WCCPT_Product_Data_Store_CPT extends WC_Product_Data_Store_CPT { /** * Method to read a product from the database. * @param WC_Product */ public function read( &$product ) { $product->set_defaults(); if ( ! $product->get_id() || ! ( $post_object = get_post( $product->get_id() ) ) || ! in_array( $post_object->post_type, array( 'birds', 'product' ) ) ) { // change birds with your post type throw new Exception( __( 'Invalid product.', 'woocommerce' ) ); } $id = $product->get_id(); $product->set_props( array( 'name' => $post_object->post_title, 'slug' => $post_object->post_name, 'date_created' => 0 < $post_object->post_date_gmt ? wc_string_to_timestamp( $post_object->post_date_gmt ) : null, 'date_modified' => 0 < $post_object->post_modified_gmt ? wc_string_to_timestamp( $post_object->post_modified_gmt ) : null, 'status' => $post_object->post_status, 'description' => $post_object->post_content, 'short_description' => $post_object->post_excerpt, 'parent_id' => $post_object->post_parent, 'menu_order' => $post_object->menu_order, 'reviews_allowed' => 'open' === $post_object->comment_status, ) ); $this->read_attributes( $product ); $this->read_downloads( $product ); $this->read_visibility( $product ); $this->read_product_data( $product ); $this->read_extra_data( $product ); $product->set_object_read( true ); } /** * Get the product type based on product ID. * * @since 3.0.0 * @param int $product_id * @return bool|string */ public function get_product_type( $product_id ) { $post_type = get_post_type( $product_id ); if ( 'product_variation' === $post_type ) { return 'variation'; } elseif ( in_array( $post_type, array( 'birds', 'product' ) ) ) { // change birds with your post type $terms = get_the_terms( $product_id, 'product_type' ); return ! empty( $terms ) ? sanitize_title( current( $terms )->name ) : 'simple'; } else { return false; } } } 

после этого добавьте фильтр в woocommerce_data_stores и используйте свой класс.

 add_filter( 'woocommerce_data_stores', 'woocommerce_data_stores' ); function woocommerce_data_stores ( $stores ) { $stores['product'] = 'WCCPT_Product_Data_Store_CPT'; return $stores; } 

с этим вы сможете добавить тип birds в корзину. Но на самом деле не будет успеха добавить в корзину. Потому что нет цены, тележка откажется от нее.

Пользовательский тип публикации WooCommerce

Чтобы решить эту проблему, вам нужен еще один фильтр. Ниже приведен простой способ добавления цены.

 add_filter('woocommerce_product_get_price', 'woocommerce_product_get_price', 10, 2 ); function woocommerce_product_get_price( $price, $product ) { if ($product->get_id() == 815 ) { $price = 10; } return $price; } 

Как только это будет сделано, у вас будет успех, добавив в корзину.

Пользовательский тип публикации WooCommerce