【问题标题】:Adding custom post type / post to Woocommerce将自定义帖子类型/帖子添加到 Woocommerce
【发布时间】:2015-12-31 15:07:21
【问题描述】:

我有一个个人主题“A”,我希望它在没有 Woocommerce 的情况下也能工作。 添加 Woocommerce "WC" 插件后,我会将 A 产品与 WC 集成。我有一个名为“objects”的自定义帖子类型,如何让“object”可以通过 WC 购买?

我已经在 StackOverflow Adding Custom Post Types to Woocommerce 上看到了这个答案 最终解决方案提供了一个免费(不再是)插件来解决。

我更喜欢自己做这件事,没有插件的帮助。我很好奇,预打包的解决方案不是我想要的。

【问题讨论】:

  • “我很好奇,预包装解决方案不是我想要的。”但是你可以从插件如何做某事中学到很多东西。我以前从未听说过这个插件,但我要花 5 美元来看看引擎盖下有什么……而且我什至没有立即使用它。

标签: php wordpress woocommerce codex


【解决方案1】:

我有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 是您的帖子在您的帖子类型中的 ID。

访问该链接后的示例结果图像:

现在,您必须设置如下表格..

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

您需要拥有这个才能获得“添加到购物车”按钮。输入的名称必须保持原样。

【讨论】:

  • A+ @Reigel!我什至还没有这个用途,但它真的很有趣。感谢您发布它。
  • 感谢@helgatheviking,有些网站有目录但没有购物车功能......使用 WooCommerce 和这个想法,这将帮助他们很大的时间......这个想法是他们的第一步...
  • 我这辈子都无法让它发挥作用。我使用 ACF 插件添加了 _price 元值,我可以使用该键在数据库中看到它,但是去 cart?add_to_cart=56 只是没有做任何事情。还有其他人可以举一个与 CPT 一起工作的真实例子吗?
  • @SteveWeaverCrawford 我也面临这个问题。
  • 这不适用于 woocommerce 2.7 版以及可能的所有版本。因为 2.7 中的 woocommerce 将检查帖子类型是否为产品...
【解决方案2】:

我们可以尝试一个简单的事情..您想要一个自定义帖子类型来存储您的产品,并且当 WooCommerce 集成时,您自定义帖子类型中添加的产品可以作为 woocommerce 产品使用..

  1. 检查是否安装了 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
    }
    ?>

【讨论】:

  • 摆脱自定义帖子类型“产品”是我想 OP 想要提出的问题......据说 OP 想要“对象”作为自定义帖子类型..
【解决方案3】:

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 的类。这个想法是覆盖这个检查帖子类型的现有函数。我发现 readget_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;
}

完成后,您将成功添加到购物车。

【讨论】:

  • 我在你的网站上给你发了电子邮件,但你没有回复。
  • 它会产生一个致命错误→“致命错误:未找到类'WC_Product_Data_Store_CPT'”
  • 我收到以下错误Fatal error: Uncaught Exception: Invalid data store.。我该如何解决这个问题?
【解决方案4】:

我遇到了同样的问题。花了几天后,我弄清楚了它应该如何工作以及它的解决方案。

我做了什么

  1. 为我的自定义帖子保留价格元为 _price
  2. woocommerce/includes/class-wc-product-factory.php类的get_product_class函数中的if条件更改为如下:

    之前

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

    之后

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

效果很好。

现在我想使用某种过滤方法更改此产品类型。谁能告诉我:

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

【讨论】:

  • 此解决方案不再有效。 if ( 'product' === $post_type){ 已从 4.3.X 中删除。
  • 避免更改 woo-commerce 核心代码,而是附加到插件中的函数或过滤器
  • 你不应该覆盖核心或插件(不是你的)代码。更新此插件后它将消失
猜你喜欢
  • 2017-04-05
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2015-05-06
  • 1970-01-01
  • 2017-04-21
相关资源
最近更新 更多