Wyniki wyszukiwania.

/**
* Rejestruje shortcode dla wyświetlania wyników wyszukiwania.
*/
public function register_search_results_shortcode() {
add_shortcode( 'mn_search_results’, array( $this, 'render_search_results’ ) );
}

/**
* Wyświetla dostępne obiekty na podstawie dat i liczby gości.
*/
public function render_search_results( $atts ) {
global $wpdb;
$output = ”;

// 1. Pobieranie danych z formularza GET
$check_in = isset( $_GET[’check_in_date’] ) ? sanitize_text_field( $_GET[’check_in_date’] ) : false;
$check_out = isset( $_GET[’check_out_date’] ) ? sanitize_text_field( $_GET[’check_out_date’] ) : false;
$guests = isset( $_GET[’guests’] ) ? (int) $_GET[’guests’] : 1;

if ( ! $check_in || ! $check_out ) {
return ’

Wybierz daty przyjazdu i wyjazdu, aby wyszukać dostępne obiekty.

’;
}

$table_availability = $wpdb->prefix . 'mn_availability’;
$table_config = $wpdb->prefix . 'mn_rooms_config’;

// 2. Zapytanie SQL do znajdowania dostępnych obiektów
// Logika:
// a) Znajdź wszystkie konfiguracje pokoi, które mogą pomieścić podaną liczbę gości (max_guests >= $guests)
// b) Sprawdź w tabeli mn_availability, czy dla KAŻDEJ DATY w zakresie (BETWEEN $check_in AND $check_out)
// liczba wolnych jednostek (total_units – booked_units) jest większa niż 0.

// Zapytanie jest bardzo złożone i wymaga użycia subquery lub JOINów.
// Poniżej zapytanie, które znajduje ID obiektów, które mają wolne pokoje na CAŁY okres:

$sql = $wpdb->prepare(„
SELECT DISTINCT c.object_id
FROM $table_config c
WHERE c.max_guests >= %d
AND c.total_units > 0
AND NOT EXISTS (
SELECT 1 FROM $table_availability a
WHERE a.room_config_id = c.id
AND a.date BETWEEN %s AND %s
AND a.booked_units >= c.total_units
)
ORDER BY c.object_id
„, $guests, $check_in, $check_out);

$available_object_ids = $wpdb->get_col( $sql );

// 3. Wyświetlanie wyników (standardowa pętla WordPressa)
if ( ! empty( $available_object_ids ) ) {
$args = array(
'post_type’ => 'nocleg’,
'post__in’ => $available_object_ids, // Użyjemy ID z SQL
'posts_per_page’ => -1,
);
$query = new WP_Query( $args );

if ( $query->have_posts() ) {
$output .= ’

Znaleziono dostępne obiekty:

    ’;
    while ( $query->have_posts() ) {
    $query->the_post();
    $output .= ’

  • ’ . get_the_title() . ’ (Dostępne pokoje dla ’ . $guests . ’ osób).
  • ’;
    }
    $output .= ’

’;
wp_reset_postdata();
} else {
$output .= ’

Przepraszamy, nie znaleziono obiektów spełniających kryteria.

’;
}

} else {
$output .= ’

Przepraszamy, nie znaleziono wolnych miejsc w wybranym terminie.

’;
}

return $output;
}