Falta el enlace de la tienda de la ruta de navegación de WooCommerce

6 minutos de lectura

avatar de usuario
ella salh

Tengo un sitio de WordPress que usa woocommerce (en la página interna), mi estructura de URL para la página de la tienda es la siguiente:

misitio/tienda/

la ruta de navegación en las páginas de Woocommerce solo muestra un enlace de inicio como: Usted está aquí: Inicio

y la URL de mi página de producto:

Misitio/categoría-producto/nombre_categoría/

La ruta de mi página de mi tienda se muestra de la siguiente manera:

You are here: Home 

también mi migas de pan de la página de categoría se muestra de la siguiente manera:

You are here: Home

Necesito hacer que se muestre como:

Estás aquí: Inicio / compras / category_name

Revisé las opciones de enlaces permanentes pero parece estar bien. Revisé el archivo de plantilla breadcrumb.php, parece que considera que la página de la tienda () es la página de inicio de mi sitio.

¿Cómo puedo solucionar esto? ¿Debería editar breadcrumb.php o hay un error en mi configuración? Gracias por adelantado.

avatar de usuario
seb toombs

Para cualquiera que se tope con esto en 2019, hay una manera mucho más fácil de agregar un elemento después de la ruta de navegación “Inicio”, si no desea cambiar sus enlaces permanentes o editar archivos de temas. Puede que esta no sea una solución perfecta, pero funcionó para mí.

La clase WC_Breadcrumb filtra las migas de pan antes de devolverlas, y podemos conectar y modificar la matriz. La matriz $crumbs es solo una matriz de [ [title, url], [title, url] ]

add_filter( 'woocommerce_get_breadcrumb', function($crumbs, $Breadcrumb){
        $shop_page_id = wc_get_page_id('shop'); //Get the shop page ID
        if($shop_page_id > 0 && !is_shop()) { //Check we got an ID (shop page is set). Added check for is_shop to prevent Home / Shop / Shop as suggested in comments
            $new_breadcrumb = [
                _x( 'Shop', 'breadcrumb', 'woocommerce' ), //Title
                get_permalink(wc_get_page_id('shop')) // URL
            ];
            array_splice($crumbs, 1, 0, [$new_breadcrumb]); //Insert a new breadcrumb after the 'Home' crumb
        }
        return $crumbs;
    }, 10, 2 );

  • Es posible que desee agregar if (!is_shop()) para que no se ponga en la página de la tienda home / shop / shop

    – Howard E.

    2 abr 2019 a las 21:06


  • Gran pensamiento, gracias! Me acababa de encontrar con eso en el proyecto en el que (todavía) estoy trabajando. Gracias – respuesta actualizada.

    – Seb Toombs

    3 de abril de 2019 a las 3:49

  • puede cambiar el título de su ruta de navegación para usar get_the_title($shop_page_id) ya que no todo el mundo usa “Tienda” como página de la tienda. Además, get_permalink se puede cambiar para usar get_permalink($shop_page_id) ya que ya tiene un conjunto de variables con el ID de la página de la tienda.

    – Alejandro Holsgrove

    17 de enero de 2020 a las 15:38

avatar de usuario
Ziki

Estaba depurando esto y, lamentablemente, Woocommerce (ver. 2.3.8) no usa ningún gancho para ajustar directamente la matriz de migas de pan. Entonces, si desea modificar las migas de pan que se muestran sin cambiar la estructura de enlaces permanentes, lo mejor es copiar el archivo de plantilla de migas de pan del complemento ( /woocommerce/templates/global/breadcrumb.php) en su tema ( /theme_name/woocommerce/global/ ) y allí agregue el código para incluir el enlace antes de que comience el bucle de salida. Solo lo hago por categoría de producto, etiqueta y detalle, pero puede agregar otros condicionales si lo desea.

