0% encontró este documento útil (0 votos)
11 vistas8 páginas

Fuctions - PHP Kalex

El documento es un código PHP que implementa funcionalidades personalizadas para un tema de WordPress, específicamente para WooCommerce. Incluye la generación de números únicos para pedidos, la visualización de estos números en el frontend y en correos de confirmación, así como la adición de un buscador de metadatos y botones para aumentar cantidades en el carrito. También se manejan acciones AJAX para actualizar cantidades y se implementan medidas de seguridad como nonces.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas8 páginas

Fuctions - PHP Kalex

El documento es un código PHP que implementa funcionalidades personalizadas para un tema de WordPress, específicamente para WooCommerce. Incluye la generación de números únicos para pedidos, la visualización de estos números en el frontend y en correos de confirmación, así como la adición de un buscador de metadatos y botones para aumentar cantidades en el carrito. También se manejan acciones AJAX para actualizar cantidades y se implementan medidas de seguridad como nonces.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 8

<?

php
// Exit if accessed directly
if (!defined('ABSPATH')) exit;

// BEGIN ENQUEUE PARENT ACTION


// AUTO GENERATED - Do not modify or remove comment markers above or below:

if (!function_exists('chld_thm_cfg_locale_css')) :
function chld_thm_cfg_locale_css($uri) {
if (empty($uri) && is_rtl() && file_exists(get_template_directory() .
'/rtl.css'))
$uri = get_template_directory_uri() . '/rtl.css';
return $uri;
}
endif;
add_filter('locale_stylesheet_uri', 'chld_thm_cfg_locale_css');

