Estou adicionando um botão em produtos na página da loja somente quando o administrador estiver conectado. Este botão, quando pressionado, redefinirá o estoque do produto para zero (0). Às vezes, pode ser mais fácil limpar produtos fora de estoque do site usando imagens de produtos do que pesquisá-los com seu sku. Eu fiz este código com base na resposta do @LoicTheAztec e @Víctor González SO para atualizar tabelas de banco de dados nesse sentido e funciona perfeitamente. Abaixo está o código de trabalho
function createStockZeroButton(){
global $product;
$theId = $product-> get_id();
if(current_user_can( 'administrator' )){
echo "<form action='' method='POST'>
<button type='submit' class='stockZeroButtonClass' name="."name"."$theId".">set Stock To 0 for id".$theId."</button>
</form>";
if(isset($_POST["name".$theId])){
$con = mysqli_connect($server, $username, $password, $database);
$database_request = "UPDATE wp_postmeta pm
INNER JOIN wp_wc_product_meta_lookup pml
ON pm.post_id = pml.product_id
SET pm.meta_value = '0', pml.stock_quantity = '0'
WHERE pm.meta_key = '_stock' AND pm.post_id = '$theId'";
$database_query = mysqli_query($con, $database_request);
$database_request ="UPDATE wp_postmeta pm
INNER JOIN wp_wc_product_meta_lookup pml
ON pm.post_id = pml.product_id
SET pm.meta_value = 'outofstock', pml.stock_status = 'outofstock'
WHERE pm.meta_key = '_stock_status' AND pm.post_id = '$theId'";
$database_query = mysqli_query($con, $database_request);
$database_query = "INSERT IGNORE INTO wp_term_relationships (object_id, term_taxonomy_id)
SELECT pml.product_id, (SELECT term_id FROM wp_terms WHERE slug = 'outofstock')
FROM wp_wc_product_meta_lookup pml
WHERE pml.stock_status = 'outofstock' AND pm.post_id = '$theId'";
$database_query = mysqli_query($con, $database_request);
}
}
}
add_action('woocommerce_shop_loop_item_title','createStockZeroButton');
Gostaria agora de usar a classe $wpdb para fazer isso. Tentei este código abaixo 'de acordo' com esta resposta do SO , mas não consegui fazê-lo funcionar.
function createStockZeroButton(){
global $product;
$theId = $product-> get_id();
if(current_user_can( 'administrator' )){
echo "<form action='' method='POST'>
<button type='submit' class='stockZeroButtonClass' name="."name"."$theId".">set Stock To 0 for id".$theId."</button>
</form>";
if(isset($_POST["name".$theId])){
$update1 = $wpdb->query($wpdb->prepare("UPDATE wp_postmeta pm
INNER JOIN wp_wc_product_meta_lookup pml
ON pm.post_id = pml.product_id
SET pm.meta_value = '0', pml.stock_quantity = '0'
WHERE pm.meta_key = '_stock' AND pm.post_id = '$theId'"));
$update2 = $wpdb->query($wpdb->prepare("UPDATE wp_postmeta pm
INNER JOIN wp_wc_product_meta_lookup pml
ON pm.post_id = pml.product_id
SET pm.meta_value = 'outofstock', pml.stock_status = 'outofstock'
WHERE pm.meta_key = '_stock_status' AND pm.post_id = '$theId'"));
$update3 = $wpdb->query($wpdb->prepare("INSERT IGNORE INTO wp_term_relationships (object_id, term_taxonomy_id)
SELECT pml.product_id, (SELECT term_id FROM wp_terms WHERE slug = 'outofstock')
FROM wp_wc_product_meta_lookup pml
WHERE pml.stock_status = 'outofstock' AND pm.post_id = '$theId'"));
}
}
}
add_action('woocommerce_shop_loop_item_title','createStockZeroButton');
Como podemos obter uma consulta correta usando INNER JOIN e $wpdb como neste caso?
Também dei uma olhada no link do documento oficial , mas não consegui entender.
É melhor usar, em vez disso, os métodos setter WooCommerce relacionados . Tente o seguinte:
Deveria funcionar melhor, de uma forma simples.
Observe que isso funcionará principalmente em produtos simples.