2015-12-31 4 views
7

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

Я видел этот ответ на StackOverflow Adding Custom Post Types to Woocommerce Где решение в конце дает бесплатный (не более) плагин для решения.

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

+3

«Мне любопытно, и заранее пакетное решение не то, что я ищу.«Но вы можете узнать тонну, глядя на то, как плагин что-то делает. Я никогда не слышал об этом плагине раньше, но я бросаю 5 долларов, чтобы увидеть, что находится под капотом ... и у меня даже нет немедленное использование для этого. – helgatheviking

ответ

4

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

  1. Check если woocommerce установлена ​​нет.

  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 
    } 
    ?> 

enter image description here

+1

уйти с пользовательским типом сообщения «продукт», это проблема, которую OP хочет поднять, я полагаю ... заявлено, что OP хочет «объект» как пользовательский тип сообщения. – Reigel

8

У меня есть created a simple tutorial что бы добавить его здесь было бы слишком долго.

Для достижения вашей цели у вашего типа сообщения должна быть цена. При этом пользовательское поле цены должно иметь мета-ключ _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> 

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

+2

A + @Reigel! У меня даже нет возможности для этого, но это действительно интересно. Спасибо за публикацию. – helgatheviking

+0

спасибо @helgatheviking, есть сайты, которые имеют каталоги, но не имеют иметь функциональность тележки ... используя WooCommerce и эту идею, это поможет им в течение большого времени ... эта идея - их первый шаг ... – Reigel

+0

Я не могу на всю жизнь заставить это работать. плагин ACF, чтобы добавить метазначение _price, которое я вижу в БД с этим ключом, но идущий в корзину? add_to_cart = 56 просто ничего не делает. Любой, кто может дать реальный пример этого, работающего с CPT? –

0

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

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

  1. цены Keep мета, как _price для моего таможенного поста
  2. Изменено условие if в классе woocommerce/includes/class-wc-product-factory.php «s функции get_product_class так:

    перед тем

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

    после

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

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

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

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

редактирование файлов плагинов - ужасная ошибка ... – Reigel

0

I'm selling a plugin that would enable to use Custom Post Type as "product" of 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 Custom Post Type

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

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 Custom Post Type