To jest Poziom deweloperski dokument. Jeśli nie jesteś zaznajomiony z kodem/szablonami i rozwiązywaniem potencjalnych konfliktów, skontaktuj się z programistą zaznajomionym z FooEvents i/lub WooCommerce.
Ważne, przeczytaj najpierw #
Te fragmenty są dostarczane jako uprzejmość i nie stanowią części oferty produktów FooEvents. Są one uważane za dostosowania i nie są oficjalnie obsługiwane przez FooEvents. W związku z tym nie zapewniamy wsparcia dla snippetów i dostosowań zgodnie z naszym Warunki świadczenia usług. Używaj na własne ryzyko.
Automatycznie kompletuj zamówienia #
Dzięki temu bilety będą automatycznie wysyłane po otrzymaniu płatności, zamiast konieczności ręcznego uzupełniania zamówienia. Upewnij się, że produkty wydarzenia są ustawione na "Wirtualny" i "Do pobrania", jak wyjaśniono w naszym dokumentacja pomocyw przeciwnym razie kolejność nie będzie zakończy się automatycznie, nawet jeśli dokonano płatności.
Dodaj następujący kod do motywu podrzędnego functions.php lub za pośrednictwem wtyczki, która umożliwia dodawanie niestandardowych funkcji, takich jak Fragmenty kodu wtyczka. Unikaj dodawania niestandardowego kodu bezpośrednio do motywu nadrzędnego functions.php ponieważ zostanie on nadpisany podczas aktualizacji motywu.
Można również zmienić status "Completed" na inny status zamówienia, taki jak "Processing".
/** * Automatyczne wypełnianie wszystkich zleceń 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' ); }
Pokaż imię i nazwisko oraz adres e-mail uczestnika w wiadomości e-mail administratora nowego zamówienia. #
Dodaj następujący fragment kodu do motywu functions.php plik. Możesz zmienić wiadomość e-mail, w której jest ona wyświetlana, używając innej hak.
. [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>Szczegóły dotyczące uczestników</h3>"; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true); foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>"; echo '<strong>Imię</strong>: '.$ticket['WooCommerceEventsAttendeeName']'.<br />'; echo '<strong>Nazwisko</strong>: '.$ticket['WooCommerceEventsAttendeeLastName']'.<br />'; echo '<strong>Adres e-mail</strong>: '.$ticket['WooCommerceEventsAttendeeEmail']'.<br />'; echo "</p>"; } } }
Wyświetlanie wszystkich niestandardowych pól uczestników bez etykiet w wiadomości e-mail administratora nowego zamówienia. #
Dodaj następujący fragment kodu do motywu functions.php plik. Możesz zmienić wiadomość e-mail, w której jest ona wyświetlana, używając innej hak.
. [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>Szczegóły dotyczące uczestników</h3>"; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true); foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>"; echo '<strong>Imię</strong>: '.$ticket['WooCommerceEventsAttendeeName']'.<br />'; echo '<strong>Nazwisko</strong>: '.$ticket['WooCommerceEventsAttendeeLastName']'.<br />'; echo '<strong>Adres e-mail</strong>: '.$ticket['WooCommerceEventsAttendeeEmail']'.<br />'; foreach ($ticket['WooCommerceEventsCustomAttendeeFields'] as $caf) { echo $caf.'<br />'; } echo "</p>"; } } }
Wyświetlanie niestandardowych pól uczestników z etykietami w wiadomości e-mail administratora nowego zamówienia #
Dodaj następujący fragment kodu do motywu functions.php plik. Możesz zmienić wiadomość e-mail, w której jest ona wyświetlana, używając innej hak. Upewnij się, że zastąpiłeś "ovsxtmynwagotamjqieq" i "ruzwhgbuhzuzzdwnnaxe" w przykładowym kodzie swoim własnym niestandardowym kodem pola uczestnika. Informacje te można znaleźć, edytując bilet i szukając każdego niestandardowego pola uczestnika w sekcji "Pola niestandardowe". Będziesz musiał dodać każde niestandardowe pole uczestnika i jego etykietę indywidualnie.
. [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>Szczegóły dotyczące uczestników</h3>"; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true); foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>"; echo '<strong>Imię</strong>: '.$ticket['WooCommerceEventsAttendeeName']'.<br />'; echo '<strong>Nazwisko</strong>: '.$ticket['WooCommerceEventsAttendeeLastName']'.<br />'; echo '<strong>Adres e-mail</strong>: '.$ticket['WooCommerceEventsAttendeeEmail']'.<br />'; echo '<strong>Urodziny</strong>: '.$ticket['WooCommerceEventsCustomAttendeeFields']['fooevents_custom_ovsxtmynwagotamjqieq']'.<br />'; echo '<strong>Ulubiona piosenka</strong>: '.$ticket['WooCommerceEventsCustomAttendeeFields']['fooevents_custom_ruzwhgbuhzuzzdwnnaxe']'.<br />'; echo "</p>"; } } }
Wyświetlanie godziny rozpoczęcia wydarzenia na liście wydarzeń #
Dodaj następujący fragment kodu do motywu functions.php plik. Nadaj styl wyświetlaniu godziny, dodając CSS dla klasy "fooevents-date".
Zmień umiejscowienie czasu, używając innego hak.
. [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]
Wyświetlanie zarejestrowanych uczestników w formie tabeli #
Dodaj następujący fragment kodu do motywu functions.php aby wyświetlić wszystkich zarejestrowanych uczestników wydarzenia w formacie siatki tabeli. Po dodaniu fragmentu kodu możesz użyć shortcode w następujący sposób:
[fooevents_attendees]
aby wyświetlić wszystkich uczestników dla wszystkich wydarzeń, lub w ten sposób:
[fooevents_attendees product_id=123]
gdzie "123" to identyfikator wydarzenia, dla którego chcesz wyświetlić listę uczestników.
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; // wyprowadzenie wszystkich wyników - DOSTOSUJ DO SWOICH UPODOBAŃ $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>".$output".</table>"; return $output; } add_shortcode("fooevents_attendees", "fooevents_display_attendees"); [/php]
Wyświetlanie daty wydarzenia przed tytułem na stronie produktu #
Zmień umiejscowienie daty, używając innego hak.
. [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' );
Jeśli chcesz, aby data wydarzenia była dostępna jako shortcode, możesz dodać następującą linię poniżej funkcji:
add_shortcode( 'fooevents_date_on_single', 'fooevents_display_date_on_single');
Następnie można użyć shortcode [fooevents_date_on_single]
aby wyświetlić datę wydarzenia na stronie.
Zastąpienie ikony miejsca na planie miejsc innym obrazem #
Zmodyfikuj poniższy fragment kodu CSS, dodając adres URL do innego obrazu, którym chcesz zastąpić domyślny obraz siedzenia dla wszystkich miejsc. Dodaj zmodyfikowany fragment kodu do niestandardowego pliku CSS motywu.
#fooevents_seating_dialog .fooevents_seating_chart_view_row span { background-image: url(../images/seat.svg); }
Usuń ikonę miejsca na planie miejsc, aby miejsca były wyświetlane jako boksy. #
#fooevents_seating_dialog .fooevents_seating_chart_view_row span { background-image: none; }
Zmiana kierunku numerów miejsc na planie miejsc #
#fooevents_seating_dialog .fooevents_seating_chart_view_row { display: flex; flex-direction: row-reverse; justify-content: flex-end; }
Pokaż miejsca nieparzyste po prawej stronie, a parzyste po lewej. #
#fooevents_seating_dialog .fooevents_seating_chart_view_row > span:nth-of-type(even) { float: left; }
Wyświetlanie miejsc na środku tabeli miejsc #
[css] #fooevents_seating_dialog .fooevents_seating_chart_view_row_name, #fooevents_seating_dialog .fooevents_seating_chart_view_row { text-align: center; } [/css]
Plan miejsc powinien przewijać się poziomo zamiast wyświetlać miejsca w następnym rzędzie. #
Może to być przydatne, jeśli masz wiele miejsc w rzędzie i chcesz, aby były one wyświetlane obok siebie zamiast w następnym rzędzie, jeśli nie mieszczą się w jednym wierszu.
#fooevents_seating_dialog .fooevents_seating_chart_view_row { overflow-x: scroll; white-space: nowrap; }
Wyświetlanie siatki kalendarza na komputerach stacjonarnych i listy tygodni kalendarza na urządzeniach mobilnych. #
Dodaj dwa skróty kalendarza na stronie lub w poście, w którym chcesz wyświetlić swój kalendarz. Pierwszy shortcode wyświetli siatkę kalendarza i powinien wyglądać następująco:
[fooevents_calendar id="desktop"]
Drugi shortcode wyświetli listę tygodni kalendarza i powinien wyglądać następująco:
[fooevents_calendar id="mobile" defaultView="listWeek"]
Dodaj następujący fragment kodu CSS do niestandardowego pliku CSS motywu. Upewnij się, że wartość selektora CSS ID jest taka sama jak wartość atrybutu "id" określonego w kodzie skróconym. Możesz dostosować właściwość "max-width" do rozmiaru ekranu, na którym ma być wyświetlana lista tygodni kalendarza, a siatka kalendarza ma być ukryta.
#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; } }
Zmiana położenia ikony Kopiuj szczegóły kupującego #
Poniższy fragment kodu spowoduje wyrównanie przycisku kopiowania do prawej strony etykiety imienia:
.fooevents-copy-from-purchaser { float: right; margin-bottom:-1.7em }
Jeśli nie używasz etykiet, a raczej symboli zastępczych, użyj poniższego fragmentu kodu:
.fooevents-copy-from-purchaser { float: right; margin-top:-2em }
Pokaż zakładkę "Szczegóły wydarzenia" jako pierwszą na stronie wydarzenia. #
Dodaj następujący fragment kodu do motywu functions.php plik.
add_filter( 'woocommerce_product_tabs', 'reorder_tabs', 98 ); function reorder_tabs( $tabs ) { $tabs['woocommerce_events']['priority'] = 1; return $tabs; }
Przekieruj wszystkie przyciski "Dodaj do koszyka" na strony produktów. #
Jeśli produkt jest produktem prostym, domyślnie przycisk "Dodaj do koszyka" automatycznie doda produkt do koszyka klienta. W przypadku korzystania z rozszerzenia FooEvents Bookings może być wymagane, aby klienci najpierw przeszli do strony produktu, aby wybrać datę i miejsce rezerwacji. Poniższy fragment kodu zapewni, że po kliknięciu przycisku "Dodaj do koszyka" dla prostych produktów, użytkownik zostanie przekierowany na stronę produktu.
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="/pl/' . $button_link . '/">' . $button_text . '</a>'; return $button; } }
Wyświetla FREE, jeśli cena wydarzenia jest ustawiona na zero (0). #
Dodaj następujący fragment kodu do motywu functions.php jeśli chcesz zmienić wydarzenia i produkty z ceną "0" na "FREE". Możesz również zastąpić słowo "FREE" innym słowem lub frazą lub pozostawić je puste, jeśli nie chcesz, aby cokolwiek było wyświetlane.
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; }
Wyświetlanie produktów i wariantów (biletów) w formacie siatki tabeli #
Dodaj następujący fragment kodu do motywu functions.php aby wyświetlać produkty i warianty w formacie siatki tabeli na stronie wydarzenia/produktu zamiast domyślnej listy rozwijanej. Każda opcja biletu zostanie wyświetlona w nowym wierszu i będzie miała własny selektor ilości.
Uwaga: Ten fragment kodu jest niekompatybilny z aplikacją FooEvents Siedzenie i Wyświetlanie opcji miejsc siedzących na stronach produktów opcja. Powinno to działać w przypadku wydarzeń z miejscami siedzącymi, jeśli karta miejsc siedzących jest wyświetlana tylko na stronie kasy.
/** 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' );
Dodaj obsługę dziennych godzin rozpoczęcia i zakończenia do motywów biletów #
Od wersji 1.5.5 z FooEvents Wielodniowy wtyczki, można wybrać różne godziny rozpoczęcia i zakończenia dla każdego dnia wydarzenie wielodniowe. Obsługa tej funkcji została również dodana do wszystkich Motywy biletów FooEvents. Proszę Postępuj zgodnie z poniższymi instrukcjami aby zaktualizować istniejący szablon biletu. Jeśli korzystasz z niestandardowego szablonu biletu i nie jesteś w stanie zastąpić szablonu biletu zaktualizowaną wersją, dodaj poniższy fragment kodu do szablonu biletu, aby dodać obsługę czasu rozpoczęcia i zakończenia. [php]
<!-- MULTI-DAY DETAILS --> <strong><?php printf( __( '%1$s %2$d: ', 'woocommerce-events' ), $ticket['dayTerm'], $x ); ?></strong> <?php echo esc_attr( $date ); ?><br /> . ?) ? ' ' . $ticket['WooCommerceEventsSelectDatePeriod'][ $y ] : ''; ?>. . <br />
Zastąp domyślne linki przycisków Dodaj do koszyka WooCommerce linkami do produktów. #
Domyślne przyciski WooCommerce Dodaj do koszyka wyświetlane na stronach z listą sklepów automatycznie dodają produkt do koszyka i przekierowują na stronę koszyka. W przypadku korzystania z rezerwacji FooEvents preferowane może być przekierowanie użytkownika przez stronę produktu, aby mógł najpierw dokonać wyboru miejsca i czasu rezerwacji przed przejściem do strony koszyka. Poniższy fragment kodu zastąpi link dodawania do koszyka linkiem do strony produktu. Dzięki temu użytkownik będzie mógł dokonać odpowiedniego wyboru rezerwacji na stronie produktu przed przejściem do koszyka lub strony kasy.
/** * @snippet Zmień przycisk WooCommerce "Dodaj do koszyka" na "Zobacz produkt * @source https://www.wptechnic.com/?p=4615 * @author Muhammad Tamzid * @compatible WC 4.3.1 */ // Zmień przycisk WooCommerce "Dodaj do koszyka" na "Wyświetl produkt add_filter( 'woocommerce_loop_add_to_cart_link', 'wpt_custom_view_product_button', 10, 2 ); function wpt_custom_view_product_button( $button, $product ) { // Ignorowanie w przypadku zmiennych produktów if ( $product->is_type( 'variable' ) ) { return $button; } // Tekst przycisku tutaj $button_text = __( 'Zarezerwuj bilet', 'woocommerce' ); return '<a class="button wpt-custom-view-product-button" href="/pl/' . $product->get_permalink() . '/">' . $button_text . '</a>'; }
Wyświetlanie daty wydarzenia dla "pojedynczych" wydarzeń w koszyku i na stronie kasy. #
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; }