WooCommerceのためのレンタル予約とマルチベンダーの統合


WooCommerceのためのレンタル予約プラグインの選択


多くのレンタル予約プラグインWooCommerce利用可能です.としてdeveloper of rental bookings systems Magento 2のために、我々はその経験を使用して、WooCommerceの方へそれを適用することの利益を持ちました.二つの間には技術の積み重ねがあるが、基本は同じままである.実装したいと思っている機能のいくつかは、
  • 実際のレンタルインベントリ追跡だけではなく、製品の属性が、指定された開始日と終了日のクエリインベントリすることができる
  • また、コミュニティによってサポートされている柔軟なカレンダーは、理想的には、日付の範囲だけでなく、時間をサポートします.私たちはflatpickrに決めました.
  • 日1時間だけでなく、時間のレンタルインベントリレポートページ
  • WooCommerceのためのマルチベンダープラグインの選択


    マルチベンダ部分のために、WooCommerceのためにいろいろな異なるプラグインをテストしました.私たちが発見したのは、それらのほとんどは、製品のバンドルをサポートしていないし、それぞれ独自の統合スタイルがあります.我々は、クライアントがWooCommerceオークションプラグイン、ストライプの支払いとUIとの統合などのために探していた機能のほとんどを持っていたため、私たちはDokanに定住し、UIは良い使用していた.

    レンタル管理者ページの統合


    ので、難しい部分はどのように我々は私たちのレンタルプラグイン管理者レポートと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');
            }
    
        }
    
    その後、テンプレートをテンプレートに追加しました.テンプレート/dokan/ダッシュボードは、以下のようになります.
    <?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フロントエンドを使用しています.結果を以下に示します.

    マルチベンダーレンタルシステムの特定の部分のためのいくつかのコードサンプル


    それで、私たちは貸し出しの予約をDokanマルチベンダー統合に少し行ったのですが、レンタルカレンダーシステム自体については、どのように動作しますか?以下にいくつかのコードサンプルを示します:

    レンタルカレンダー
    あなたが見ることができるように、これはカートのボタンを追加した後のアクションプラグインですが、カスタムテンプレートを示しています.このテンプレートには、flatpickle divsを読み込むコードがあります.
    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/');
                }
            }
        }
    
    
    どのようにレンタルカレンダーを前面に見て、我々はもちろん、ここでは説明しないフラットpickleのJSとCSSファイルを追加し、カスタム日付範囲の可用性チェックを書きました

    作曲家読み込み


    もちろん私たちのWooCommerceのレンタルプラグインの作曲家の自動ローディングを使用したい.我々がそれを成し遂げた方法は、ここにあります.プラグインの主なエントリポイント内に次のようにします.
    
    $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() );
                    }
                }
            }
        }
    
    
    このメソッドは、クラスループのstro ()領域を使用してロードしたくないクラスを除外することができます.

    クラス構造


    カスタムレンタル価格


    つのフックは、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;
        }
    
    

    レンタル予約のための高度なカスタムフィールド


    高度なカスタムフィールドProはレンタル予約設定パネルを構築するために使用されました.我々は非常に特に使用可能な日付フィールドとリピーターフィールドとそれを使用することをお勧めします.

    マルチベンダーWooCommerceレンタル予約プラグイン


    我々の詳細についてはrental booking plugin for WooCommerce 弊社のWebサイトをご覧ください.