<?php
/**
 * Shop breadcrumb
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.3.0
 * @see         woocommerce_breadcrumb()
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

if ( $breadcrumb ) {

    // add shop home url to breadcrumbs
    if( is_product_category() || is_product_tag() || is_product() ) {
        $shop_page_id = wc_get_page_id( 'shop' );
        $shop_home_arr = array( get_the_title($shop_page_id), get_permalink($shop_page_id));

        // insert to breadcrumbs array on second position
        array_splice($breadcrumb, 1, 0, array($shop_home_arr));
    }

    echo $wrap_before;

    foreach ( $breadcrumb as $key => $crumb ) {

        echo $before;

        if ( ! empty( $crumb[1] ) && sizeof( $breadcrumb ) !== $key + 1 ) {
            echo '<a href="' . esc_url( $crumb[1] ) . '">' . esc_html( $crumb[0] ) . '</a>';
        } else {
            echo esc_html( $crumb[0] );
        }

        echo $after;

        if ( sizeof( $breadcrumb ) !== $key + 1 ) {
            echo $delimiter;
        }
    }
    echo $wrap_after;
}

Esto se puede hacer mucho más fácil. Solo es necesario cambiar la configuración de los enlaces permanentes en consecuencia, como se menciona en github en el número 3145:

Cumple con este criterio:

// If permalinks contain the shop page in the URI prepend the breadcrumb with shop 
if (
  $shop_page_id
  && strstr( $permalinks['product_base'], "https://stackoverflow.com/" . $shop_page->post_name )
  && get_option( 'page_on_front' ) !== $shop_page_id
 ) {
   $prepend = $before 
     . '<a href="' . get_permalink( $shop_page ) . '">' 
     . $shop_page->post_title . '</a> ' 
     . $after . $delimiter;
 }

De lo contrario, nunca se antepone.

Para aplicar esto hay que ir a:

→ Backend de WordPress → Configuración → Enlaces permanentes

Y establezca la configuración de enlaces permanentes de woocommerce en uno de estos:

  • base de la tienda
  • Comprar base con categoría
  • Base personalizada

Si se usa este último, se debe anteponer el slug »/shop/…«.

Hay un número 6584:

Advertencia: preg_match (): modificador desconocido ‘t’ en wc-core-functions.php en la línea 533

Lo que ocurre, por ejemplo, si la »Base personalizada« se ve así: »/tienda/producto/…«. Hay un comprometerse eso lo arregló, que está disponible en el maestro, pero no en 2.2.8.

La tienda de piezas de slug también se puede reemplazar por otra cosa, por ejemplo, algo localizado.

Descubrí que el código de migas de pan estaba en header.php de mi carpeta de temas de corte y el autor de ese tema no escribió código para productos o páginas de categorías de productos, así que agregué

elseif (is_single() && get_post_type() == 'product'){   
$posts_page_id = get_option('page_for_posts');
$posts_page_url = get_permalink($posts_page_id); 
echo '<li>';$bar = "shopping";
if(get_option_tree('blog_name', '', false))
/*$bar=get_option_tree('blog_name', '', false);*/ 
echo "<a href="https://stackoverflow.com/questions/17530026/.home_url()."/shopping/>$bar</a></li>";
echo "<li>";
the_title();
echo"</li>";
}

y para la página de categoría de producto

if (is_tax()) { 
$posts_page_id = get_option('page_for_posts');
$posts_page_url = get_permalink($posts_page_id); 
echo '<li>';$bar = "Shopping";
if(get_option_tree('blog_name', '', false)) 
echo "<a href="https://stackoverflow.com/questions/17530026/.home_url()."/shopping/>$bar</a> > </li>" ; 
echo "<li>"; 
woocommerce_page_title(); 
echo"</li>";}

Comenté la línea que obtiene el blog_name porque uso una página personalizada para mi tienda, no la predeterminada de woocommerce. No sé si hay otra manera de hacer esto, pero noté que la mayoría del código en este tema no es realmente profesional, incluso en widget css, fue una mala elección.

¿Ha sido útil esta solución?