Il s'agit d'un Au niveau du développeur document. Si vous n'êtes pas familiarisé avec le code/les modèles et la résolution de conflits potentiels, veuillez vous adresser à un développeur qui connaît bien FooEvents et/ou WooCommerce.
Important, à lire d'abord #
Ces extraits sont fournis à titre gracieux et ne font pas partie de l'offre de produits de FooEvents. Ils sont considérés comme des personnalisations et ne sont pas officiellement pris en charge par FooEvents. En tant que tel, nous ne fournissons pas de support pour les snippets et les personnalisations, conformément à notre politique de support. Conditions d'utilisation. L'utilisation est à vos risques et périls.
Compléter automatiquement les commandes #
Cela permet d'envoyer automatiquement les billets une fois le paiement reçu, au lieu de devoir compléter manuellement la commande. Veuillez vous assurer que les produits de votre événement sont réglés sur "Virtuel" et "Téléchargeable"comme expliqué dans notre documentation d'aidesinon, l'ordre ne sera pas s'achève automatiquement, même si le paiement a été effectué.
Ajoutez le code suivant dans la section functions.php ou via un plugin qui permet d'ajouter des fonctions personnalisées, comme le plugin Extraits de code plugin. Évitez d'ajouter du code personnalisé directement dans la section functions.php car il sera écrasé lors de la mise à jour du thème.
Vous pouvez également remplacer le statut "Terminé" par un autre statut de commande tel que "En cours de traitement".
/** * Compléter automatiquement toutes les commandes WooCommerce. */ add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order' ) ; function custom_woocommerce_auto_complete_order( $order_id ) { if ( ! $order_id ) { return ; } $order = wc_get_order( $order_id ) ; $order->update_status( 'completed' ) ; }
Afficher le nom et l'adresse électronique du participant dans l'e-mail d'administration de la nouvelle commande #
Ajoutez l'extrait de code suivant à la section functions.php fichier. Vous pouvez modifier l'e-mail dans lequel il s'affiche en utilisant un autre format d'e-mail. crochet.
. [php] add_action( 'woocommerce_email_customer_details', 'fooevents_display_attendee_details_in_new_order_email', 10 , 4) ; function fooevents_display_attendee_details_in_new_order_email($order, $sent_to_admin, $plain_text, $email){ echo "<h3>Détails sur les participants</h3>" ; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true) ; foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>" ; echo '<strong>Prénom</strong>: '.$ticket['WooCommerceEventsAttendeeName'].'<br />' ; echo '<strong>Nom de famille</strong>: '.$ticket['WooCommerceEventsAttendeeLastName'].'<br />' ; echo '<strong>Adresse électronique</strong>: '.$ticket['WooCommerceEventsAttendeeEmail'].'<br />' ; echo "</p>"; } } }
Afficher tous les champs personnalisés des participants sans étiquette dans l'e-mail d'administration de la nouvelle commande #
Ajoutez l'extrait de code suivant à la section functions.php fichier. Vous pouvez modifier l'e-mail dans lequel il s'affiche en utilisant un autre format d'e-mail. crochet.
. [php] add_action( 'woocommerce_email_customer_details', 'fooevents_display_attendee_details_in_new_order_email', 10 , 4) ; function fooevents_display_attendee_details_in_new_order_email($order, $sent_to_admin, $plain_text, $email){ echo "<h3>Détails sur les participants</h3>" ; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true) ; foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>" ; echo '<strong>Prénom</strong>: '.$ticket['WooCommerceEventsAttendeeName'].'<br />' ; echo '<strong>Nom de famille</strong>: '.$ticket['WooCommerceEventsAttendeeLastName'].'<br />' ; echo '<strong>Adresse électronique</strong>: '.$ticket['WooCommerceEventsAttendeeEmail'].'<br />' ; foreach ($ticket['WooCommerceEventsCustomAttendeeFields'] as $caf) { echo $caf.'<br />' ; } echo "</p>"; } } }
Afficher les champs personnalisés des participants avec des étiquettes dans l'e-mail d'administration de la nouvelle commande #
Ajoutez l'extrait de code suivant à la section functions.php fichier. Vous pouvez modifier l'e-mail dans lequel il s'affiche en utilisant un autre format d'e-mail. crochet. Veillez à remplacer "ovsxtmynwagotamjqieq" et "ruzwhgbuhzuzzdwnnaxe" dans le code de l'exemple par le code de votre champ de participant personnalisé. Vous trouverez ces informations en éditant un billet et en recherchant chaque champ de participant personnalisé dans la section "Champs personnalisés". Vous devrez ajouter chaque champ de participant personnalisé et son étiquette individuellement.
. [php] add_action( 'woocommerce_email_customer_details', 'fooevents_display_attendee_details_in_new_order_email', 10 , 4) ; function fooevents_display_attendee_details_in_new_order_email($order, $sent_to_admin, $plain_text, $email){ echo "<h3>Détails sur les participants</h3>" ; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true) ; foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>" ; echo '<strong>Prénom</strong>: '.$ticket['WooCommerceEventsAttendeeName'].'<br />' ; echo '<strong>Nom de famille</strong>: '.$ticket['WooCommerceEventsAttendeeLastName'].'<br />' ; echo '<strong>Adresse électronique</strong>: '.$ticket['WooCommerceEventsAttendeeEmail'].'<br />' ; echo '<strong>Anniversaire</strong>: '.$ticket['WooCommerceEventsCustomAttendeeFields']['fooevents_custom_ovsxtmynwagotamjqieq'].'.<br />' ; echo '<strong>Chanson préférée</strong>: '.$ticket['WooCommerceEventsCustomAttendeeFields']['fooevents_custom_ruzwhgbuhzuzzdwnnaxe'].'.<br />' ; echo "</p>"; } } }
Afficher l'heure de début de l'événement dans la liste des événements #
Ajoutez l'extrait de code suivant à la section functions.php fichier. Stylez l'affichage de l'heure en ajoutant une feuille de style CSS pour la classe "fooevents-date".
Modifiez l'emplacement de l'heure en utilisant un autre format d'affichage. crochet.
. [php] function fooevents_display_time_in_shop_listing() { global $post ; if (is_front_page() || is_home() || is_shop() || is_product_category() || is_product_tag()) { echo '<div class="fooevents-date">' ; echo get_post_meta($post->ID, 'WooCommerceEventsHour', true).':' ; echo get_post_meta($post->ID, 'WooCommerceEventsMinutes', true). ' ' ; echo get_post_meta($post->ID, 'WooCommerceEventsPeriod', true) ; echo '</div>' ; } } add_filter('woocommerce_after_shop_loop_item_title', 'fooevents_display_time_in_shop_listing', 35 ) ;[/php]
Afficher les participants inscrits sous forme de tableau #
Ajoutez l'extrait de code suivant à la section functions.php pour afficher tous les participants inscrits à votre événement dans un tableau au format grille. Après avoir ajouté l'extrait de code, vous pouvez utiliser le shortcode comme suit :
[fooevents_attendees]
pour afficher tous les participants à tous les événements, ou comme ceci :
[fooevents_attendees product_id=123]
où "123" est l'identifiant de l'événement pour lequel vous souhaitez afficher la liste des participants.
function fooevents_display_attendees($attributes) { $product_id='' ; if(!empty($attributes['product_id'])) { $product_id = $attributes['product_id'] ; } $output ='' ; $args = array( 'numberposts' => -1, 'posts_per_page' => -1, 'post_type' => 'event_magic_tickets', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'WooCommerceEventsProductID', 'value' => $product_id, 'compare' => 'LIKE' ) ) ) ; $the_query = new WP_Query( $args ) ; if( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post() ; $postid = $the_query->post->ID ; // affiche tous les résultats - PERSONNALISEZ A VOTRE CARACTERE $output .= "<tr>" ; $output .= "<td>".get_the_title()."</td>" ; $output .= "<td>".get_post_meta($postid, 'WooCommerceEventsPurchaserFirstName', true).".</td>" ; $output .= "<td>".get_post_meta($postid, 'WooCommerceEventsPurchaserLastName', true).".</td>" ; $output .= "</tr>" ; endwhile ; endif ; wp_reset_query() ; $output ="<table>"Sortie .1TP12".</table>" ; return $output ; } add_shortcode("fooevents_attendees", "fooevents_display_attendees") ; [/php]
Afficher la date de l'événement avant le titre sur la page du produit #
Modifiez l'emplacement de la date en utilisant un autre format. crochet.
. [php] function fooevents_display_date_on_single() { global $post ; $product = wc_get_product( $post->ID ) ; $start_date = $product->get_meta( 'WooCommerceEventsDate' ) ; $end_date = $product->get_meta('WooCommerceEventsEndDate' ) ; if ( $end_date ) { printf( '<h3>%s</h3>', esc_html( $start_date . ' - ' . $end_date ) ) ; } else if( $start_date ) { printf( '<h3>%s</h3>', esc_html( $start_date ) ) ; } } add_action( 'woocommerce_single_product_summary', 'fooevents_display_date_on_single' ) ;
Si vous souhaitez que la date de l'événement soit disponible sous la forme d'un code court, vous pouvez ajouter la ligne suivante sous la fonction :
add_shortcode( 'fooevents_date_on_single', 'fooevents_display_date_on_single') ;
Vous pouvez ensuite utiliser le shortcode [fooevents_date_on_single]
pour afficher la date de l'événement sur la page.
Remplacer l'icône du siège sur le plan de table par une image différente #
Modifiez l'extrait de code CSS suivant en ajoutant l'URL d'une image différente qui remplacera l'image par défaut pour tous les sièges. Ajoutez l'extrait de code modifié au fichier CSS personnalisé de votre thème.
#fooevents_seating_dialog .fooevents_seating_chart_view_row span { background-image : url(../images/seat.svg) ; }
Supprimer l'icône du siège sur le plan de salle pour que les sièges s'affichent sous forme de cases. #
#fooevents_seating_dialog .fooevents_seating_chart_view_row span { background-image : none ; }
Modifier le sens des numéros de sièges sur le plan de salle #
#fooevents_seating_dialog .fooevents_seating_chart_view_row { display : flex ; flex-direction : row-reverse ; justify-content : flex-end ; }
Afficher les sièges impairs à droite et les sièges pairs à gauche #
#fooevents_seating_dialog .fooevents_seating_chart_view_row > span:nth-of-type(even) { float : left ; }
Afficher les sièges au milieu du plan de salle #
[css] #fooevents_seating_dialog .fooevents_seating_chart_view_row_name, #fooevents_seating_dialog .fooevents_seating_chart_view_row { text-align : center ; } [/css]
Laisser le plan de salle défiler horizontalement au lieu d'afficher les sièges de la rangée suivante #
Cela peut être utile si vous avez plusieurs sièges par rangée et que vous souhaitez qu'ils s'affichent les uns à côté des autres plutôt que sur la rangée suivante s'ils ne tiennent pas sur une seule ligne.
#fooevents_seating_dialog .fooevents_seating_chart_view_row { overflow-x : scroll ; white-space : nowrap ; }
Afficher une grille de calendrier sur les ordinateurs de bureau et une liste de semaines de calendrier sur les téléphones portables #
Ajoutez deux shortcodes de calendrier sur la page ou l'article où vous souhaitez afficher votre calendrier. Le premier shortcode affichera une grille de calendrier et devrait ressembler à ceci :
[fooevents_calendar id="desktop"]
Le deuxième shortcode affichera une liste de semaines de calendrier et devrait ressembler à ceci :
[fooevents_calendar id="mobile" defaultView="listWeek"]
Ajoutez l'extrait de code CSS suivant au fichier CSS personnalisé de votre thème. Assurez-vous que la valeur du sélecteur CSS ID est la même que la valeur de l'attribut "id" que vous avez spécifié dans le shortcode. Vous pouvez ajuster la propriété "max-width" à la taille de l'écran où vous souhaitez que la liste des semaines du calendrier s'affiche et que la grille du calendrier soit masquée.
#desktop_fooevents_calendar { display : block ; } #mobile_fooevents_calendar { display : none ; } @media screen and (max-width : 600px) { #desktop_fooevents_calendar { display : none ; } #mobile_fooevents_calendar { display : block ; } }
Modifier la position de l'icône Copier les détails de l'acheteur #
L'extrait suivant aligne le bouton de copie à droite de l'étiquette du prénom :
.fooevents-copy-from-purchaser { float : right ; margin-bottom:-1.7em }
Si vous n'utilisez pas d'étiquettes mais plutôt des espaces réservés pour les entrées, veuillez utiliser l'extrait de code suivant :
.fooevents-copy-from-purchaser { float : right ; margin-top:-2em }
Afficher l'onglet "Détails de l'événement" en premier sur la page de l'événement #
Ajoutez l'extrait de code suivant à la section functions.php fichier.
add_filter('woocommerce_product_tabs', 'reorder_tabs', 98 ) ; function reorder_tabs( $tabs ) { $tabs['woocommerce_events']['priority'] = 1 ; return $tabs ; }
Diriger tous les boutons "Ajouter au panier" vers les pages produits #
S'il s'agit d'un produit simple, par défaut, le bouton "Ajouter au panier" ajoutera automatiquement un produit au panier du client. Lorsque vous utilisez l'extension FooEvents Réservations, vous pouvez demander à vos clients d'aller d'abord sur la page du produit pour sélectionner la date et le créneau de réservation. L'extrait suivant garantit que lorsque l'utilisateur clique sur le bouton "Ajouter au panier" pour les produits simples, il est dirigé vers la page du produit.
add_filter('woocommerce_loop_add_to_cart_link', 'fooevents_modify_add_to_cart_button_url', 10, 2 ) ; function fooevents_modify_add_to_cart_button_url( $button, $product ) { if (is_product_category() || is_shop()) { $button_text = $product->add_to_cart_text() ; $button_link = $product->get_permalink() ; $button = '<a class="button" href="/fr/' . $button_link . '/">' . $button_text . '</a>' ; return $button ; } }
Affichage de FREE si le prix de l'événement est fixé à zéro (0) #
Ajoutez l'extrait de code suivant à la section functions.php si vous voulez changer les événements et les produits dont le prix est "0" en "GRATUIT". Vous pouvez également remplacer le mot "GRATUIT" par un autre mot ou une autre phrase, ou le laisser vide si vous ne voulez rien afficher.
add_filter( 'woocommerce_get_price_html', 'wp_price_free_zero_empty', 100, 2 ); function wp_price_free_zero_empty( $price, $product ) { if ( '' === $product->get_price() || 0 == $product->get_price() ) { $price = 'FREE'; } return $price; }
Afficher les produits et les variations (tickets) dans un tableau en forme de grille #
Ajoutez l'extrait de code suivant à la section functions.php afin d'afficher les produits et les variations dans un tableau au format grille sur la page de l'événement/du produit au lieu de la liste déroulante par défaut. Chaque option de billet sera listée dans une nouvelle ligne et aura son propre sélecteur de quantité.
A noter : Cet extrait de code est incompatible avec l'option FooEvents Sièges et le Afficher les options de sièges sur les pages de produits option. Elle devrait fonctionner avec les événements "Places" si vous n'affichez le tableau des places que sur la page de paiement.
/** Add your event IDs in array like this * if you only want certain events * to display variations in a table: * array( 123, 456 ) */ $products = array( ); $products_multi_button = array( ); /** * Add multiple variations with quantities at once in add to cart url using notation "<product_id or variation_id>:<product_quantity>,..." */ function fooevents_add_multiple_products_to_cart( $url = false ) { if ( ! empty( $_GET['add-to-cart'] ) ) { // Make sure WC is installed and add-to-cart query arg exists if ( ! class_exists( 'WC_Form_Handler' ) || empty( $_REQUEST['add-to-cart'] ) ) { return; } // Remove WooCommerce's hook since it doesn't handle multiple products/variations remove_action( 'wp_loaded', array( 'WC_Form_Handler', 'add_to_cart_action' ), 20 ); $product_ids = explode( ',', $_REQUEST['add-to-cart'] ); $count = count( $product_ids ); $number = 0; foreach ( $product_ids as $id_and_quantity ) { if ( ! empty( $_GET['fooevents_bookings_method'] ) ) { $_POST['fooevents_bookings_method'] = $_GET['fooevents_bookings_method']; } else { $_POST['fooevents_bookings_method'] = 'slotdate'; } if ( ! empty( $_GET['bookings_sid'] ) ) { $_POST['fooevents_bookings_slot_val__trans'] = $_GET['bookings_sid']; } if ( ! empty( $_GET['bookings_did'] ) ) { $_POST['fooevents_bookings_date_val__trans'] = $_GET['bookings_did']; } if ( ! empty( $_GET['bookings_slot_date'] ) ) { $_POST['fooevents_bookings_slot_date_val_trans'] = $_GET['bookings_slot_date']; } // Check for quantities defined in notation (<product_id or variation_id>:<product_quantity>) $id_and_quantity = explode( ':', $id_and_quantity ); $product_id = $id_and_quantity[0]; $_REQUEST['quantity'] = ! empty( $id_and_quantity[1] ) ? absint( $id_and_quantity[1] ) : 1; if ( ++$number === $count ) { // Send back to WooCommerce's add_to_cart_action method for handling. $_REQUEST['add-to-cart'] = $product_id; return WC_Form_Handler::add_to_cart_action( $url ); } $product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $product_id ) ); $was_added_to_cart = false; $adding_to_cart = wc_get_product( $product_id ); if ( ! $adding_to_cart ) { continue; } $add_to_cart_handler = apply_filters( 'woocommerce_add_to_cart_handler', $adding_to_cart->get_type(), $adding_to_cart ); // Variable product handling if ( 'variable' === $add_to_cart_handler ) { fooevents_invoke_multiple_adds( 'WC_Form_Handler', 'add_to_cart_handler_variable', $product_id ); // Grouped Products } elseif ( 'grouped' === $add_to_cart_handler ) { fooevents_invoke_multiple_adds( 'WC_Form_Handler', 'add_to_cart_handler_grouped', $product_id ); // Custom Handler } elseif ( has_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler ) ) { do_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler, $url ); // Simple Products } else { fooevents_invoke_multiple_adds( 'WC_Form_Handler', 'add_to_cart_handler_simple', $product_id ); } } } } add_action( 'wp_loaded', 'fooevents_add_multiple_products_to_cart', 15 ); function fooevents_invoke_multiple_adds( $class_name, $methodName ) { if ( version_compare( phpversion(), '5.3', '<' ) ) { throw new Exception( 'PHP version does not support ReflectionClass::setAccessible()', __LINE__ ); } $args = func_get_args(); unset( $args[0], $args[1] ); $reflection = new ReflectionClass( $class_name ); $method = $reflection->getMethod( $methodName ); $method->setAccessible( true ); $args = array_merge( array( $reflection ), $args ); return call_user_func_array( array( $method, 'invoke' ), $args ); } /** * Display variations in a table format. */ function woocommerce_variable_add_to_cart() { global $product, $post, $products, $products_multi_button; $woocommerce_events_type = get_post_meta( $post->ID, 'WooCommerceEventsType', true ); // Comma separated list of product ID's that should display variations in table format. Leave empty to display all products ( e.g array() ) if ( in_array( $post->ID, $products ) || empty( $products ) ) { // Set default in each input box to 0 instead of 1 add_filter( 'woocommerce_quantity_input_args', 'fooevents_quantity_input_default', 10, 2 ); $variations = find_valid_variations(); // Check if the special 'price_grid' meta is set, if it is, load the default template. if ( get_post_meta( $post->ID, 'price_grid', true ) ) { // Enqueue variation scripts. wp_enqueue_script( 'wc-add-to-cart-variation' ); // Load the template wc_get_template( 'single-product/add-to-cart/variable.php', array( 'available_variations' => $product->get_available_variations(), 'attributes' => $product->get_variation_attributes(), 'selected_attributes' => $product->get_variation_default_attributes(), ) ); return; } // Custom template ?> <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20JavaScript%20to%20build%20add%20to%20cart%20link%20based%20on%20quantity%20inputs%20and%20booking%20slots%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20is_bookable%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20jQuery(document).ready(function%20()%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20link_original%20%3D%20jQuery(%22%23add_to_cart_link%22).attr('data-href')%20%2B%20%22%3Fadd-to-cart%3D%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20link%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Check%20if%20booking%20slots%20should%20show%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(%20jQuery(%20%22%23fooevents_bookings_slot_val__trans%22%20).length%20%7C%7C%20jQuery(%22%23fooevents_bookings_slot_date_val_trans%22).length%20)%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20booking_settings_link%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20bookings_sid%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20bookings_did%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20bookings_method%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20bookings_slot_date%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20is_bookable%20%3D%20true%3B%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bookings_sid%20%3D%20jQuery(%22%23fooevents_bookings_slot_val__trans%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bookings_did%20%3D%20jQuery(%22%23fooevents_bookings_date_val__trans%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bookings_method%20%3D%20jQuery(%22%23fooevents_bookings_method%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bookings_slot_date%20%3D%20jQuery(%22%23fooevents_bookings_slot_date_val_trans%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23fooevents_bookings_slot_val__trans%22).change(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bookings_sid%20%3D%20jQuery(%22%23fooevents_bookings_slot_val__trans%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20updateLink(link%2Cbookings_sid%2Cbookings_did%2Cbookings_method%2Cbookings_slot_date)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23fooevents_bookings_date_val__trans%22).change(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bookings_did%20%3D%20jQuery(%22%23fooevents_bookings_date_val__trans%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20updateLink(link%2Cbookings_sid%2Cbookings_did%2Cbookings_method%2Cbookings_slot_date)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23fooevents_bookings_slot_date_val_trans%22).change(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bookings_slot_date%20%3D%20jQuery(%22%23fooevents_bookings_slot_date_val_trans%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20updateLink(link%2Cbookings_sid%2Cbookings_did%2Cbookings_method%2Cbookings_slot_date)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22.quantity%20input%22).change(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20link%20%3D%20link_original%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20no_quantity%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22.variations%20tr%22).each(function()%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20var_id%20%3D%20jQuery(this).find(%22input%5Bname%3Dvariation_id%5D%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20total%20%3D%20jQuery(this).find(%22.quantity%20input%22).val()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(total%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20no_quantity%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20link%20%2B%3D%20var_id%20%2B%20%22%3A%22%20%2B%20total%20%2B%20%22%2C%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(no_quantity%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).removeAttr('href')%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20updateLink(link%2Cbookings_sid%2Cbookings_did%2Cbookings_method%2Cbookings_slot_date)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20function%20updateLink(link%2Cbookings_sid%3D%22%22%2Cbookings_did%3D%22%22%2Cbookings_method%3D%22%22%2Cbookings_slot_date%3D%22%22)%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(is_bookable)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(bookings_sid%20!%3D%20%22%22%20%26%26%20bookings_did%20!%3D%20%22%22%20%26%26%20bookings_sid%20!%3D%20undefined%20%26%26%20bookings_did%20!%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).attr('data-href'%2C%20link.slice(0%2C-1)%20%2B%20%22%26bookings_sid%3D%22%20%2B%20bookings_sid%20%2B%20%22%26bookings_did%3D%22%20%2B%20bookings_did%20%2B%20%22%26fooevents_bookings_method%3D%22%20%2B%20bookings_method)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).attr('href'%2C%20jQuery(%22%23add_to_cart_link%22).attr('data-href'))%3B%09%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(bookings_slot_date%20!%3D%20%22%22%20%26%26%20bookings_slot_date%20!%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).attr('data-href'%2C%20link.slice(0%2C-1)%20%2B%20%22%26fooevents_bookings_method%3D%22%20%2B%20bookings_method%20%2B%20%22%26bookings_slot_date%3D%22%20%2B%20bookings_slot_date)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).attr('href'%2C%20jQuery(%22%23add_to_cart_link%22).attr('data-href'))%3B%09%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).attr('data-href'%2C%20link.slice(0%2C-1))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).attr('data-href'%2C%20link.slice(0%2C-1))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jQuery(%22%23add_to_cart_link%22).attr('href'%2C%20jQuery(%22%23add_to_cart_link%22).attr('data-href'))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" /> <form class="cart" action="<?php echo esc_url( $product->add_to_cart_url() ); ?>" method="post" enctype='multipart/form-data'> <table class="variations variations-grid" cellspacing="0"> <tbody> <?php $variation = 0; foreach ( $variations as $key => $value ) { if ( ! $value['variation_is_visible'] ) { continue; } if ( $variation != $value['variation_id'] ) { if ( in_array( $post->ID, $products_multi_button ) ) { ?> <tr> <td> <?php foreach ( $value['attributes'] as $key => $val ) { $val = str_replace( array( '-', '_' ), ' ', $val ); printf( '<div class="attr attr-%s">%s</div>', $key, ucwords( $val ) ); } ?> </td> <td> <?php echo $value['price_html']; ?> </td> <?php if ( $value['is_in_stock'] ) { ?> <form class="cart" action="<?php echo esc_url( $product->add_to_cart_url() ); ?>" method="post" enctype='multipart/form-data'> <td id="variation_<?php echo $value['variation_id']; ?>"> <?php woocommerce_quantity_input(); ?> <?php $variation_minimum_quantity = get_post_meta( $value['variation_id'], 'variation_minimum_allowed_quantity', true ); $variation_maximum_quantity = get_post_meta( $value['variation_id'], 'variation_maximum_allowed_quantity', true ); $variation_group_of_quantity = get_post_meta( $value['variation_id'], 'variation_group_of_quantity', true ); ?> <?php if ( isset( $variation_group_of_quantity ) ) { ?> <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3E%0A%09%09%09%09%09%09%09%09%09%09jQuery(document).ready(function(%24)%7B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22step%22%2C%20%3C%3Fphp%20echo%20%24variation_group_of_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22value%22%2C%20%3C%3Fphp%20echo%20%24variation_group_of_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22min%22%2C%20%3C%3Fphp%20echo%20%24variation_minimum_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22max%22%2C%20%3C%3Fphp%20echo%20%24variation_maximum_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%7D)%3B%0A%09%09%09%09%09%09%09%09%09%09%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" /> <?php } ?> </td> <td> <?php if ( ! empty( $value['attributes'] ) ) { foreach ( $value['attributes'] as $attr_key => $attr_value ) { ?> <input type="hidden" name="<?php echo $attr_key; ?>" value="<?php echo $attr_value; ?>"> <?php } } ?> <button type="submit" class="single_add_to_cart_button btn btn-primary"><span class="glyphicon glyphicon-tag"></span> Add to cart</button> </td> <input type="hidden" name="variation_id" value="<?php echo $value['variation_id']; ?>" /> <input type="hidden" name="product_id" value="<?php echo esc_attr( $post->ID ); ?>" /> <input type="hidden" name="add-to-cart" value="<?php echo esc_attr( $post->ID ); ?>" /> </form> <?php } else { ?> <td colspan="2"> <p class="stock out-of-stock"><?php _e( 'This item is currently out of stock and unavailable.', 'woocommerce' ); ?></p> </td> <?php } ?> </tr> <?php } else { ?> <tr> <td style="display:table-cell"> <?php foreach ( $value['attributes'] as $key => $val ) { $val = str_replace( array( '-', '_' ), ' ', $val ); printf( '<div class="attr attr-%s">%s</div>', $key, ucwords( $val ) ); } ?> </td> <td style="display:table-cell"> <?php echo $value['price_html']; ?> </td> <?php if ( $value['is_in_stock'] ) { ?> <td id="variation_<?php echo $value['variation_id']; ?>" style="display:table-cell"> <?php woocommerce_quantity_input(); ?> <?php $variation_minimum_quantity = get_post_meta( $value['variation_id'], 'variation_minimum_allowed_quantity', true ); $variation_maximum_quantity = get_post_meta( $value['variation_id'], 'variation_maximum_allowed_quantity', true ); $variation_group_of_quantity = get_post_meta( $value['variation_id'], 'variation_group_of_quantity', true ); ?> <?php if ( isset( $variation_group_of_quantity ) ) { ?> <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3E%0A%09%09%09%09%09%09%09%09%09%09jQuery(document).ready(function(%24)%7B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22step%22%2C%20%3C%3Fphp%20echo%20%24variation_group_of_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22value%22%2C%20%3C%3Fphp%20echo%20%24variation_group_of_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22min%22%2C%20%3C%3Fphp%20echo%20%24variation_minimum_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%09%24(%20%22%23variation_%3C%3Fphp%20echo%20%24value%5B'variation_id'%5D%3B%20%3F%3E%20.qty%22%20).attr(%20%22max%22%2C%20%3C%3Fphp%20echo%20%24variation_maximum_quantity%3B%20%3F%3E%20)%3B%0A%09%09%09%09%09%09%09%09%09%09%7D)%3B%0A%09%09%09%09%09%09%09%09%09%09%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" /> <?php } ?> </td> <td style="display:table-cell"> <?php if ( ! empty( $value['attributes'] ) ) { foreach ( $value['attributes'] as $attr_key => $attr_value ) { ?> <input type="hidden" name="<?php echo $attr_key; ?>" value="<?php echo $attr_value; ?>"> <?php } } ?> </td> <input type="hidden" name="variation_id" value="<?php echo $value['variation_id']; ?>" /> <input type="hidden" name="product_id" value="<?php echo esc_attr( $post->ID ); ?>" /> <input type="hidden" name="add-to-cart" value="<?php echo esc_attr( $post->ID ); ?>" /> </form> <?php } else { ?> <td colspan="2" style="display:table-cell"> <p class="stock out-of-stock"><?php _e( 'This item is currently out of stock and unavailable.', 'woocommerce' ); ?></p> </td> <?php } ?> </tr> <?php } ?> <?php $variation = $value['variation_id']; } } ?> </tbody> </table> <?php if ( ! in_array( $post->ID, $products_multi_button ) ) { ?> <?php do_action( 'fooevents_output_booking_details' ); ?> <p class="form-row"> <a id="add_to_cart_link" data-href="<?php echo esc_url( $product->add_to_cart_url() ); ?>" type="submit" class="single_add_to_cart_button btn btn-primary button alt wp-element-button"><span class="glyphicon glyphicon-tag"></span> Add to cart</a> </p> <?php } ?> </form> <?php } else { // Enqueue variation scripts. wp_enqueue_script( 'wc-add-to-cart-variation' ); // Get Available variations? $get_variations = count( $product->get_children() ) <= apply_filters( 'woocommerce_ajax_variation_threshold', 30, $product ); // Load the template. wc_get_template( 'single-product/add-to-cart/variable.php', array( 'available_variations' => $get_variations ? $product->get_available_variations() : false, 'attributes' => $product->get_variation_attributes(), 'selected_attributes' => $product->get_default_attributes(), ) ); } } function find_valid_variations() { global $product, $post; $variations = $product->get_available_variations(); $attributes = $product->get_attributes(); $new_variants = array(); // Loop through all variations foreach ( $variations as $variation ) { // Peruse the attributes. // 1. If both are explicitly set, this is a valid variation // 2. If one is not set, that means any, and we must 'create' the rest. $valid = true; // so far foreach ( $attributes as $slug => $args ) { if ( array_key_exists( "attribute_$slug", $variation['attributes'] ) && ! empty( $variation['attributes'][ "attribute_$slug" ] ) ) { // Exists } else { // Not exists, create $valid = false; // it contains 'anys' // loop through all options for the 'ANY' attribute, and add each foreach ( explode( '|', $attributes[ $slug ]['value'] ) as $attribute ) { $attribute = trim( $attribute ); $new_variant = $variation; $new_variant['attributes'][ "attribute_$slug" ] = $attribute; $new_variants[] = $new_variant; } } } // This contains ALL set attributes, and is itself a 'valid' variation. if ( $valid ) { $new_variants[] = $variation; } } return $new_variants; } function fooevents_quantity_input_default( $args, $product ) { $args['input_value'] = 0; return $args; } /** * Adds booking slot dropdowns only to single product page if the event is "Bookable" */ function fooevents_add_booking_slots() { global $post, $products; $wc_product = wc_get_product( $post->ID ); $woocommerce_events_type = get_post_meta( $post->ID, 'WooCommerceEventsType', true ); if ( is_plugin_active( 'fooevents_bookings/fooevents-bookings.php' ) || is_plugin_active_for_network( 'fooevents_bookings/fooevents-bookings.php' ) ) { if ( is_product() && $woocommerce_events_type == 'bookings' && ( in_array( $post->ID, $products ) || empty( $products ) ) && $wc_product->is_type( 'variable' ) ) { $fooevents_bookings = new Fooevents_Bookings(); add_action( 'fooevents_output_booking_details', array( $fooevents_bookings, 'output_booking_fields_product' ) ); } } } add_action( 'wp', 'fooevents_add_booking_slots' );
Ajoutez la prise en charge des heures de début et de fin quotidiennes à vos thèmes de tickets. #
A partir de la version 1.5.5 de la FooEvents Plusieurs jours vous pouvez sélectionner des heures de début et de fin différentes pour chaque jour de la semaine. événement de plusieurs jours. La prise en charge de cette fonctionnalité a également été ajoutée à tous les systèmes d'information de la Commission européenne. FooEvents Thèmes des billets. S'il vous plaît suivre les instructions suivantes pour mettre à jour un thème de billet existant. Si vous utilisez un thème de billet personnalisé et que vous ne pouvez pas le remplacer par la version mise à jour, veuillez ajouter l'extrait de code suivant à votre thème de billet afin d'ajouter la prise en charge des heures de début et de fin. [php]
<!-- MULTI-DAY DETAILS --> <strong><?php printf( __( '%1$s %2$d: ', 'woocommerce-events' ), $ticket['dayTerm'], $x ); ?></strong> <?php echo esc_attr( $date ); ?><br /> <br />
Remplacer les liens par défaut du bouton Ajouter au panier de WooCommerce par des liens vers les produits. #
Les boutons WooCommerce Ajouter au panier affichés par défaut sur les pages de présentation des boutiques ajoutent automatiquement un produit au panier et redirigent l'utilisateur vers la page du panier. Si vous utilisez les réservations FooEvents, vous préférerez peut-être faire passer l'utilisateur par la page du produit afin qu'il puisse d'abord choisir un créneau et une heure de réservation avant de passer à la page du panier. L'extrait suivant remplacera le lien "ajouter au panier" par un lien vers la page du produit. Ainsi, l'utilisateur pourra effectuer la réservation appropriée sur la page du produit avant de passer à la page du panier ou de la caisse.
/** * @snippet Change WooCommerce 'Add to Cart' button to 'View Product' * @source https://www.wptechnic.com/?p=4615 * @author Muhammad Tamzid * @compatible WC 4.3.1 */ // Remplacer le bouton WooCommerce 'Ajouter au panier' par 'Voir le produit' add_filter('woocommerce_loop_add_to_cart_link', 'wpt_custom_view_product_button', 10, 2 ) ; function wpt_custom_view_product_button( $button, $product ) { // Ignorer les produits variables if ( $product->is_type( 'variable' ) ) { return $button ; } // Texte du bouton ici $button_text = __('Book Ticket', 'woocommerce' ) ; return '<a class="button wpt-custom-view-product-button" href="/fr/' . $product->get_permalink() . '/">' . $button_text . '</a>'; }
Afficher la date de l'événement pour les événements "uniques" dans le panier et sur la page de paiement #
add_filter('woocommerce_cart_item_name', 'add_event_date_cart_checkout', 10, 3 ) ; function add_event_date_cart_checkout( $product_name, $cart_item, $cart_item_key ) { $product = $cart_item['data'] ; if ( $value = $product->get_meta( 'WooCommerceEventsDate' ) ) { $product_name .= '' . $value . '' ; } return $product_name ; }