if (!function_exists('child_theme_configurator_css')) :
function child_theme_configurator_css() {
wp_enqueue_style('chld_thm_cfg_child',
trailingslashit(get_stylesheet_directory_uri()) . 'style.css', array('astra-theme-
css', 'woocommerce-layout', 'woocommerce-smallscreen', 'woocommerce-general'));
}
endif;
add_action('wp_enqueue_scripts', 'child_theme_configurator_css', 10);

// Función para generar números únicos


function generar_numeros_unicos($cantidad) {
$numeros = [];
while (count($numeros) < $cantidad) {
$numero = str_pad(mt_rand(1, 9999), 4, '0', STR_PAD_LEFT); // Genera
números de 4 dígitos
if (!in_array($numero, $numeros)) {
$numeros[] = $numero;
}
}
return $numeros;
}

// Shortcode para mostrar los números en el frontend


function mostrar_numeros_pedidos($atts) {
// Obtener la cantidad de productos en el carrito
if (function_exists('WC')) {
$cantidad = WC()->cart->get_cart_contents_count();
} else {
$cantidad = 0; // Si WooCommerce no está activo, no se generan números
}

// Si no hay productos en el carrito, no generar números


if ($cantidad == 0) {
return 'No hay productos en el carrito.';
}

// Generar los números únicos


$numeros = generar_numeros_unicos($cantidad);
return 'Números de pedido: ' . implode(', ', $numeros); // Muestra los números
separados por comas
}
add_shortcode('numeros_pedidos', 'mostrar_numeros_pedidos');
// Guardar los números generados en los metadatos del pedido
function guardar_numeros_pedido($order_id) {
// Registrar que la función se está ejecutando
error_log('Función guardar_numeros_pedido ejecutada para el pedido: ' .
$order_id);

try {
// Obtener el pedido
$order = wc_get_order($order_id);
if (!$order) {
throw new Exception('No se pudo obtener el pedido.');
}

// Obtener la cantidad de productos en el pedido


$cantidad = $order->get_item_count();
error_log('Cantidad de productos en el pedido ' . $order_id . ': ' .
$cantidad);

// Si no hay productos, no generar números


if ($cantidad == 0) {
error_log('No hay productos en el pedido ' . $order_id);
return;
}

// Generar los números únicos


$numeros = generar_numeros_unicos($cantidad);
error_log('Números generados para el pedido ' . $order_id . ': ' .
implode(', ', $numeros));

// Guardar los números en los metadatos del pedido


update_post_meta($order_id, '_numeros_pedido', $numeros);
error_log('Números guardados en los metadatos del pedido ' . $order_id);
} catch (Exception $e) {
// Registrar el error en los logs de WooCommerce
error_log('Error en guardar_numeros_pedido: ' . $e->getMessage());
}
}
add_action('woocommerce_new_order', 'guardar_numeros_pedido');

// Mostrar los números en la página de detalles del pedido


function mostrar_numeros_pedido_cliente($order) {
// Obtener los números del pedido
$numeros = get_post_meta($order->get_id(), '_numeros_pedido', true);

// Si hay números, mostrarlos en la página de detalles del pedido


if (!empty($numeros)) {
echo '<div class="numeros-pedido"><h2>Números de pedido</h2>';
echo '<p>' . implode(', ', $numeros) . '</p></div>';
}
}
add_action('woocommerce_order_details_after_customer_details',
'mostrar_numeros_pedido_cliente');

// Mostrar los números en el correo de confirmación


function mostrar_numeros_pedido_correo($order, $sent_to_admin = false, $plain_text
= false, $email = null) {
$numeros = get_post_meta($order->get_id(), '_numeros_pedido', true);
if (!empty($numeros)) {
if ($plain_text) {
echo "Números de pedido: " . implode(', ', $numeros) . "\n";
} else {
echo '<p><strong>Números de pedido:</strong> ' . implode(', ',
$numeros) . '</p>';
}
}
}
add_action('woocommerce_email_order_details', 'mostrar_numeros_pedido_correo', 10,
4);

// Mostrar los números en la notificación de WooCommerce


function agregar_numeros_pedido_notificacion($order, $sent_to_admin = false,
$plain_text = false, $email = null) {
// Obtener los números del pedido
$numeros = get_post_meta($order->get_id(), '_numeros_pedido', true);

// Si hay números, mostrarlos en la notificación


if (!empty($numeros)) {
if ($plain_text) {
echo "Números de pedido: " . implode(', ', $numeros) . "\n"; // Formato
de texto plano
} else {
echo '<p><strong>Números de pedido:</strong> ' . implode(', ',
$numeros) . '</p>'; // Formato HTML
}
}
}
add_action('woocommerce_email_customer_details',
'agregar_numeros_pedido_notificacion', 20, 4);

// Redirigir después de finalizar una compra en WooCommerce


add_action('template_redirect', 'redirigir_despues_de_compra');

function redirigir_despues_de_compra() {
// Verificar si estamos en la página de "Gracias" (Thank You)
if (is_wc_endpoint_url('order-received')) {
// Redirigir a la página de inicio después de 5 segundos
wp_redirect('https://ganaconkalex.com/gracias'); // Cambia la URL si es
necesario
exit;
}
}
function buscador_metadatos_woocommerce($atts) {
// Atributos del shortcode (opcional)
$atts = shortcode_atts(array(
'placeholder' => 'Buscar...', // Texto del placeholder del input
'button_text' => 'Buscar', // Texto del botón de búsqueda
), $atts, 'buscador_metadatos');

// Verificar si se ha enviado el formulario


$search_term = isset($_GET['search_term']) ?
sanitize_text_field($_GET['search_term']) : '';

// Iniciar el buffer de salida


ob_start();

// Mostrar el formulario de búsqueda


?>
<form action="" method="get">
<input type="text" name="search_term" placeholder="<?php echo
esc_attr($atts['placeholder']); ?>" value="<?php echo esc_attr($search_term); ?>">
<button type="submit"><?php echo esc_html($atts['button_text']);
?></button>
</form>
<?php

// Si hay un término de búsqueda, realizar la consulta


if (!empty($search_term)) {
global $wpdb;

// Realizar la consulta a la base de datos


$results = $wpdb->get_results($wpdb->prepare(
"SELECT p.ID, p.post_status, pm1.meta_value AS billing_first_name,
pm2.meta_value AS billing_wooccm10, pm3.meta_value AS billing_tickets
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key
= '_billing_first_name'
INNER JOIN {$wpdb->postmeta} pm2 ON p.ID = pm2.post_id AND pm2.meta_key
= '_billing_wooccm10'
INNER JOIN {$wpdb->postmeta} pm3 ON p.ID = pm3.post_id AND pm3.meta_key
= '_billing_tickets'
WHERE (pm1.meta_value LIKE %s OR pm2.meta_value LIKE %s OR
pm3.meta_value LIKE %s)
AND p.post_type = 'shop_order'", // Solo buscar en pedidos de
WooCommerce
'%' . $wpdb->esc_like($search_term) . '%',
'%' . $wpdb->esc_like($search_term) . '%',
'%' . $wpdb->esc_like($search_term) . '%'
));

// Mostrar los resultados


if (!empty($results)) {
echo '<ul>';
foreach ($results as $result) {
echo '<li>';
// Verificar el estado del pedido
if ($result->post_status === 'wc-completed') {
// Mostrar detalles del pedido si está completado
echo 'Nombre: ' . esc_html($result->billing_first_name) .
'<br>';
echo 'Cédula de Identidad: ' . esc_html($result-
>billing_wooccm10) . '<br>';
echo 'Tickets: ' . esc_html($result->billing_tickets) . '<br>';
echo 'Estado del pedido: Completado<br>';
} else {
// Mostrar mensaje específico si el pedido no está completado
echo 'SU PEDIDO ESTÁ SIENDO REVISADO POR SOPORTE<br>';
}
echo '</li>';
}
echo '</ul>';
} else {
echo '<p>No se encontraron resultados.</p>';
}
}

// Devolver el contenido generado


return ob_get_clean();
}
add_shortcode('buscador_metadatos', 'buscador_metadatos_woocommerce');

// Shortcode para mostrar el botón de copiar datos


add_shortcode( 'boton_copiar_datos', 'crear_boton_copiar_datos' );

function crear_boton_copiar_datos() {
// Datos que se copiarán
$datos = 'Mercantil (0105) 24741018 04125537766';

// HTML del botón


$html = '<div class="boton-copiar-datos">';
$html .= '<button type="button" class="boton-copiar" data-datos="' .
esc_attr( $datos ) . '">Copiar datos</button>';
$html .= '</div>';

return $html;
}

// Script para manejar la copia de datos


add_action( 'wp_footer', 'script_boton_copiar_datos' );

function script_boton_copiar_datos() {
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('.boton-copiar').on('click', function() {
var datos = $(this).data('datos'); // Obtiene los datos del
atributo data-datos

// Crea un elemento temporal para copiar los datos


var temp = $('<textarea>');
$('body').append(temp);
temp.val(datos).select();
document.execCommand('copy'); // Copia los datos al portapapeles
temp.remove(); // Elimina el elemento temporal

// Muestra un mensaje de confirmación


alert('Datos copiados: ' + datos);
});
});
</script>
<?php
}

