Este é um Nível de programador documento. Se não estiver familiarizado com o código/modelos e com a resolução de potenciais conflitos, contacte um programador que esteja familiarizado com o FooEvents e/ou o WooCommerce.
Importante, por favor leia primeiro #
Estes snippets são fornecidos como cortesia e não fazem parte da oferta de produtos do FooEvents. Eles são considerados customizações e não são oficialmente suportados pelo FooEvents. Como tal, não fornecemos suporte para snippets e personalizações de acordo com nosso Termos do serviço. Utilizar por sua conta e risco.
Concluir automaticamente as encomendas #
Isto permite que os bilhetes sejam enviados automaticamente após a receção do pagamento, em vez de ter de completar manualmente a encomenda. Certifique-se de que os produtos do seu evento estão definidos para "Virtual" e "Descarregável", tal como explicado no nosso documentação de ajuda, caso contrário, a ordem não completar automaticamente, mesmo que o pagamento tenha sido efectuado.
Adicione o seguinte código ao tema filho do seu functions.php ou através de um plugin que permita a adição de funções personalizadas, como o Trechos de código plugin. Evite adicionar código personalizado diretamente ao functions.php pois este será substituído quando atualizar o tema.
Também pode alterar o estado "Concluído" para outro estado da encomenda, como "Em processamento".
/** * @snippet Programmatically Complete Paid WooCommerce Orders * @how-to businessbloomer.com/woocommerce-customization * @author Rodolfo Melogli, Business Bloomer * @testedwith WooCommerce 9 * @community https://businessbloomer.com/club/ */ add_filter( 'woocommerce_payment_complete_order_status', 'bbloomer_autocomplete_processing_orders', 9999 ); function bbloomer_autocomplete_processing_orders() { return 'completed'; }
Note that the above code snippet won’t work with COD / BACS / Cheque orders when order total is > 0. Check the free plugin on this page to get this sorted.
Mostrar o nome e o e-mail do participante no e-mail de administração da Nova Ordem #
Adicione o seguinte trecho de código ao functions.php ficheiro. Pode alterar o correio eletrónico em que este é apresentado, utilizando um ficheiro gancho.
. [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>Detalhes do participante</h3>"; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true); foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>"; echo '<strong>Nome próprio</strong>: '.$ticket['WooCommerceEventsAttendeeName'].'<br />'; ecoar '<strong>Apelido</strong>: '.$ticket['WooCommerceEventsAttendeeLastName'].'<br />'; ecoar '<strong>Endereço de correio eletrónico</strong>: '.$ticket['WooCommerceEventsAttendeeEmail'].'<br />'; echo "</p>"; } } }
Mostrar todos os campos personalizados de participantes sem etiquetas no e-mail de administração da Nova Encomenda #
Adicione o seguinte trecho de código ao functions.php ficheiro. Pode alterar o correio eletrónico em que este é apresentado, utilizando um ficheiro gancho.
. [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>Detalhes do participante</h3>"; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true); foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>"; echo '<strong>Nome próprio</strong>: '.$ticket['WooCommerceEventsAttendeeName'].'<br />'; ecoar '<strong>Apelido</strong>: '.$ticket['WooCommerceEventsAttendeeLastName'].'<br />'; ecoar '<strong>Endereço de correio eletrónico</strong>: '.$ticket['WooCommerceEventsAttendeeEmail'].'<br />'; foreach ($ticket['WooCommerceEventsCustomAttendeeFields'] as $caf) { echo $caf.'<br />'; } echo "</p>"; } } }
Mostrar campos de participantes personalizados com etiquetas no e-mail de administração da Nova Encomenda #
Adicione o seguinte trecho de código ao functions.php ficheiro. Pode alterar o correio eletrónico em que este é apresentado, utilizando um ficheiro gancho. Certifique-se de substituir "ovsxtmynwagotamjqieq" e "ruzwhgbuhzuzzdwnnaxe" no código de exemplo pelo seu código de campo de participante personalizado específico. Pode encontrar esta informação se editar um bilhete e procurar cada campo de participante personalizado na secção "Campos personalizados". É necessário adicionar cada campo de participante personalizado e sua etiqueta individualmente.
. [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>Detalhes do participante</h3>"; $WooCommerceEventsOrderTickets = get_post_meta($order->get_id(), 'WooCommerceEventsOrderTickets', true); foreach($WooCommerceEventsOrderTickets as $event) { foreach($event as $ticket) { echo "<p>"; echo '<strong>Nome próprio</strong>: '.$ticket['WooCommerceEventsAttendeeName'].'<br />'; ecoar '<strong>Apelido</strong>: '.$ticket['WooCommerceEventsAttendeeLastName'].'<br />'; ecoar '<strong>Endereço de correio eletrónico</strong>: '.$ticket['WooCommerceEventsAttendeeEmail'].'<br />'; ecoar '<strong>Aniversário</strong>: '.$ticket['WooCommerceEventsCustomAttendeeFields']['fooevents_custom_ovsxtmynwagotamjqieq'].<br />'; ecoar '<strong>Canção favorita</strong>: '.$ticket['WooCommerceEventsCustomAttendeeFields']['fooevents_custom_ruzwhgbuhzuzzdwnnaxe'].<br />'; echo "</p>"; } } }
Mostrar a hora de início do evento na listagem de eventos #
Adicione o seguinte trecho de código ao functions.php ficheiro. Estilize a apresentação da hora adicionando CSS para a classe 'fooevents-date'.
Alterar o posicionamento da hora utilizando um gancho.
. [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]
Apresentar os participantes registados em formato de tabela #
Adicione o seguinte trecho de código ao functions.php para apresentar todos os participantes registados no seu evento num formato de grelha de tabela. Depois de adicionar o fragmento de código, pode utilizar o shortcode da seguinte forma:
[fooevents_attendees]
para mostrar todos os participantes de todos os eventos, ou assim:
[fooevents_attendees product_id=123]
em que "123" é o ID do evento para o qual se pretende apresentar a lista de participantes.
function fooevents_display_attendees($attributes) { $product_id=''; se(!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() ) : $o_query->a_postagem(); $postid = $o_query->post->ID; // mostrar todos os resultados - PERSONALIZE AO SEU GOSTO $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]
Apresentar a data do evento antes do título na página do produto #
Alterar a colocação da data utilizando um gancho.
. [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' ); se ( $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' );
Se pretender disponibilizar a data do evento como um shortcode, pode adicionar a seguinte linha abaixo da função:
add_shortcode( 'fooevents_date_on_single', 'fooevents_display_date_on_single');
Em seguida, pode utilizar o código curto [fooevents_date_on_single]
para apresentar a data do evento na página.
Substituir o ícone do lugar no mapa de lugares por uma imagem diferente #
Modifique o seguinte fragmento de código CSS, adicionando o URL a uma imagem diferente que pretenda substituir a imagem predefinida do lugar para todos os lugares. Adicione o trecho de código modificado ao ficheiro CSS personalizado do seu tema.
#fooevents_seating_dialog .fooevents_seating_chart_view_row span { background-image: url(../images/seat.svg); }
Remover o ícone do lugar no mapa de lugares para que os lugares sejam apresentados como caixas #
#fooevents_seating_dialog .fooevents_seating_chart_view_row span { background-image: none; }
Alterar a direção dos números dos lugares no mapa de lugares #
#fooevents_seating_dialog .fooevents_seating_chart_view_row { display: flex; flex-direction: row-reverse; justify-content: flex-end; }
Mostrar os lugares ímpares à direita e os lugares pares à esquerda #
#fooevents_seating_dialog .fooevents_seating_chart_view_row > span:nth-of-type(even) { float: left; }
Mostrar lugares no meio do mapa de lugares #
[css] #fooevents_seating_dialog .fooevents_seating_chart_view_row_name, #fooevents_seating_dialog .fooevents_seating_chart_view_row { text-align: center; } [/css]
Permitir que o mapa de lugares se desloque horizontalmente em vez de apresentar os lugares na fila seguinte #
Isto pode ser útil se tiver muitos lugares por fila e quiser que sejam apresentados um ao lado do outro em vez de na fila seguinte, se não couberem numa linha.
#fooevents_seating_dialog .fooevents_seating_chart_view_row { overflow-x: scroll; white-space: nowrap; }
Mostrar uma grelha de calendário em computadores de secretária e uma lista de semanas de calendário em dispositivos móveis #
Adicione dois códigos de acesso ao calendário na página ou publicação onde pretende apresentar o calendário. O primeiro código curto apresentará uma grelha de calendário e deverá ter o seguinte aspeto:
[fooevents_calendar id="desktop"]
O segundo shortcode apresentará uma lista de semanas do calendário e deverá ter o seguinte aspeto
[fooevents_calendar id="mobile" defaultView="listWeek"]
Adicione o seguinte trecho de código CSS ao ficheiro CSS personalizado do seu tema. Certifique-se de que o valor do seletor de ID CSS é o mesmo que o valor do atributo "id" que especificou no código curto. Pode ajustar a propriedade "max-width" ao tamanho do ecrã em que pretende que a lista de semanas do calendário seja apresentada e que a grelha do calendário fique oculta.
#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; } }
Dynamic Calendar #
Adicione o seguinte trecho de código ao functions.php file to display the Calendar with only the current event product when used on Product Descriptions/pages.
function dynamic_fooevents_calendar_shortcode() { if (is_product()) { global $product; if ($product) { $product_id = $product->get_id(); return do_shortcode('[fooevents_calendar post="' . $product_id . '"]'); } } return ''; // fallback if not on product page } add_shortcode('dynamic_fooevents_calendar', 'dynamic_fooevents_calendar_shortcode');
After adding the code snippet, you can use the shortcode like this:
[dynamic_fooevents_calendar]
Alterar a posição do ícone Copiar detalhes do comprador #
O seguinte excerto alinhará o botão de cópia à direita da etiqueta do primeiro nome:
.fooevents-copy-from-purchaser { float: right; margin-bottom:-1.7em }
Se não estiver a utilizar etiquetas, mas sim marcadores de posição de entrada, utilize o seguinte fragmento de código:
.fooevents-copy-from-purchaser { float: right; margin-top:-2em }
Mostrar o separador "Detalhes do evento" primeiro na página do evento #
Adicione o seguinte trecho de código ao functions.php ficheiro.
add_filter( 'woocommerce_product_tabs', 'reorder_tabs', 98 ); função reorder_tabs( $tabs ) { $tabs['woocommerce_events']['priority'] = 1; return $tabs; }
Direcionar todos os botões "Adicionar ao carrinho" para páginas de produtos #
Se um produto for um produto simples, por defeito, o botão "Adicionar ao carrinho" adicionará automaticamente um produto ao carrinho do cliente. Quando utiliza a extensão FooEvents Bookings, pode exigir que os seus clientes vão primeiro à página do produto para selecionar a data e a faixa horária da reserva. O seguinte snippet garante que quando o botão "Adicionar ao carrinho" é clicado para produtos simples, o utilizador é direcionado para a página do produto.
add_filter( 'woocommerce_loop_add_to_cart_link', 'fooevents_modify_add_to_cart_button_url', 10, 2 ); função fooevents_modify_add_to_cart_button_url( $button, $product ) { se (is_product_category() || is_shop()) { $button_text = $product->add_to_cart_text(); $button_link = $product->get_permalink(); $button = '<a class="button" href="/pt/' . $button_link . '/">' . $button_text . '</a>'; devolver $button; } }
Mostrar LIVRE se o preço do evento for definido como zero (0) #
Adicione o seguinte trecho de código ao functions.php se pretender alterar eventos e produtos com um preço de "0" para "GRÁTIS". Também pode substituir a palavra "GRÁTIS" por outra palavra ou frase ou deixá-la em branco se não quiser que nada seja apresentado.
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; }
Apresentar produtos e variações (bilhetes) num formato de grelha de tabela #
Adicione o seguinte trecho de código ao functions.php para apresentar produtos e variações num formato de grelha de tabela na página do evento/produto, em vez da lista pendente predefinida. Cada opção de bilhete será listada numa nova linha e terá o seu próprio seletor de quantidade.
Atenção: Este trecho de código é incompatível com o FooEvents Assentos e o Apresentar opções de lugares sentados nas páginas de produtos opção. Deverá funcionar com eventos de lugares se apenas apresentar o mapa de lugares na página de checkout.
/** 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' );
Adicione suporte para horas de início e fim diárias aos seus temas de bilhetes #
A partir da versão 1.5.5 do FooEvents Vários dias pode selecionar diferentes horas de início e de fim para cada dia de um evento de vários dias. O suporte para esta funcionalidade também foi adicionado a todos os FooEvents Temas de bilhetes. Por favor seguir estas instruções para atualizar um tema de tíquete existente. Se você estiver usando um tema de tíquete personalizado e não puder substituir o tema de tíquete pela versão atualizada, adicione o seguinte trecho de código ao seu tema de tíquete para adicionar suporte às horas de início e término. [php]
<!-- MULTI-DAY DETAILS --> <strong><?php printf( __( '%1$s %2$d: ', 'woocommerce-events' ), $ticket['dayTerm'], $x ); ?></strong> <?php echo esc_attr( $date ); ?><br /> <br />
Substituir os links padrão do botão Adicionar ao carrinho do WooCommerce por links de produtos #
Os botões padrão WooCommerce Adicionar ao Carrinho exibidos nas páginas de listagem da loja adicionam automaticamente um produto ao carrinho e redireccionam para a página do carrinho. Ao utilizar as Reservas FooEvents, pode preferir encaminhar o utilizador através da página do produto, para que este possa primeiro fazer uma seleção de faixa horária e de hora de reserva antes de prosseguir para a página do carrinho. O snippet a seguir substituirá o link adicionar ao carrinho por um link para a página do produto. Desta forma, o utilizador poderá fazer a seleção de reserva adequada na página do produto antes de avançar para a página do carrinho ou de finalização da compra.
/** * @snippet Alterar o botão 'Adicionar ao carrinho' do WooCommerce para 'Ver produto' * @source https://www.wptechnic.com/?p=4615 * @author Muhammad Tamzid * @compatible WC 4.3.1 */ // Alterar o botão 'Adicionar ao carrinho' do WooCommerce para 'Ver produto' add_filter( 'woocommerce_loop_add_to_cart_link', 'wpt_custom_view_product_button', 10, 2 ); function wpt_custom_view_product_button( $button, $product ) { // Ignorar para produtos variáveis if ( $product->is_type( 'variable' ) ) { return $button; } // Texto do botão aqui $button_text = __( 'Reservar bilhete', 'woocommerce' ); return '<a class="button wpt-custom-view-product-button" href="/pt/' . $product->get_permalink() . '/">' . $button_text . '</a>'; }
Exibir a data do evento para eventos "Únicos" no Carrinho e na página de Checkout #
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']; se ( $value = $product->get_meta( 'WooCommerceEventsDate' ) { $product_name .= '' . $value . ''; } return $product_name; }