Soporte » Plugins y Hacks » WooCommerce » Problema al ocultar productos sin stock en Woocommerce

  • Buenas noches, estoy seguro que eso ya habrá pasado a muchos usuarios, resulta que en Woocommerce cuando ocultas los productos las páginas se desordenan debido a que ellas siguen contándolos.

    Ejemplo:
    Tengo 24 productos por página, en la cual hay 10 sin stock. Cuando uso la opción del plugin de ocultar resulta que solo se muestran 14 productos. Es decir los productos ocultos están invisibles pero siguen presentes en las páginas.

    Una supuesta solución seria ir a Woocommerce > Estado del Sistema > Herramientas > Recontar términos y después Borrar transitorios. Eso lo he probado varias veces y no funciona.

    El archivo que modifica esto es el siguiente:
    «woocommerce/includes/wc-term-functions.php»

    /**
    460: * Function for recounting product terms, ignoring hidden products.
    461: * @param array $terms
    462: * @param string $taxonomy
    463: * @param boolean $callback
    464: * @param boolean $terms_are_term_taxonomy_ids
    465: * @return void
    466: */
    467: function _wc_term_recount( $terms, $taxonomy, $callback = true, $terms_are_term_taxonomy_ids = true ) {
    468: global $wpdb;
    469:
    470: // Standard callback
    471: if ( $callback ) {
    472: _update_post_term_count( $terms, $taxonomy );
    473: }
    474:
    475: // Stock query
    476: if ( get_option( ‘woocommerce_hide_out_of_stock_items’ ) == ‘yes’ ) {
    477: $stock_join = «LEFT JOIN {$wpdb->postmeta} AS meta_stock ON posts.ID = meta_stock.post_id»;
    478: $stock_query = »
    479: AND meta_stock.meta_key = ‘_stock_status’
    480: AND meta_stock.meta_value = ‘instock’
    481: «;
    482: } else {
    483: $stock_query = $stock_join = »;
    484: }
    485:
    486: // Main query
    487: $count_query = »
    488: SELECT COUNT( DISTINCT posts.ID ) FROM {$wpdb->posts} as posts
    489: LEFT JOIN {$wpdb->postmeta} AS meta_visibility ON posts.ID = meta_visibility.post_id
    490: LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID=rel.object_ID
    491: LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id )
    492: LEFT JOIN {$wpdb->terms} AS term USING( term_id )
    493: LEFT JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id
    494: $stock_join
    495: WHERE post_status = ‘publish’
    496: AND post_type = ‘product’
    497: AND meta_visibility.meta_key = ‘_visibility’
    498: AND meta_visibility.meta_value IN ( ‘visible’, ‘catalog’ )
    499: $stock_query
    500: «;
    501:
    502: // Pre-process term taxonomy ids
    503: if ( ! $terms_are_term_taxonomy_ids ) {
    504: // We passed in an array of TERMS in format id=>parent
    505: $terms = array_filter( (array) array_keys( $terms ) );
    506: } else {
    507: // If we have term taxonomy IDs we need to get the term ID
    508: $term_taxonomy_ids = $terms;
    509: $terms = array();
    510: foreach ( $term_taxonomy_ids as $term_taxonomy_id ) {
    511: $term = get_term_by( ‘term_taxonomy_id’, $term_taxonomy_id, $taxonomy->name );
    512: $terms[] = $term->term_id;
    513: }
    514: }
    515:
    516: // Exit if we have no terms to count
    517: if ( ! $terms ) {
    518: return;
    519: }
    520:
    521: // Ancestors need counting
    522: if ( is_taxonomy_hierarchical( $taxonomy->name ) ) {
    523: foreach ( $terms as $term_id ) {
    524: $terms = array_merge( $terms, get_ancestors( $term_id, $taxonomy->name ) );
    525: }
    526: }
    527:
    528: // Unique terms only
    529: $terms = array_unique( $terms );
    530:
    531: // Count the terms
    532: foreach ( $terms as $term_id ) {
    533: $terms_to_count = array( absint( $term_id ) );
    534:
    535: if ( is_taxonomy_hierarchical( $taxonomy->name ) ) {
    536: // We need to get the $term’s hierarchy so we can count its children too
    537: if ( ( $children = get_term_children( $term_id, $taxonomy->name ) ) && ! is_wp_error( $children ) ) {
    538: $terms_to_count = array_unique( array_map( ‘absint’, array_merge( $terms_to_count, $children ) ) );
    539: }
    540: }
    541:
    542: // Generate term query
    543: $term_query = ‘AND term_id IN ( ‘ . implode( ‘,’, $terms_to_count ) . ‘ )’;
    544:
    545: // Get the count
    546: $count = $wpdb->get_var( $count_query . $term_query );
    547:
    548: // Update the count
    549: update_woocommerce_term_meta( $term_id, ‘product_count_’ . $taxonomy->name, absint( $count ) );
    550: }
    551:
    552: delete_transient( ‘wc_term_counts’ );
    553: }

    Alguien podría ayudarme? No encuentro solución alguna ni en inglés y menos en español. Gracias a todos.

  • El debate ‘Problema al ocultar productos sin stock en Woocommerce’ está cerrado a nuevas respuestas.