// Shortcode para mostrar los botones en el checkout


add_shortcode( 'botones_aumentar_cantidad', 'crear_botones_aumentar_cantidad' );

function crear_botones_aumentar_cantidad() {
// Valores de los botones
$valores = array(5, 10, 25, 50, 100);

// HTML de los botones


$html = '<div class="botones-aumentar-cantidad">';
$html .= '<p>Selecciona una cantidad:</p>';
foreach ( $valores as $valor ) {
$html .= '<button type="button" class="boton-aumentar-cantidad" data-
valor="' . esc_attr( $valor ) . '">' . esc_html( $valor ) . '</button>';
}
$html .= '</div>';

return $html;
}

// Script para manejar el aumento de la cantidad


add_action( 'wp_footer', 'script_botones_aumentar_cantidad' );

function script_botones_aumentar_cantidad() {
if ( is_checkout() ) { // Solo en la página de checkout
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('.boton-aumentar-cantidad').on('click', function() {
var nuevaCantidad = $(this).data('valor'); // Obtiene el valor
del botón

// Envía una solicitud AJAX para actualizar la cantidad en el


carrito
$.ajax({
type: 'POST',
url: '<?php echo admin_url('admin-ajax.php'); ?>', // URL
de AJAX en WordPress
data: {
action: 'actualizar_cantidad_carrito', // Acción de
WordPress
cantidad: nuevaCantidad, // Nueva cantidad
product_id: 64, // ID del producto específico (ahora es
64)
security: '<?php echo wp_create_nonce('actualizar-
cantidad-carrito'); ?>' // Nonce para seguridad
},
success: function(response) {
if (response.success) {
// Recarga la página para reflejar los cambios
location.reload();
} else {
alert('Error al actualizar la cantidad.');
}
}
});
});
});
</script>
<?php
}
}

