web-dev-qa-db-ja.com

プラグイン関数をカスタムの名前が変更された関数で置き換えると機能しません

WooCommerceおよびWooCommerce Bookingsプラグインを有効にして、オプションの1つを選択する必要があることをお客様に知らせるために、製品時間ピッカーセクションの上にテキスト行を追加しようとしています。

コピーしたwc-bookings-functions.php phpファイルの "includes"フォルダー内にあるWooCommerce Bookingsプラグインに関数を見つけました。私のテーマのfunctions.phpファイル。関数名の先頭に "de _"を追加して名前を変更し、add_filterを追加します。

これを行うと、関数(元のプラグインまたは私のもの)がまったく機能せず、元のピッカーも私のバージョンも表示されず、何も返されません。

元の機能:

function wc_bookings_get_time_slots_html( $bookable_product, $blocks, $intervals = array(), $resource_id = 0, $from = 0, $to = 0 ) {
    $available_blocks = wc_bookings_get_time_slots( $bookable_product, $blocks, $intervals, $resource_id, $from, $to );
    $block_html       = '';

    // If customer defined, we show two dropdowns start/end time.
    if ( 'customer' === $bookable_product->get_duration_type() ) {
        $block_html .= wc_bookings_get_start_time_html( $bookable_product, $blocks, $intervals, $resource_id, $from, $to );
        $block_html .= wc_bookings_get_end_time_html( $bookable_product, $blocks, '', $intervals, $resource_id, $from, $to );
    } else {

        $block_html .= '<div class="please-select">Hi please select your session</div>';

        foreach ( $available_blocks as $block => $quantity ) {
            if ( $quantity['available'] > 0 ) {
                if ( $quantity['booked'] ) {
                    /* translators: 1: quantity available */
                    $block_html .= '<li class="block" data-block="' . esc_attr( date( 'Hi', $block ) ) . '"><a href="#" data-value="' . get_time_as_iso8601( $block ) . '">' . date_i18n( get_option( 'time_format' ), $block ) . ' <small class="booking-spaces-left">(' . sprintf( _n( '%d left', '%d left', $quantity['available'], 'woocommerce-bookings' ), absint( $quantity['available'] ) ) . ')</small></a></li>';
                } else {
                    $block_html .= '<li class="block" data-block="' . esc_attr( date( 'Hi', $block ) ) . '"><a href="#" data-value="' . get_time_as_iso8601( $block ) . '">' . date_i18n( get_option( 'time_format' ), $block ) . '</a></li>';
                }
            }
        }
    }

    return apply_filters( 'wc_bookings_get_time_slots_html', $block_html, $available_blocks, $blocks );
}

Functions.phpファイルに追加した関数。新しい関数を追加しましたde _

function de_wc_bookings_get_time_slots_html( $bookable_product, $blocks, $intervals = array(), $resource_id = 0, $from = 0, $to = 0 ) {
    $available_blocks = wc_bookings_get_time_slots( $bookable_product, $blocks, $intervals, $resource_id, $from, $to );
    $block_html       = '';

    // If customer defined, we show two dropdowns start/end time.
    if ( 'customer' === $bookable_product->get_duration_type() ) {
        $block_html .= wc_bookings_get_start_time_html( $bookable_product, $blocks, $intervals, $resource_id, $from, $to );
        $block_html .= wc_bookings_get_end_time_html( $bookable_product, $blocks, '', $intervals, $resource_id, $from, $to );
    } else {

        $block_html .= '<div class="please-select">Hi please select your session</div>';

        foreach ( $available_blocks as $block => $quantity ) {
            if ( $quantity['available'] > 0 ) {
                if ( $quantity['booked'] ) {
                    /* translators: 1: quantity available */
                    $block_html .= '<li class="block" data-block="' . esc_attr( date( 'Hi', $block ) ) . '"><a href="#" data-value="' . get_time_as_iso8601( $block ) . '">' . date_i18n( get_option( 'time_format' ), $block ) . ' <small class="booking-spaces-left">(' . sprintf( _n( '%d left', '%d left', $quantity['available'], 'woocommerce-bookings' ), absint( $quantity['available'] ) ) . ')</small></a></li>';
                } else {
                    $block_html .= '<li class="block" data-block="' . esc_attr( date( 'Hi', $block ) ) . '"><a href="#" data-value="' . get_time_as_iso8601( $block ) . '">' . date_i18n( get_option( 'time_format' ), $block ) . '</a></li>';
                }
            }
        }
    }

    return apply_filters( 'wc_bookings_get_time_slots_html', $block_html, $available_blocks, $blocks );
}

そしてadd_filter(de _関数の始まり)

add_filter('wc_bookings_get_time_slots_html','de_wc_bookings_get_time_slots_html', 10);

私はラインを期待していました:

$block_html .= '<div class="please-select">Hi please select your session</div>';

利用可能な日付の上に表示されます。

しかし、何も起こりません。日をクリックしても、日付やテキストが表示されません。関数を削除してフィルターをかけると、元のタイムスロットピッカーが期待どおりに表示されます。

フィルターの使用に関するドキュメントを読み、これを正しく行っていると思いました。

また、名前の先頭に「de_」を付けてreturn apply_filtersを変更しようとしましたが、何も変更されませんでした。

1
Digital Essence

最初に、元のwc_bookings_get_time_slots_html()関数で、次の行:

$block_html .= '<div class="please-select">Hi please select your session</div>';

存在しない、これは、元の関数と、アクティブなテーマの関数のphpファイルにコピーした(名前を変更してカスタマイズした)関数との違いを理解しようとする人々を混乱させるものです。

ここでプラグイン関数をコピーするをテーマに追加します(名前を変更してカスタマイズします)何もしません

代わりに、利用可能なフックを使用してくださいwc_bookings_get_time_slots_html、これにより、次のように簡単にカスタマイズできます。

add_filter( 'wc_bookings_get_time_slots_html', 'filter_bookings_get_time_slots_html_callback', 10, 6 );
function filter_bookings_get_time_slots_html_callback( $bookable_product, $blocks, $intervals, $resource_id, $from, $to ) {
    if ( 'customer' !== $bookable_product->get_duration_type() ) {
        $block_html = '<div class="please-select">Hi please select your session</div>' . $block_html;
    }

    return $block_html;
}

コードは、アクティブな子テーマ(またはアクティブなテーマ)のfunction.phpファイルに入ります。テストして動作します。

0
LoicTheAztec