Indicaciones del cliente: adopción solo Perros/Gatos, fichas nuevas y todo configurable

- Adopción sin filtros ni etiquetas: acceso a Perros y Gatos, tarjetas de foto y nombre.
- Ficha nueva: galería, vídeo, fecha de nacimiento o edad aproximada, carácter,
  necesidades, convivencia y hogar que buscamos (textos por idioma, datos compartidos).
- Estados disponible / en proceso / adoptado y animales destacados.
- Botón «Quiero conocerlo/la» con formulario breve (animal incluido) y confirmación.
- Botones para compartir cada ficha (WhatsApp, Facebook, copiar enlace).
- Portada corta según la propuesta del cliente; donaciones, cifras, etc. ocultas.
- Páginas Acoge y Preguntas frecuentes, menú con submenús, sin hotel.
- Aviso de cita previa y lista de ayuda material editables desde el panel.
- Plugin núcleo dividido en módulos (i18n, animales, formularios, APIs).
- Migración 5 idempotente: respeta las páginas editadas por el cliente.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 22:16:24 +02:00
parent 532bc620de
commit 4acc8b62d1
41 changed files with 1985 additions and 1533 deletions

View File

@@ -9,7 +9,7 @@
defined( 'ABSPATH' ) || exit;
define( 'GA_THEME_VERSION', '2.1.0' );
define( 'GA_THEME_VERSION', '2.2.0' );
require_once __DIR__ . '/inc/customizer.php';
require_once __DIR__ . '/inc/dynamic-css.php';
@@ -171,22 +171,65 @@ function ga_brand( $context = 'header' ) {
}
/* ---------- Ayudantes de animales ---------- */
/** Distintivo de estado: solo se muestra «En proceso» o «Adoptado» (los disponibles no llevan etiqueta). */
function ga_status_badge( $post_id = null ) {
$post_id = $post_id ?: get_the_ID();
$estado = ga_get( $post_id, 'estado' ) ?: 'disponible';
$label = ga_label( $post_id, 'estado' ) ?: ga__( 'En adopción', 'Adopzioan' );
printf( '<span class="ga-status ga-status--%s">%s</span>', esc_attr( $estado ), esc_html( $label ) );
$estado = ga_status( $post_id );
if ( 'disponible' === $estado ) {
return;
}
printf( '<span class="ga-status ga-status--%s">%s</span>', esc_attr( $estado ), esc_html( ga_label( $post_id, 'estado' ) ) );
}
/** Foto principal o, si no hay, la silueta del logo. */
function ga_animal_photo( $size = 'ga-card', $post_id = null ) {
$post_id = $post_id ?: get_the_ID();
if ( has_post_thumbnail( $post_id ) ) {
echo get_the_post_thumbnail( $post_id, $size, array( 'loading' => 'lazy' ) );
} else {
echo '<div class="ga-card__placeholder">' . ga_icon( 'paw' ) . '</div>';
echo '<div class="ga-card__placeholder">' . ga_placeholder_svg() . '</div>';
}
}
/** Silueta del logo para huecos sin foto. */
function ga_placeholder_svg() {
return ga_logo_svg( 'mark' ) ?: ga_icon( 'paw' );
}
/** Texto del botón «Quiero conocerlo / conocerla» según el sexo. */
function ga_meet_label( $post_id = null ) {
$post_id = $post_id ?: get_the_ID();
return 'hembra' === ga_get( $post_id, 'sexo' ) ? ga_opt( 'adopcion', 'btn_f' ) : ga_opt( 'adopcion', 'btn_m' );
}
/** Enlaces para compartir una ficha. */
function ga_share_links( $post_id = null ) {
$post_id = $post_id ?: get_the_ID();
$url = get_permalink( $post_id );
$text = get_the_title( $post_id ) . ' — ' . ga__( 'busca familia en Bilagun', 'familia bila Bilagunen' );
printf(
'<div class="ga-share"><span>%s</span><a class="ga-share__btn" href="%s" target="_blank" rel="noopener">WhatsApp</a><a class="ga-share__btn" href="%s" target="_blank" rel="noopener">Facebook</a><button type="button" class="ga-share__btn" data-copy="%s" data-done="%s">%s</button></div>',
esc_html( ga__( 'Comparte su historia:', 'Partekatu haren istorioa:' ) ),
esc_url( 'https://wa.me/?text=' . rawurlencode( $text . ' ' . $url ) ),
esc_url( 'https://www.facebook.com/sharer/sharer.php?u=' . rawurlencode( $url ) ),
esc_attr( $url ),
esc_attr( ga__( '¡Copiado!', 'Kopiatuta!' ) ),
esc_html( ga__( 'Copiar enlace', 'Kopiatu esteka' ) )
);
}
/** Vídeo de la ficha: oEmbed (YouTube, Vimeo…) o archivo de vídeo. */
function ga_video_html( $url ) {
if ( ! $url ) {
return '';
}
if ( preg_match( '/\.(mp4|webm|mov)(\?.*)?$/i', $url ) ) {
return '<video controls preload="metadata" playsinline src="' . esc_url( $url ) . '"></video>';
}
$embed = wp_oembed_get( $url, array( 'width' => 900 ) );
return $embed ?: '<a href="' . esc_url( $url ) . '" target="_blank" rel="noopener">' . esc_html( ga__( 'Ver vídeo', 'Ikusi bideoa' ) ) . '</a>';
}
function ga_species( $post_id = null ) {
$terms = get_the_terms( $post_id ?: get_the_ID(), 'especie' );
return $terms && ! is_wp_error( $terms ) ? $terms[0]->name : '';
@@ -199,15 +242,6 @@ function ga_plural( $name ) {
return preg_match( '/s$/i', $name ) ? $name : $name . 's';
}
/** «Bien con niños» / «Haurrekin ondo» a partir de la etiqueta «Niños» / «Haurrak». */
function ga_compat_label( $label ) {
$label = mb_strtolower( $label );
if ( 'eu' === ga_lang() ) {
return mb_strtoupper( mb_substr( $label, 0, 1 ) ) . mb_substr( preg_replace( '/ak$/u', 'ekin', $label ), 1 ) . ' ondo';
}
return 'Bien con ' . $label;
}
/** URL de la página de contacto con el animal preseleccionado. */
function ga_adopt_url( $post_id = null ) {
return add_query_arg( 'adoptar', $post_id ?: get_the_ID(), ga_page_url( 'contacto' ) ) . '#formulario';