Woocommerce-Buchung nach Verfügbarkeitsdatum abfragen

Lesezeit: 4 Minuten

ich benutze Woodhemes buchen für meine woocommerce Seite

Da ich eine benutzerdefinierte Suche nach Produkten aufbaue, muss ich auch nach der Verfügbarkeit suchen. Hier ist, wie ich die Verfügbarkeit von BO verwalten sollte Buchungs-Plugin BO und wie das Plugin in der Datenbank speichert

a:8:{i:0;a:4:{s:4:"type";s:4:"days";s:8:"bookable";s:3:"yes";s:4:"from";s:1:"3";s:2:"to";s:1:"3";}i:1;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-09";s:2:"to";s:10:"2015-07-09";}i:2;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-08";s:2:"to";s:10:"2015-07-08";}i:3;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-10";s:2:"to";s:10:"2015-07-10";}i:4;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-15";s:2:"to";s:10:"2015-07-15";}i:5;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-16";s:2:"to";s:10:"2015-07-16";}i:6;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-17";s:2:"to";s:10:"2015-07-17";}i:7;a:4:{s:4:"type";s:6:"months";s:8:"bookable";s:2:"no";s:4:"from";s:1:"8";s:2:"to";s:1:"8";}}

Ich kann diese Werte aus der integrierten WordPress-Funktion get_post_meta abrufen.

$avail = get_post_meta($product->id, '_wc_booking_availability');

und das Ergebnis ist:

Array
(
[0] => Array
    (
        [type] => days
        [bookable] => yes
        [from] => 3
        [to] => 3
    )

[1] => Array
    (
        [type] => custom
        [bookable] => yes
        [from] => 2015-07-09
        [to] => 2015-07-09
    )

[2] => Array
    (
        [type] => custom
        [bookable] => yes
        [from] => 2015-07-08
        [to] => 2015-07-08
    )

[3] => Array
    (
        [type] => custom
        [bookable] => yes
        [from] => 2015-07-10
        [to] => 2015-07-10
    )

[4] => Array
    (
        [type] => custom
        [bookable] => yes
        [from] => 2015-07-15
        [to] => 2015-07-15
    )

[5] => Array
    (
        [type] => custom
        [bookable] => yes
        [from] => 2015-07-16
        [to] => 2015-07-16
    )

[6] => Array
    (
        [type] => custom
        [bookable] => yes
        [from] => 2015-07-17
        [to] => 2015-07-17
    )

[7] => Array
    (
        [type] => months
        [bookable] => no
        [from] => 8
        [to] => 8
    )

)

Wie Sie sehen können, kann der Benutzer angeben, ob das Produkt in einem Tages- oder Monatsbereich buchbar ist oder nicht. Meine Frage ist also, wie ich eine SQL-Abfrage durchführen kann, um zu überprüfen, ob eine Datumsvariable für dieses Produkt verfügbar ist. Ich denke, meta_query wird dies tun den Job (wie unten), aber wie kann ich ein nicht verfügbares Datum angeben? wie denkst du?

if($_GET['when']){

        /* checkIsAValidDate() >> check date format */
        if ( checkIsAValidDate( $_GET['when'] ) ){
            $quand = $_GET['when'];
            $available = array(
                "post_type" => "product",
                "meta_query" => array(
                    "relation"  => "AND",
                    "key"       => '_wc_booking_availability',
                    "value"     => $when,
                    'compare'   => 'IN'
                )
            );

        }
    }

Benutzer-Avatar
morphatisch

Da der Metawert ein Array ist, es kann sein, dass es nicht verwendet werden kann WP_Meta_Query. Ich stimme zwar zu, dass die Verwendung WP_Meta_Query scheint der elegantere Weg zu sein, ich fand diese Funktion immer sehr verwirrend, und da Sie das Array der buchbaren Objekte erhalten können, scheint es, als wäre es einfach, eine Funktion zu schreiben wie:

/**
 * Returns an array of bookable products according to supplied criteria
 * 
 * @param  int    $pid      the $product->ID of the bookable object
 * @param  mixed  $when     a date in YYYY-MM-DD format or integer representing a day or month
 * @param  string $type     a value of 'day', 'month', or 'custom'
 * @param  string $bookable whether the bookable object is bookable or not ('yes' or 'no')
 * @return array            an array of bookable objects for the product
 */
function getBookables( $pid, $when, $type, $bookable="yes" ) {
    $result = array();

    // is $when in the YYYY-MM-DD format?
    if ( 'custom' == $type ) {
        // it's a custom date so convert $when to DateTime
        $when = DateTime::createFromFormat( 'Y-m-d', $when );
    }

    $availability = get_post_meta( $pid, '_wc_booking_availability' );
    foreach ( $availability as $a ) {
        if ( $a[ 'bookable' ] == $bookable ) {
            // is it in the YYYY-MM-DD format?
            if ( $when instanceof DateTime ) {
                // it's a custom date so use date compare
                $from = DateTime::createFromFormat( 'Y-m-d', $a[ 'from' ] );
                $to   = DateTime::createFromFormat( 'Y-m-d', $a[ 'to'   ] );
                if ( $when >= $from && $when <= $to ) {
                    $result[] = $a;
                }
            } else {
                // it is an integer value (day or month)
                if ( $type == $a[ 'type' ] && ( $when >= $from && $when <= $to ) ) {
                    $result[] = $a;
                }
            }
        }
    }
    return $result;
}

Beachten Sie, dass es wahrscheinlich notwendig ist, die zu bestehen type an der Suchfunktion kann ich da zwar unterscheiden YYYY-MM-DD Werte ab int Werte, es gibt keine einfache Möglichkeit, sie zu unterscheiden month aus day Werte. Als solches können Sie die obige Funktion verwenden:

if ( $_GET[ 'when' ] && $_GET[ 'type' ] ) {
    $when = $_GET[ 'when' ];
    $type = $_GET[ 'type' ];
    $bookables = getBookables( $product->ID, $when, $type );
}

Beachten Sie auch, dass, wenn Sie die Zeichenfolge übergeben 'no' Als vierten Parameter der Funktion können Sie die Liste von erhalten nicht verfügbar mal.

Hoffe das hilft!

1385890cookie-checkWoocommerce-Buchung nach Verfügbarkeitsdatum abfragen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy