Php 将缺货的产品送到垃圾桶

Php 将缺货的产品送到垃圾桶,php,wordpress,woocommerce,product,hook-woocommerce,Php,Wordpress,Woocommerce,Product,Hook Woocommerce,WooCommerce中有一个功能,可以在商店中隐藏缺货的产品。但是,只有当我使用本地WooCommerce短代码时,此功能才起作用,而当其他插件被用于在网站的其他部分显示产品时,此功能不起作用 所以,我认为扔掉产品将是一个更好的方式,以摆脱脱销的产品为好我不希望永久删除,以防我想让工作更轻松,并在将来恢复这些产品,但如果没有其他方法,我会欢迎它 我只是在学习一点PHP。如果你有任何想法,请告诉我 正如在WordPress中,所有内容都被视为具有不同内容的帖子 post\u type,因此每当更

WooCommerce中有一个功能,可以在商店中隐藏缺货的产品。但是,只有当我使用本地WooCommerce短代码时,此功能才起作用,而当其他插件被用于在网站的其他部分显示产品时,此功能不起作用

所以,我认为扔掉产品将是一个更好的方式,以摆脱脱销的产品为好我不希望永久删除,以防我想让工作更轻松,并在将来恢复这些产品,但如果没有其他方法,我会欢迎它

我只是在学习一点PHP。如果你有任何想法,请告诉我

正如在WordPress中,所有内容都被视为具有不同内容的帖子
post\u type
,因此每当更新post/产品时 打电话来

代码进入活动子主题(或主题)的function.php文件。或者在任何插件php文件中


更新
一次性使用功能

在active-theme
functions.php
文件中添加上述代码,并只运行一次网站,然后删除上述代码,它将丢弃所有缺货产品。
已更新

如果您希望将代码保留更长的时间,那么让我们减少查询和执行时间

add_action('admin_init', 'wh_trashAllProductOnce');

function wh_trashAllProductOnce() {
    $current_user = wp_get_current_user();
    //if loggedin user does not have admin previlage
    if (!user_can($current_user, 'administrator')) {
        return;
    }
    $params = [
        'posts_per_page' => -1,
        'post_type' => 'product',
        'post_status' => 'publish'
    ];
    $wc_query = new WP_Query($params);
    if ($wc_query->have_posts()) :
        while ($wc_query->have_posts()) :
            $wc_query->the_post();
            $product_id = get_the_ID();
            $product = wc_get_product($product_id);
            //if product is Out of Stock trash it
            if (!$product->is_in_stock()) {
                wp_trash_post($product_id);
            }
        endwhile;
        wp_reset_postdata();
    endif;
}
在活动主题
functions.php
文件中添加上述代码,每当管理员登录到仪表板并访问任何后端页面时,就会触发此函数

请注意:建议使用上述任何一种方法 只需一次,或者在您需要取消对函数的注释时使用 然后再次对其进行评论。

希望这有帮助

add_filter('woocommerce_debug_tools','tools');
   add_filter( 'woocommerce_debug_tools',  'tools' );
/**
 * Tools we add to WC
 * @param  array $tools
 * @return array
 */
function tools( $tools ) {
    $tools['delete_products'] = array(
        'name'      => __( 'Delete OutofStock Products','your-text-domain'),
        'button'    => __( 'Delete OutofStock products','your-text-domain' ),
        'desc'      => __( 'This tool will delete OutofStock .', 'your-text-domain' ),
        'callback'  => array( $this, 'delete_products' )
    );
    return $tools;
}
/**
 * Delete OutofStock Products
 */