// Función para manejar la actualización de la cantidad mediante AJAX


add_action('wp_ajax_actualizar_cantidad_carrito',
'manejar_actualizacion_cantidad_carrito');
add_action('wp_ajax_nopriv_actualizar_cantidad_carrito',
'manejar_actualizacion_cantidad_carrito');

function manejar_actualizacion_cantidad_carrito() {
// Verifica el nonce para seguridad
if (!wp_verify_nonce($_POST['security'], 'actualizar-cantidad-carrito')) {
wp_send_json_error('Error de seguridad.');
}

// Obtiene la nueva cantidad y el ID del producto


$nuevaCantidad = intval($_POST['cantidad']);
$product_id = intval($_POST['product_id']);

// Verifica si el carrito no está vacío


if (WC()->cart->is_empty()) {
wp_send_json_error('El carrito está vacío.');
}

// Busca el producto en el carrito


$producto_encontrado = false;
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
if ($cart_item['product_id'] === $product_id || $cart_item['variation_id']
=== $product_id) {
// Actualiza la cantidad del producto específico
WC()->cart->set_quantity($cart_item_key, $nuevaCantidad);
$producto_encontrado = true;
break;
}
}

if (!$producto_encontrado) {
wp_send_json_error('Producto no encontrado en el carrito.');
}

// Envía una respuesta de éxito


wp_send_json_success('Cantidad actualizada correctamente.');
}

// 1. Agregar campo de búsqueda personalizado


add_action( 'restrict_manage_posts', 'add_ticket_number_search_to_admin' );
function add_ticket_number_search_to_admin() {
global $typenow;

if ( 'shop_order' === $typenow ) {


echo '<input type="text" name="_billing_tickets" placeholder="Buscar por N°
de Ticket" value="' . esc_attr( $_GET['_billing_tickets'] ?? '' ) . '">';
}
}

// 2. Modificar la consulta para buscar por el número de ticket


add_filter( 'pre_get_posts', 'search_orders_by_ticket_number' );
function search_orders_by_ticket_number( $query ) {
global $pagenow;

if (
'edit.php' === $pagenow
&& isset( $_GET['_billing_tickets'] )
&& ! empty( $_GET['_billing_tickets'] )
&& 'shop_order' === $query->query['post_type']
) {
$ticket_number = sanitize_text_field( $_GET['_billing_tickets'] );
$meta_query = array(
array(
'key' => '_billing_tickets', // Clave actualizada
'value' => $ticket_number,
'compare' => '='
)
);
$query->set( 'meta_query', $meta_query );
}

return $query;
}

// 3. Mostrar el número de ticket en la lista de pedidos (Opcional)


add_filter( 'manage_edit-shop_order_columns', 'add_ticket_number_column' );
function add_ticket_number_column( $columns ) {
$columns['billing_tickets'] = 'N° de Ticket'; // Nombre de la columna
return $columns;
}

// 4. Mostrar el valor del ticket en la columna


add_action( 'manage_shop_order_posts_custom_column',
'display_ticket_number_in_column', 10, 2 );
function display_ticket_number_in_column( $column, $post_id ) {
if ( 'billing_tickets' === $column ) {
$ticket_number = get_post_meta( $post_id, '_billing_tickets', true );
echo $ticket_number ? $ticket_number : '—';
}
}
// END ENQUEUE PARENT ACTION

También podría gustarte