Files
Josep Piguillem 9a6bcd56e5 Tema: nuevos botones, campos, casillas, tarjetas, selector, interruptor, cabecera y pie
- Botones: borde que se dibuja al pasar el ratón o con el teclado (color según variante) y sombra.
- Campos: subrayados con etiqueta flotante y degradado principal → acento al enfocar; flecha
  propia en los desplegables. Formularios de contacto, cuestionario y finales felices adaptados.
- Casillas: marca «a mano» que se dibuja al marcarlas (ga_checkmark()), accesibles con teclado.
- Tarjetas de animales y finales felices: marco de 2 px con resplandor de acento en la esquina.
- Selector segmentado (.ga-segmented) con píldora deslizante; se usa en las pestañas Perros / Gatos
  y sirve también para grupos de radios.
- Interruptor (.ga-toggle, ga_toggle_ui()) listo para usar.
- Cabecera translúcida con borde al hacer scroll, enlaces en píldora, desplegable animado con
  descripción de cada elemento y fondo oscurecido mientras está abierto.
- Pie: nombre gigante en bajorrelieve que se descubre al final de la página (opción en el
  personalizador, «Bilagun» por defecto).
- Versión del tema 2.3.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:11:17 +02:00

206 lines
10 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Formularios (contacto general y «Quiero conocerlo/la»), ayuda material y cita previa.
*/
defined( 'ABSPATH' ) || exit;
/** Motivos del formulario general. */
function ga_contact_reasons() {
return array(
'adopcion' => ga__( 'Adopción', 'Adopzioa' ),
'visita' => ga__( 'Pedir cita para una visita', 'Bisita baterako hitzordua eskatu' ),
'acogida' => ga__( 'Casa de acogida', 'Harrera-etxea' ),
'voluntario' => ga__( 'Voluntariado', 'Boluntariotza' ),
'material' => ga__( 'Ayuda material', 'Laguntza materiala' ),
'apadrinar' => ga__( 'Apadrinamiento', 'Apadrinatzea' ),
'otro' => ga__( 'Otro', 'Beste bat' ),
);
}
/** Casilla dibujada: se coloca justo después del <input type="checkbox"> (la animación está en el CSS del tema). */
function ga_checkmark() {
return '<svg class="ga-check" viewBox="0 0 95 95" aria-hidden="true" focusable="false"><rect x="30" y="20" width="50" height="50" rx="9"/>'
. '<path transform="translate(0,-952.36222)" d="m 56,963 c -102,122 6,9 7,9 17,-5 -66,69 -38,52 122,-77 -7,14 18,4 29,-11 45,-43 23,-4"/></svg>';
}
/**
* Interruptor: se coloca justo después del checkbox, dentro de su etiqueta:
* <label class="ga-toggle"><input type="checkbox" role="switch" name="…"><?php echo ga_toggle_ui(); ?><span>Texto</span></label>
*/
function ga_toggle_ui() {
return '<span class="ga-toggle__switch" aria-hidden="true"><span class="ga-toggle__track"><i></i><i></i><i></i><i></i><i></i></span>'
. '<span class="ga-toggle__thumb"><span class="ga-toggle__icon"></span></span></span>';
}
/** Texto de confirmación tras enviar. */
function ga_confirmation_text( $is_animal ) {
return $is_animal
? ga_setting( 'adopcion', 'confirm', ga__( 'Hemos recibido tu solicitud. Nos pondremos en contacto contigo para enviarte nuestro cuestionario y conoceros un poquito mejor.', 'Zure eskaera jaso dugu. Zurekin harremanetan jarriko gara gure galdetegia bidaltzeko eta elkar hobeto ezagutzeko.' ) )
: ga_setting( 'adopcion', 'confirm_contact', ga__( '¡Gracias! Hemos recibido tu mensaje y te responderemos lo antes posible.', 'Eskerrik asko! Zure mezua jaso dugu eta ahalik eta lasterren erantzungo dizugu.' ) );
}
/**
* [ga_contacto] formulario general.
* [ga_contacto animal="123"] formulario breve «Quiero conocerlo/la» (el animal va incluido).
*/
add_shortcode( 'ga_contacto', function ( $atts ) {
$atts = shortcode_atts( array( 'animal' => 0 ), $atts, 'ga_contacto' );
$animal_id = absint( $atts['animal'] ) ?: absint( $_GET['adoptar'] ?? 0 );
$animal_id = $animal_id && 'animal' === get_post_type( $animal_id ) ? $animal_id : 0;
$is_animal = absint( $atts['animal'] ) > 0; // Formulario breve dentro de la ficha.
$status = sanitize_key( $_GET['enviado'] ?? '' );
$preselect = $animal_id ? 'adopcion' : sanitize_key( $_GET['motivo'] ?? '' );
$privacy = ga_page_url( 'politica-de-privacidad' );
$anchor = $is_animal ? 'conocer' : 'formulario';
ob_start();
if ( 'ok' === $status ) {
echo '<div class="ga-notice ga-notice--ok" role="status">' . esc_html( ga_confirmation_text( (bool) $animal_id ) ) . '</div>';
if ( $is_animal ) {
return ob_get_clean();
}
} elseif ( 'error' === $status ) {
echo '<div class="ga-notice ga-notice--error" role="alert">'
. esc_html( ga__( 'No hemos podido enviar el mensaje. Revisa los campos obligatorios o escríbenos a ', 'Ezin izan dugu mezua bidali. Egiaztatu derrigorrezko eremuak edo idatzi iezaguzu helbide honetara: ' ) . ga_info( 'email' ) ) . '</div>';
}
?>
<form class="ga-form" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
<input type="hidden" name="action" value="ga_contacto">
<input type="hidden" name="idioma" value="<?php echo esc_attr( ga_lang() ); ?>">
<input type="hidden" name="redirect" value="<?php echo esc_url( get_permalink() . '#' . $anchor ); ?>">
<?php if ( $animal_id ) : ?>
<input type="hidden" name="animal_id" value="<?php echo (int) $animal_id; ?>">
<?php endif; ?>
<?php wp_nonce_field( 'ga_contacto', 'ga_nonce' ); ?>
<div class="ga-hp" aria-hidden="true"><label>No rellenar <input type="text" name="web" tabindex="-1" autocomplete="off"></label></div>
<div class="ga-form__row">
<label class="ga-field"><input type="text" name="nombre" required autocomplete="name" placeholder=" "><span><?php ga_e( 'Nombre', 'Izena' ); ?> *</span></label>
<label class="ga-field"><input type="email" name="email" required autocomplete="email" placeholder=" "><span><?php ga_e( 'Correo electrónico', 'Posta elektronikoa' ); ?> *</span></label>
</div>
<div class="ga-form__row">
<label class="ga-field"><input type="tel" name="telefono" autocomplete="tel" placeholder=" "<?php echo $is_animal ? ' required' : ''; ?>><span><?php ga_e( 'Teléfono', 'Telefonoa' ); ?><?php echo $is_animal ? ' *' : ''; ?></span></label>
<?php if ( ! $is_animal ) : ?>
<label class="ga-field ga-field--select">
<select name="motivo">
<?php foreach ( ga_contact_reasons() as $value => $label ) : ?>
<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $preselect, $value ); ?>><?php echo esc_html( $label ); ?></option>
<?php endforeach; ?>
</select>
<span><?php ga_e( 'Motivo', 'Arrazoia' ); ?></span>
</label>
<?php endif; ?>
</div>
<?php if ( ! $is_animal ) : ?>
<label class="ga-field ga-form__visit"<?php echo 'visita' === $preselect ? '' : ' hidden'; ?>>
<input type="text" name="preferencia" placeholder="<?php echo esc_attr( ga__( 'Por ejemplo: martes o jueves por la tarde', 'Adibidez: asteartea edo osteguna arratsaldez' ) ); ?>">
<span><?php ga_e( '¿Qué día y hora te vendría bien?', 'Zein egun eta ordu komeni zaizu?' ); ?></span>
</label>
<?php endif; ?>
<?php if ( $animal_id && ! $is_animal ) : ?>
<p class="ga-form__animal"><?php echo esc_html( ga__( 'Animal: ', 'Animalia: ' ) . get_the_title( $animal_id ) ); ?></p>
<?php endif; ?>
<label class="ga-field">
<textarea name="mensaje" rows="<?php echo $is_animal ? 4 : 6; ?>" placeholder=" "<?php echo $is_animal ? '' : ' required'; ?>></textarea>
<span><?php ga_e( 'Mensaje', 'Mezua' ); ?><?php echo $is_animal ? ' (' . esc_html( ga__( 'opcional', 'aukerakoa' ) ) . ')' : ' *'; ?></span>
</label>
<label class="ga-form__check">
<input type="checkbox" name="privacidad" value="1" required><?php echo ga_checkmark(); // SVG estático. ?>
<span>
<?php if ( 'eu' === ga_lang() ) : ?>
<a href="<?php echo esc_url( $privacy ); ?>" target="_blank">Pribatutasun-politika</a> irakurri eta onartzen dut. *
<?php else : ?>
He leído y acepto la <a href="<?php echo esc_url( $privacy ); ?>" target="_blank">política de privacidad</a>. *
<?php endif; ?>
</span>
</label>
<button type="submit" class="ga-btn"><?php echo esc_html( $is_animal ? ga__( 'Enviar solicitud', 'Eskaera bidali' ) : ga__( 'Enviar mensaje', 'Mezua bidali' ) ); ?></button>
</form>
<?php
return ob_get_clean();
} );
add_action( 'admin_post_nopriv_ga_contacto', 'ga_handle_contact' );
add_action( 'admin_post_ga_contacto', 'ga_handle_contact' );
function ga_handle_contact() {
$redirect = wp_validate_redirect( esc_url_raw( wp_unslash( $_POST['redirect'] ?? '' ) ), home_url( '/' ) );
$go = function ( $status ) use ( $redirect ) {
$parts = explode( '#', $redirect, 2 );
wp_safe_redirect( add_query_arg( 'enviado', $status, $parts[0] ) . ( isset( $parts[1] ) ? '#' . $parts[1] : '' ) );
exit;
};
if ( ! isset( $_POST['ga_nonce'] ) || ! wp_verify_nonce( $_POST['ga_nonce'], 'ga_contacto' ) ) {
$go( 'error' );
}
if ( ! empty( $_POST['web'] ) ) { // Honeypot: los bots rellenan el campo oculto.
$go( 'ok' );
}
$animal_id = absint( $_POST['animal_id'] ?? 0 );
$animal = $animal_id && 'animal' === get_post_type( $animal_id ) ? get_the_title( $animal_id ) : '';
$reasons = ga_contact_reasons();
$reason = $animal ? 'adopcion' : sanitize_key( $_POST['motivo'] ?? '' );
$data = array(
'nombre' => sanitize_text_field( wp_unslash( $_POST['nombre'] ?? '' ) ),
'email' => sanitize_email( wp_unslash( $_POST['email'] ?? '' ) ),
'telefono' => sanitize_text_field( wp_unslash( $_POST['telefono'] ?? '' ) ),
'motivo' => $reasons[ $reason ] ?? $reasons['otro'],
'mensaje' => sanitize_textarea_field( wp_unslash( $_POST['mensaje'] ?? '' ) ),
'visita' => 'visita' === $reason ? sanitize_text_field( wp_unslash( $_POST['preferencia'] ?? '' ) ) : '',
'idioma' => 'eu' === ( $_POST['idioma'] ?? '' ) ? 'Euskera' : 'Castellano',
);
$message_required = ! $animal;
if ( ! $data['nombre'] || ! is_email( $data['email'] ) || ( $message_required && ! $data['mensaje'] ) || empty( $_POST['privacidad'] ) ) {
$go( 'error' );
}
$subject = $animal
? sprintf( '[Web] Quiero conocer a %s – %s', $animal, $data['nombre'] )
: sprintf( '[Web] %s – %s', $data['motivo'], $data['nombre'] );
$body = sprintf(
"Nombre: %s\nEmail: %s\nTeléfono: %s\nMotivo: %s%s\nAnimal: %s\nIdioma: %s\n\n%s",
$data['nombre'], $data['email'], $data['telefono'] ?: '-', $data['motivo'],
$data['visita'] ? "\nPreferencia de cita: " . $data['visita'] : '',
$animal ? $animal . ' — ' . get_permalink( $animal_id ) : '-',
$data['idioma'], $data['mensaje'] ?: '(sin mensaje)'
);
// Se guarda siempre en el panel, aunque falle el correo.
wp_insert_post( array(
'post_type' => 'ga_mensaje',
'post_status' => 'private',
'post_title' => $subject,
'post_content' => $body,
) );
wp_mail( ga_contact_email(), $subject, $body, array( 'Reply-To: ' . $data['nombre'] . ' <' . $data['email'] . '>' ) );
$go( 'ok' );
}
/* [ga_necesidades] lista de ayuda material (se edita en Personalizar → Colabora) */
add_shortcode( 'ga_necesidades', function () {
$items = array_filter( array_map( 'trim', explode( "\n", (string) ga_setting( 'material', 'list', '' ) ) ) );
$note = ga_setting( 'material', 'note', '' );
ob_start();
if ( $items ) {
echo '<ul class="ga-needs-list">';
foreach ( $items as $item ) {
echo '<li>' . esc_html( $item ) . '</li>';
}
echo '</ul>';
}
if ( $note ) {
echo '<p class="ga-needs-note">' . esc_html( $note ) . '</p>';
}
return ob_get_clean();
} );
/* [ga_cita] aviso de cita previa */
add_shortcode( 'ga_cita', function () {
$text = ga_info( 'cita' );
return $text ? '<p class="ga-cita">' . esc_html( $text ) . '</p>' : '';
} );