function delete_products() {
    global $wpdb;
            $wpdb->query( "DELETE p FROM {$wpdb->posts} p join {$wpdb->postmeta} pm on p.ID = pm.post_id WHERE p.post_type = 'product' and pm.meta_key='_stock_status' and pm.meta_value='outofstock'");
    echo '<div class="updated"><p>' . sprintf( __( 'Out of stock Products Deleted', 'your-text-domain' ) ) . '</p></div>';
}
/** *我们添加到WC的工具 *@param数组$tools *@return数组 */ 功能工具($tools){ $tools['delete_products']=数组( 'name'=>\('Delete OutofStock Products','your-text-domain'), 'button'=>\('Delete OutofStock products','your-text-domain'), “desc'=>”(此工具将删除OutofStock.,“您的文本域”), 'callback'=>array($this'delete_products') ); 返回$tools; } /** *删除缺货产品 */ 函数delete_products(){ 全球$wpdb; $wpdb->query(“从{$wpdb->posts}p中删除p,在p.ID=pm.post\u ID上加入{$wpdb->postesta}pm,其中p.post\u type='product'和pm.meta\u key=''库存状态'和pm.meta\u值='outofstock'”; echo“”.sprintf(uuuuu('Out-of-stock Products Deleted','your text domain'))。

; }

您只需单击Woocommerce->System Status(系统状态)下的tools(工具)菜单即可完成此操作,请参见屏幕截图

谢谢您的帮助,但它不会将产品丢弃。我想这里可能有一个问题,“如果(!$product->is_in_stock())”。我知道一点c#转移知识,我想如果product=“outofstock”那么trash@Ryon:是否要丢弃所有现有的缺货产品?你们有简单积还是可变积?而且
是库存中的()
是一种返回
bool
的方法。所有现有产品也应该被丢弃。所有产品都很简单。@Ryon:我已经更新了我的答案,请检查,但请记住在使用后删除上面的代码。我测试了它,看看为什么它是一次性代码。它将不允许从垃圾箱中还原任何产品,但当代码被删除时,产品不会自动发送到垃圾箱。我决定一直保持代码的活动状态,因为它解决了这个问题。如果保留代码是明智的,请告诉我。哇,这是聪明的编码。但是,我还是必须手动删除该产品。目标是一旦库存达到零,产品就会消失。如果无法将其发送到垃圾箱,我将使用永久删除。谢谢您的帮助。代码并没有完全解决这个问题,所以我使用了@Raunak-Gupta解决方案。
add_action('admin_init', 'wh_trashAllProductOnce');

function wh_trashAllProductOnce() {
    $current_user = wp_get_current_user();
    //if loggedin user does not have admin previlage
    if (!user_can($current_user, 'administrator')) {
        return;
    }
    $params = [
        'posts_per_page' => -1,
        'post_type' => 'product',
        'post_status' => 'publish'
    ];
    $wc_query = new WP_Query($params);
    if ($wc_query->have_posts()) :
        while ($wc_query->have_posts()) :
            $wc_query->the_post();
            $product_id = get_the_ID();
            $product = wc_get_product($product_id);
            //if product is Out of Stock trash it
            if (!$product->is_in_stock()) {
                wp_trash_post($product_id);
            }
        endwhile;
        wp_reset_postdata();
    endif;
}
   add_filter( 'woocommerce_debug_tools',  'tools' );
/**
 * Tools we add to WC
 * @param  array $tools
 * @return array
 */
function tools( $tools ) {
    $tools['delete_products'] = array(
        'name'      => __( 'Delete OutofStock Products','your-text-domain'),
        'button'    => __( 'Delete OutofStock products','your-text-domain' ),
        'desc'      => __( 'This tool will delete OutofStock .', 'your-text-domain' ),
        'callback'  => array( $this, 'delete_products' )
    );
    return $tools;
}
/**
 * Delete OutofStock Products
 */
function delete_products() {
    global $wpdb;
            $wpdb->query( "DELETE p FROM {$wpdb->posts} p join {$wpdb->postmeta} pm on p.ID = pm.post_id WHERE p.post_type = 'product' and pm.meta_key='_stock_status' and pm.meta_value='outofstock'");
    echo '<div class="updated"><p>' . sprintf( __( 'Out of stock Products Deleted', 'your-text-domain' ) ) . '</p></div>';
}