¿Por qué es la opción preferida tener las modificaciones de funciones de WooCommerce colocadas dentro del archivo ‘function.php’ del tema? Con el tiempo, esto haría que el archivo fuera bastante grande. Entiendo que generalmente es una mejor práctica tener muchos archivos más pequeños bien organizados, en lugar de menos archivos mucho más grandes.
Con esto en mente, ¿qué tiene de malo copiar los archivos ‘wc-template-functions.php’ y ‘wc-templates-hooks.php’ en su tema (manteniendo su jerarquía de archivos) y modificar estos archivos en consecuencia?
Como solicitud adicional, de un novato relativo en la plataforma WooCommerce, agradecería si pudiera obtener una respuesta de ‘Sí, eso funciona’ o ‘No, me perdí algo’ a mi comprensión a continuación de cómo WooCommerce; archivos, ganchos, acciones y plantillas, todos funcionan con uno y otro
Mi entendimiento:
- Las funciones de WooCommerce están registradas dentro del archivo ‘wc-template-functions.php’. A los efectos de esta explicación, me gustaría referirme a la
woocommerce_breadcrumb
entrada. - WooCommerce luego usa el archivo ‘wc-templates-hooks.php’ para llamar a la función registrada usando una entrada típica como
add_action('woocommerce_before_main_content','woocommerce_breadcrumb', 20, 0 );
Esto simplemente dirigewoocommerce_breadcrumb
ser llamado dentro delwoocommerce_before_main_content
gancho. - WooCommerce puede generar lo anterior colocando
do_action( 'woocommerce_before_main_content' );
donde sea necesario. En este caso, dentro de todos los archivos de plantilla.
helgatheviking
Su comprensión 1,2,3 es correcta.
Sin embargo, los archivos wc-template-functions.php
y wc-templates-hooks.php
no se anulan al colocar archivos similares en su tema, por lo que tenerlos en su tema no haría nada.
También es una mala idea (en mi opinión) copiar/anular archivos al por mayor cuando desea cambiar algo específico. Tuve que buscar en una carpeta completa de plantillas de WooCommerce cuando el sitio de un cliente colapsó para encontrar los cambios reales que debían mantenerse.
No hay nada de malo en separar tu functions.php
archivo en archivos más pequeños y más manejables. Y así, tú pudo tener un woocommerce-functions.php
archivo con el nombre que desee para almacenar su código específico de WooCommerce.
Editar para expandir algunos pensamientos.
Cada vez que WooCommerce (o cualquier función de WordPress) te muestra este patrón:
if ( ! function_exists( 'some_function_name' ) ) {
function some_function_name() {
echo 'taco';
}
}
tiene una función conectable y puede simplemente definirla en su tema function.php
y WooCommerce usará su versión de some_function_name()
.
Sin embargo, las funciones conectables están enganchadas donde están enganchadas y no puedes moverlas al redefinirlas en tu tema/complemento. Entonces, un enfoque más poderoso es eliminar la función de su enlace y agregarla a un enlace diferente, o agregar su propia función personalizada, o ambas. Aquí hay un ejemplo que mueve un título personalizado después del precio:
function kia_switch_loop_title(){
remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 );
add_action( 'woocommerce_after_shop_loop_item_title', 'kia_template_loop_product_title', 15 );
}
add_action( 'woocommerce_before_shop_loop_item', 'kia_switch_loop_title' );
function kia_template_loop_product_title() {
echo '<h4 class="we-do-what-we-want">' . get_the_title() . '</h4>';
}
-
Gracias por la orientación y por ayudarme a tranquilizarme con respecto a mi comprensión de WooCommerce. Su sugerencia con respecto a ‘dividir’ el archivo functions.php será algo que consideraré en las próximas semanas.
–Craig
20 de febrero de 2017 a las 1:17
-
También tenga en cuenta que las cosas que cambian la apariencia del sitio pertenecen a su tema (y por lo tanto,
functions.php
). Pero el código que cambia la funcionalidad del sitio se adapta mejor a su propio complemento… o un complemento específico del sitio que puede ser una colección de todos sus “fragmentos”.– helgathevikingo
20 de febrero de 2017 a las 3:40
-
Todavía no he llegado a aprender a crear complementos. Si bien soy consciente de que se considera una buena práctica colocar dichos códigos dentro de un complemento, ¿cuál es la razón principal para hacerlo? ¿Se relaciona con la compatibilidad? Entonces, si una actualización en WooCommerce, etc. entra en conflicto con la funcionalidad de un tema, ¿simplemente puede desactivarlo mientras realiza los cambios relevantes?
–Craig
20 de febrero de 2017 a las 5:02
-
Un complemento es básicamente un código en el
wp-content/plugins
carpeta con un grupo específico de comentarios como “encabezado”. Puedes crear uno fácilmente con esto generador. La razón principal es mantener el código de presentación separado del código de funcionalidad, para que no quede bloqueado en un tema en particular. Y como usted señala, es fácil deshabilitar el complemento si surge algún conflicto.– helgathevikingo
20 de febrero de 2017 a las 16:10
-
¡Tiene sentido! Gracias por su ayuda y conocimiento. 🙂
–Craig
20 de febrero de 2017 a las 16:20
Gudok
estaba luchando con cómo hacer que los productos relacionados se clasificaran de manera desc, acabo de encontrar una solución. Por si alguien lo necesita
function custom_remove_hook(){
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
add_action( 'woocommerce_after_single_product_summary', 'custom_function_to_sort_related', 22 );
}
add_action( 'woocommerce_after_single_product_summary', 'custom_remove_hook' );
function custom_function_to_sort_related( $args = array() ) {
global $product;
if ( ! $product ) {
return;
}
$defaults = array(
'posts_per_page' => 4,
'columns' => 4,
'orderby' => 'price', // @codingStandardsIgnoreLine.
'order' => 'desc'
);
$args = wp_parse_args( $args, $defaults );
// Get visible related products then sort them at random.
$args['related_products'] = array_filter( array_map( 'wc_get_product', wc_get_related_products( $product->get_id(), $args['posts_per_page'], $product->get_upsell_ids() ) ), 'wc_products_array_filter_visible' );
// Handle orderby.
$args['related_products'] = wc_products_array_orderby( $args['related_products'], $args['orderby'], $args['order'] );
// Set global loop values.
wc_set_loop_prop( 'name', 'related' );
wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_related_products_columns', $args['columns'] ) );
wc_get_template( 'single-product/related.php', $args );
}