/**
* 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:
- ’;
- ’ . get_the_title() . ’ (Dostępne pokoje dla ’ . $guests . ’ osób).
while ( $query->have_posts() ) {
$query->the_post();
$output .= ’
’;
}
$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;
}
Resent Comments