如何在woocommerce中禁用可下载的产品功能

时间:2016-07-29 19:44:04

标签: php wordpress woocommerce

我在市场网站上使用woocommerce;我正在寻找一种解决方案来禁用"可下载的产品"功能。主要是我希望它不会出现在供应商"后端"。

9 个答案:

答案 0 :(得分:27)

作者:Claudio Sanches(@claudiosanches): 转到WooCommerce>设置>帐户并清理下载端点字段。 这将禁用下载页面。

答案 1 :(得分:11)

function CM_woocommerce_account_menu_items_callback($items) {
    unset( $items['downloads'] );
    return $items;
}
add_filter('woocommerce_account_menu_items', 'CM_woocommerce_account_menu_items_callback', 10, 1);

用它代替上面的

答案 2 :(得分:4)

我在 By Christophvh 上获得了此答案。

转到 WooCommerce > Settings > Advanced 并删除帐户端点部分下载的条目,只需将其保留为空白。并且菜单将不再可见。只需看看我的附件图像即可。

enter image description here

答案 3 :(得分:1)

不确定我是否理解正确,但如果您愿意从“我的帐户”页面中删除“下载”导航选项,请继续阅读:)

  1. 为您当前使用的主题创建子主题。如果您不清楚这是什么,请阅读:https://codex.wordpress.org/Child_Themes
  2. 现在将navigation.php从... \ wp-content \ plugins \ woocommerce \ templates \ myaccount \复制到Child Theme文件夹... \ wp-content \ themes \ yourtheme-child \ woocommerce \ myaccount \
  3. 在您的子主题文件夹中打开navigation.php。查找具有函数wc_get_account_menu_items()的行并将该函数重命名为例如wc_get_account_menu_items_custom()
  4. 在您的子主题文件夹中打开functions.php。粘贴在函数下面的文件中。保存文件即可。现在,“我的帐户”页面没有“下载”导航选项。

    function wc_get_account_menu_items_custom() {
        $endpoints = array(
            'orders'          => get_option( 'woocommerce_myaccount_orders_endpoint', 'orders' ),
            'edit-address'    => get_option( 'woocommerce_myaccount_edit_address_endpoint', 'edit-address' ),
            'payment-methods' => get_option( 'woocommerce_myaccount_payment_methods_endpoint', 'payment-methods' ),
            'edit-account'    => get_option( 'woocommerce_myaccount_edit_account_endpoint', 'edit-account' ),
            'customer-logout' => get_option( 'woocommerce_logout_endpoint', 'customer-logout' ),
        );
    
        $items = array(
            'dashboard'       => __( 'Dashboard', 'woocommerce' ),
            'orders'          => __( 'Orders', 'woocommerce' ),
            'edit-address'    => __( 'Addresses', 'woocommerce' ),
            'payment-methods' => __( 'Payment Methods', 'woocommerce' ),
            'edit-account'    => __( 'Account Details', 'woocommerce' ),
            'customer-logout' => __( 'Logout', 'woocommerce' ),
        );
    
        // Remove missing endpoints.
        foreach ( $endpoints as $endpoint_id => $endpoint ) {
            if ( empty( $endpoint ) ) {
                unset( $items[ $endpoint_id ] );
            }
        }
    
        // Check if payment gateways support add new payment methods.
        if ( isset( $items['payment-methods'] ) ) {
            $support_payment_methods = false;
            foreach ( WC()->payment_gateways->get_available_payment_gateways() as $gateway ) {
                if ( $gateway->supports( 'add_payment_method' ) || $gateway->supports( 'tokenization' ) ) {
                    $support_payment_methods = true;
                    break;
                }
            }
    
            if ( ! $support_payment_methods ) {
                unset( $items['payment-methods'] );
            }
        }
    
        return apply_filters( 'woocommerce_account_menu_items_custom', $items );
    }
    

    注意:这是经过编辑的原创WooCommerce功能。刚刚删除的数组字段提到“下载”选项。 希望这会有所帮助。

答案 4 :(得分:1)

此代码对我有用。我是从Woocommerce支持部门获得的。 https://wordpress.org/support/topic/remove-virtual-downloadable-products-selection/

