WooCommerce를 위한 임대 예약 및 멀티 벤더 통합

WooCommerce용 임대 예약 플러그인 선택



WooCommerce에 사용할 수 있는 많은 임대 예약 플러그인이 있습니다. Magento 2용developer of rental bookings systems으로서 우리는 그 경험을 사용하고 WooCommerce에 적용할 수 있는 이점이 있었습니다. 기술 스택에 관한 한 둘 사이에는 큰 차이가 있지만 기본 사항은 동일합니다. 우리가 확실히 구현하고 싶었던 기능 중 일부는 다음과 같습니다.
  • 제품 속성을 추가하는 것뿐만 아니라 지정된 시작 날짜 및 종료 날짜에 대해 인벤토리를 쿼리할 수 있는 실제 임대 재고 추적
  • 커뮤니티에서 잘 지원되는 유연한 달력으로 날짜 범위와 시간을 지원하는 것이 이상적입니다. 우리는 Flatpickr로 결정했습니다.
  • 일별 및 시간별 대여 인벤토리 보고서 페이지

  • WooCommerce용 멀티 벤더 플러그인 선택



    다중 공급업체 부분의 경우 WooCommerce용 다양한 플러그인을 테스트했습니다. 우리가 발견한 것은 그들 중 대부분이 제품 번들을 지원하지 않으며 각각 고유한 통합 스타일을 가지고 있다는 것입니다. Dokan은 WooCommerce 경매 플러그인과의 통합, Stripe 지불금과 같이 클라이언트가 찾고 있던 대부분의 기능을 가지고 있었고 UI가 사용하기 좋았기 때문에 Dokan에 정착했습니다.

    임대 관리 페이지를 Dokan과 통합



    따라서 더 어려운 부분은 Dokan 대시보드를 렌탈 플러그인 관리 보고서와 통합하는 방법입니다. 뿐만 아니라 제품이 업데이트될 때 고급 사용자 정의 필드 처리를 통합하고 싶었습니다. 우리가 한 방법은 다음과 같습니다. 먼저 다음 세 가지 필터를 추가해야 했습니다.

    add_filter( 'dokan_get_dashboard_nav', [$this, 'add_booking_menu'] );
    add_filter( 'dokan_query_var_filter', array( $this, 'add_dokan_booking_endpoint' ) );
    add_action( 'dokan_load_custom_template', array( $this, 'load_booking_templates' ), 10, 1 );
    


    (이것들은 클래스의 init() 메서드에 추가됩니다. 클래스 구조는 아래를 참조하세요.)

    각각에 대한 방법은 다음과 같습니다.

     public function add_booking_menu($urls){
            $urls['bookinginventory1'] = [
                    'title' => __('Booking Inventory', 'sibooking'),
                    'icon' => '<i class="fa fa-truck"></i>',
                    'url' => dokan_get_navigation_url( 'sibooking/inventory'),
                    'pos' => 51,
                    'permission' => 'dokan_view_order_menu'
                ];
            $urls['bookingcalendar'] = [
                'title' => __('Booking Calendar', 'sibooking'),
                'icon' => '<i class="fa fa-calendar"></i>',
                'url' => dokan_get_navigation_url( 'sibooking/calendar'),
                'pos' => 51,
                'permission' => 'dokan_view_order_menu'
                ];
            return $urls;
        }
    
        public function add_dokan_booking_endpoint($query_var){
            $query_var[] = 'sibooking';
            return $query_var;
        }
    
        public function load_booking_templates( $args ) {
            if ( isset( $args['sibooking'] )) {
                include(SIBOOKING_PLUGIN_ROOT . 'Templates/dokan/dashboard/calendar.php');
            }
    
        }
    


    그런 다음 템플릿을 다음 폴더에 추가했습니다. Templates/dokan/dashboard 다음은 그 모양에 대한 샘플입니다.

    <?php do_action( 'dokan_dashboard_wrap_start' ); ?>
    
    <div class="dokan-dashboard-wrap">
    
        <?php
        $current_page = get_query_var( 'sibooking' );
        /**
         *  dokan_dashboard_content_before hook
         *  dokan_dashboard_support_content_before
         *
         *  @hooked get_dashboard_side_navigation
         *
         *  @since 2.4
         */
        do_action( 'dokan_dashboard_content_before' );
        do_action( 'dokan_dashboard_support_content_before' );
        ?>
    
        <div class="dokan-dashboard-content dokan-booking-wrapper dokan-product-edit">
    
    <?php
    switch ( $current_page ) {
        case 'calendar':
            echo do_shortcode('[vg_display_admin_page page_url="' . admin_url() . '?page=sibooking-calendar-report"]');
            break;
        case 'inventory':
            echo do_shortcode('[vg_display_admin_page page_url="' . admin_url() . '?page=sibooking-inventory-report"]');
    
            break;
    }
    ?>
        </div><!-- .dokan-dashboard-content -->
    
        <?php
    
        /**
         *  dokan_dashboard_content_after hook
         *  dokan_dashboard_support_content_after hook
         *
         *  @since 2.4
         */
        do_action( 'dokan_dashboard_content_after' );
        do_action( 'dokan_dashboard_support_content_after' );
        ?>
    
    </div><!-- .dokan-dashboard-wrap -->
    
    <?php do_action( 'dokan_dashboard_wrap_end' ); ?>
    


    이 코드에서 볼 수 있듯이 이를 위해 Admin에서 플러그인 WP Frontend를 사용하고 있습니다. 결과는 다음과 같습니다.



    멀티 벤더 렌탈 시스템의 특정 부분에 대한 몇 가지 코드 샘플



    지금까지 Rental Bookings to Dokan 다중 벤더 통합에 대해 조금 살펴보았습니다. 하지만 렌탈 캘린더 시스템 자체는 어떻게 작동합니까? 다음은 몇 가지 코드 샘플입니다.


    대여 일정 로드 중

    보시다시피 장바구니에 추가 버튼이 표시된 후 사용자 지정 템플릿을 표시하는 작업 플러그인입니다. 이 템플릿에는 Flatpickr div를 로드하기 위한 코드가 있습니다.

    add_action( 'woocommerce_before_add_to_cart_button', [$this, 'load_calendar'] );
    
        public function load_calendar() {
            if ( is_product() ) {
                if(sibooking_is_booking(wc_get_product()) == '1'){
                    $template = '/single-product/add-to-cart/calendar.php';
                    wc_get_template($template, $args = [], $template_path = '', dirname(__FILE__, 2) . '/Templates/');
                }
            }
        }
    
    


    렌탈 캘린더가 앞면에 표시되는 방식은 물론 여기에서 설명하지 않을 Flatpickr js 및 css 파일도 추가하고 사용자 지정 날짜 범위 가용성 확인을 작성했습니다.



    작곡가 로딩



    물론 WooCommerce 임대 플러그인에 Composer 자동 로딩을 사용하고 싶었습니다. 여기에 우리가 그것을 달성한 방법이 있습니다. 플러그인의 기본 진입점에는 다음이 있습니다.

    
    $libraries = require_once SIBOOKING_PLUGIN_ROOT . 'vendor/autoload.php';
    
    add_action(
            'plugins_loaded', static function () use ( $libraries ) {
                // for phpunit to not throw error
                if(is_bool($libraries)){
                    return;
                }
            new Sibookings($libraries);
        });
    
     public function __construct(\Composer\Autoload\ClassLoader $composer) {
            $this->composer = $composer;
            $this->version = SIBOOKING_VERSION;
            $this->plugin_name = 'sibooking';
            $this->set_locale();
            $this->get_classes();
            $this->init_classes();
        }
    
    private function get_classes() {
            $prefix    = $this->composer->getPrefixesPsr4();
            $classmap  = $this->composer->getClassMap();
            $classes = \array_keys( $classmap );
    
            foreach ( $classes as $class ) {
                if ( strpos($class,'Sibooking') === FALSE ||
                    strpos($class,'BookingDataObject') !== FALSE ||
                    strpos($class,'BookingDataStore') !== FALSE ||
                    strpos($class,'BookingEloquentModel') !== FALSE ||
                    strpos($class,'BookingsTable') !== FALSE ||
                    strpos($class,'BookingEloquentStore') !== FALSE ||
                    strpos($class,'Utility') !== FALSE
                ) {
                    continue;
                }
                $this->classes[] = $class;
            }
            return $this->classes;
        }
    
        private function init_classes() {
            foreach ( $this->classes as $class ) {
                try {
                    $temp = new $class;
                    $temp->init();
                } catch ( \Throwable $err ) {
                    \do_action( 'sibooking_initialize_failed', $err );
                    if ( WP_DEBUG ) {
                        throw new \Exception( $err->getMessage() );
                    }
                }
            }
        }
    
    


    이 방법은 클래스 루프의 strpo() 영역을 사용하여 로드하지 않으려는 특정 클래스를 제외할 수 있으므로 정말 잘 작동합니다.

    클래스 구조



    맞춤형 임대 가격



    WooCommerce에서 렌탈 제품에 대한 맞춤형 렌탈 가격으로 변경하려면 두 개의 후크가 필요합니다. 이에 대한 코드는 다음과 같습니다.

    add_filter('woocommerce_product_get_price', [$this, 'set_rental_price_product'], 99, 2);
    add_filter('woocommerce_add_cart_item', [$this,  'set_rental_price_cart'], 10, 2);
    
     /**
         * @param $price
         * @param \WC_Product $product
         * @return int|mixed|null
         */
        public function set_rental_price_product($price = null, $product = null) {
            $isbooking = sibooking_is_booking($product);
            $isbookingpurchase = !empty($product->get_meta['_sibooking-isbookingpurchase']) ? true : false;
            if(!$isbooking || $isbookingpurchase == true){
                return $price;
            }
    
            $startDate = $product->get_meta('sibooking-from');
            $endDate = $product->get_meta('sibooking-to');
    
            if($startDate == '') {
                return $price;
            }
    
            $price = $this->priceCalculation->calculatePrice($product->get_id(), $startDate, $endDate);
    
            return $price;
        }
    
     /**
         * @param $cart_item
         * @return int|mixed
         */
        public function set_rental_price_cart($cart_item, $cart_item_key) {
            $product = $cart_item['data'];
            $isbooking = sibooking_is_booking($product);
            $isbookingpurchase = !empty($cart_item['_sibooking-isbookingpurchase']) ? true : false;
            if(!$isbooking || $isbookingpurchase == true){
                return $cart_item;
            }
    
            $startDate = $cart_item['sibooking-from'];
            $endDate = $cart_item['sibooking-to'];
    
            $price = $this->priceCalculation->calculatePrice($product->get_id(), $startDate, $endDate);
    
            $product->set_price($price);
    
            $cart_item['data'] = $product;
    
            return $cart_item;
        }
    
    


    임대 예약을 위한 고급 사용자 정의 필드



    Advanced Custom Fields Pro는 임대 예약 설정 패널을 구축하는 데 사용되었습니다. 특히 사용 가능한 반복기 필드 및 날짜 시간 필드와 함께 사용하는 것이 좋습니다.

    멀티 벤더 WooCommerce 대여 예약 플러그인



    당사rental booking plugin for WooCommerce에 대한 자세한 내용은 당사 웹 사이트를 방문하십시오.

    좋은 웹페이지 즐겨찾기