у меня есть персональная тема «А» и я хочу, чтобы он также мог работать без Woocommerce.
когда Woocommerce «WC» добавлен плагин, я бы интегрировал продукты с WC. У меня есть пользовательский тип записи под названием «объекты», как я могу сделать «объект» покупаемым через туалет?
Я уже видел этот ответ на StackOverflow Добавление пользовательских типов сообщений в Woocommerce
Где решение в конце дает бесплатный (не больше) плагин для решения.
Я бы предпочел сделать это самостоятельно, без помощи плагина. Мне любопытно, и решение для предварительной упаковки — это не то, что я ищу.
Мы можем попробовать что-то простое … вы хотите, чтобы пользовательский тип записи сохранял ваши продукты, а при интеграции WooCommerce добавленные продукты в ваш пользовательский тип записи могут работать как продукты woocommerce.
Проверьте, установлен ли woocommerce или нет.
Если нет, то создайте пользовательский тип записи как «продукт» (аналогично 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 — это идентификатор вашего сообщения в вашем типе сообщения.
пример результата изображения после посещения этой ссылки:
Теперь вам нужно настроить форму, как показано ниже.
<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>
Вы должны иметь это, чтобы получить кнопку «Добавить в корзину». Название входных данных должно быть как есть.
Я столкнулся с той же проблемой. Проведя несколько дней, я разобрался, как это должно работать и как его решить.
Вот что я сделал
_price
для моего нестандартного постаИзменил 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 ){
Я продаю плагин, который позволит использовать пользовательский тип поста в качестве «продукта» 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
в корзину. Но на самом деле не будет успеха добавить в корзину. Поскольку цены нет, корзина ее отклонит.
Чтобы решить эту проблему, вам нужен еще один фильтр. Ниже приведен простой способ добавления цены.
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;
}
Как только это будет сделано, вы успешно добавите в корзину.