function my_remove_product_type_options( $options ) {
    // uncomment this if you want to remove virtual too.
    // if ( isset( $options['virtual'] ) ) {
    //  unset( $options['virtual'] );
    // }
    if ( isset( $options['downloadable'] ) ) {
        unset( $options['downloadable'] );
    }
    return $options;
}
add_filter( 'product_type_options', 'my_remove_product_type_options' );

答案 5 :(得分:0)

有几个额外的步骤可以完全删除该功能。

全部回顾:

  1. 根据 Osmar SanchesMD Ashik 的答案,清除 WooCommerce > 设置 > 高级 > 下载

    上的端点
  2. 按照 Maher Aldous answer

    添加过滤器 product_type_options
  3. 根据 Misha Rudrasyth 的 this blog post 删除“产品类型过滤器的下拉选项”:

     add_filter( 'woocommerce_products_admin_list_table_filters', function( $filters ) {
         if( isset( $filters[ 'product_type' ] ) ) {
             $filters[ 'product_type' ] = 'misha_product_type_callback';
         }
         return $filters;
     });
    
     function misha_product_type_callback(){
         $current_product_type = isset( $_REQUEST['product_type'] ) ? wc_clean( wp_unslash( $_REQUEST['product_type'] ) ) : false;
         $output               = '<select name="product_type" id="dropdown_product_type"><option value="">Filter by product type</option>';
    
         foreach ( wc_get_product_types() as $value => $label ) {
             $output .= '<option value="' . esc_attr( $value ) . '" ';
             $output .= selected( $value, $current_product_type, false );
             $output .= '>' . esc_html( $label ) . '</option>';
         }
    
         $output .= '</select>';
         echo $output;
     }
    
  4. 从订单(编辑和新)中删除元框“可下载产品权限”:

     add_filter('add_meta_boxes', function() {
         remove_meta_box('woocommerce-order-downloads', 'shop_order', 'normal');
     }, 99 );
    

答案 6 :(得分:0)

好的,基于以上所有答案,我整理了一个禁用的“一体机”解决方案:

  • 下载端点。
  • 来自管理产品编辑器的复选框选项。
  • 产品类型过滤器的下拉选项。
  • 来自订单的下载元数据框。

文件: class-disablewoocommerceproducttypes.php

class DisableWooCommerceProductTypes {

    /**
     * @var array Product types in this property will be disabled.
     */
    public $disabled = [
        'virtual',
        'downloadable'
    ];

    /**
     * @var array WooCommerce uses different references for the same product types.
     */
    private $aliases = [
        'downloadable' => [ 'downloads' ]
    ];

    /**
     * @var int The priority of these overrides.
     */
    public $priority = PHP_INT_MAX;

    /**
     * @var null|string|array $product_types Accepts a string or array of 'virtual' and/or 'downloadable' product types.
     */
    public function __construct( $product_types = null ) {

        if ( $product_types ) {
            $this->disabled = (array)$product_types;
        }

        add_filter( 'product_type_options', [ $this, 'disable_admin_options' ], $this->priority );
        add_filter( 'woocommerce_account_menu_items', [ $this, 'disable_frontend_nav_items' ], $this->priority );
        add_filter( 'add_meta_boxes', [ $this, 'disable_admin_metabox' ], $this->priority );
        add_filter( 'woocommerce_products_admin_list_table_filters', [ $this, 'disable_admin_filters' ], $this->priority );

        // Disable the downloads endpoint
        if ( $this->is_disabled( 'downloadable' ) ) {
            add_filter( 'default_option_woocommerce_myaccount_downloads_endpoint', '__return_null' );
            add_filter( 'option_woocommerce_myaccount_downloads_endpoint', '__return_null' );
        }

    }

    /**
     * Quickly check if a product type is disabled. Returns primary key if $type is an alias and disabled.
     *
     * @param string $type
     * @param bool $aliases Check for aliases.
     * @return bool|string
     */
    private function is_disabled( string $type, bool $aliases = true ) {
        $basic_check = in_array( $type, $this->disabled );

        if ( $aliases && !$basic_check ) {
            foreach ( $this->aliases as $_type => $_aliases ) {
                if ( in_array( $type, $_aliases ) && $this->is_disabled( $_type, false ) ) {
                    return $_type;
                }
            }
        }

        return $basic_check;
    }

    /**
     * Remove product type checkboxes from product editor.
     *
     * @param array $types
     * @return array
     */
    public function disable_admin_options( $types ) {
        foreach ( $types as $key => $value ) {
            if ( $this->is_disabled( $key ) ) {
                unset( $types[ $key ] );
            }
        }
        return $types;
    }

    /**
     * Removes product type page from `wc_get_account_menu_items()`
     *
     * @param array $items
     * @return array
     */
    public function disable_frontend_nav_items( $items ) {
        foreach ( $items as $key => $value ) {
            if ( $this->is_disabled( $key ) ) {
                unset( $items[ $key ] );
            }
        }
        return $items;
    }

    /**
     * Removes the downloads metabox from orders.
     */
    public function disable_admin_metabox() {
        if ( $this->is_disabled( 'downloadable' ) ) {
            remove_meta_box( 'woocommerce-order-downloads', 'shop_order', 'normal' );
        }
    }

    /**
     * Add our admin product table filter modifier.
     *
     * @param array $filters
     * @return array
     */
    public function disable_admin_filters( $filters ) {
        if ( isset( $filters[ 'product_type' ] ) ) {
            $filters[ 'product_type' ] = [ $this, 'disable_product_type_filters' ];
        }
        return $filters;
    }

    /**
     * Remove disabled product types from the admin products table filters.
     */
    public function disable_product_type_filters() {
        $current_product_type = isset( $_REQUEST['product_type'] ) ? wc_clean( wp_unslash( $_REQUEST['product_type'] ) ) : false; // WPCS: input var ok, sanitization ok.
        $output               = '<select name="product_type" id="dropdown_product_type"><option value="">' . esc_html__( 'Filter by product type', 'woocommerce' ) . '</option>';

        foreach ( wc_get_product_types() as $value => $label ) {
            $output .= '<option value="' . esc_attr( $value ) . '" ';
            $output .= selected( $value, $current_product_type, false );
            $output .= '>' . esc_html( $label ) . '</option>';

            if ( 'simple' === $value ) {

                if ( !$this->is_disabled( 'downloadable' ) ) {
                    $output .= '<option value="downloadable" ';
                    $output .= selected( 'downloadable', $current_product_type, false );
                    $output .= '> ' . ( is_rtl() ? '&larr;' : '&rarr;' ) . ' ' . esc_html__( 'Downloadable', 'woocommerce' ) . '</option>';
                }

                if ( !$this->is_disabled( 'virtual' ) ) {
                    $output .= '<option value="virtual" ';
                    $output .= selected( 'virtual', $current_product_type, false );
                    $output .= '> ' . ( is_rtl() ? '&larr;' : '&rarr;' ) . ' ' . esc_html__( 'Virtual', 'woocommerce' ) . '</option>';
                }
            }
        }

        $output .= '</select>';
        echo $output; // WPCS: XSS ok.
    }

}

文件:functions.php

include_once get_theme_file_path( 'path/to/class-disablewoocommerceproducttypes.php' );

new DisableWooCommerceProductTypes();


默认情况下,以上将禁用 downloadablevirtual 产品类型。

要禁用单个产品类型,只需将类型传递给类构造函数...

// Example usage for just `downloadable` product type
new DisableWooCommerceProductTypes( 'downloadable' );
// Example usage for just `virtual` product type
new DisableWooCommerceProductTypes( 'virtual' );

答案 7 :(得分:-3)

CSS修复......没有篡改功能。

.woocommerce-MyAccount-navigation-link--downloads {
display: none;
}

答案 8 :(得分:-9)

遇到了同样的问题,并修复了它。

打开此文件:
... \ WWW \ Your_website_folder \可湿性粉剂内容\插件\ woocommerce \包括\ wc_account-的functions.php

现在搜索 wc_get_account_menu_items()功能(第78行)

现在替换此行(第91行)

        'downloads'       => __( 'Downloads', 'woocommerce' ),

这一个

/*      'downloads'       => __( 'Downloads', 'woocommerce' ),*/

那就是它。