web-dev-qa-db-ja.com

'wc-template-functions.php'ファイル内のWooCommerce関数を変更できますか、またはそのような変更のために 'functions.php'ファイルを使用する必要がありますか?

テーマの「function.php」ファイル内にWooCommerce関数の変更を配置することが好ましい選択であるのはなぜですか?時間の経過とともに、これによりファイルがかなり大きくなります。私は、はるかに大きなファイルを少なくするよりも、よく整理された小さなファイルをたくさん持つ方が一般的に良い方法であることを理解しています。

これを念頭に置いて、「wc-template-functions.php」および「wc-templates-hooks.php」ファイルをテーマにコピーし(ファイル階層を維持しながら)、それに応じてこれらのファイルを変更することの何が問題になっていますか?

副次的な要求として、比較的初心者からWooCommerceプラットフォームまで、WooCommerceについての以下の理解に対して、「はい、それは機能します」または「いいえ、何かが足りませんでした」という応答を得ることができれば幸いです。ファイル、フック、アクション、およびテンプレートはすべて、相互に機能します

私の理解:

  1. WooCommerce関数は、「wc-template-functions.php」ファイル内に登録されています。この説明のために、woocommerce_breadcrumbエントリを参照したいと思います。
  2. 次に、WooCommerceは 'wc-templates-hooks.php'ファイルを使用して、add_action('woocommerce_before_main_content','woocommerce_breadcrumb', 20, 0 );などの一般的なエントリを使用して、登録された関数を呼び出します。これは、woocommerce_breadcrumbwoocommerce_before_main_contentフック内で呼び出すように指示するだけです。
  3. WooCommerceは、必要に応じてdo_action( 'woocommerce_before_main_content' );を配置することにより、上記を出力できます。この場合、すべてのテンプレートファイル内。
8
Craig

あなたの1,2,3の理解は正しいです。

ただし、ファイル_wc-template-functions.php_と_wc-templates-hooks.php_は、テーマに同様のファイルを配置しても上書きされないため、テーマにそれらを含めても何も起こりません。

また、特定の何かを変更したいときに、コピー/オーバーライドファイルを卸売りすることは(私の意見では)悪い考えです。クライアントのサイトがクラッシュしたときに、WooCommerceテンプレートのフォルダー全体を探し回って、維持する必要のある実際の変更を見つける必要がありました。

_functions.php_ファイルをより小さく管理しやすいファイルに分割しても問題はありません。したがって、couldには、WooCommerce固有のコードを保存したい名前の_woocommerce-functions.php_ファイルがあります。

いくつかの考えを拡張するために編集

WooCommerce(または任意のWordPress関数は実際には))がこのパターンを示すときはいつでも:

_if ( ! function_exists( 'some_function_name' ) ) {

    function some_function_name() {
        echo 'taco';
    }
}
_

プラグ可能な関数があり、テーマの_function.php_で定義するだけで、WooCommerceはあなたのバージョンのsome_function_name()を使用します。

ただし、プラグイン可能な関数はフックされている場所にフックされており、テーマ/プラグインでそれらを再定義して移動することはできません。したがって、より強力なアプローチは、関数をフックから削除し、別のフックに追加するか、独自のカスタム関数を追加するか、またはその両方を行うことです。カスタムタイトルを価格の後に移動する例を次に示します。

_function kia_switch_loop_title(){
    remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 );
    add_action( 'woocommerce_after_shop_loop_item_title', 'kia_template_loop_product_title', 15 );
}
add_action( 'woocommerce_before_shop_loop_item', 'kia_switch_loop_title' );

function kia_template_loop_product_title() {
    echo '<h4 class="we-do-what-we-want">' . get_the_title() . '</h4>';
}
_
15
helgatheviking

関連製品を説明どおりに並べ替える方法に苦労していましたが、解決策が見つかりました。誰かがそれを必要とする場合に備えて

function custom_remove_hook(){
    remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
    add_action( 'woocommerce_after_single_product_summary', 'custom_function_to_sort_related', 22 );
}
add_action( 'woocommerce_after_single_product_summary', 'custom_remove_hook' );

function custom_function_to_sort_related( $args = array() ) {
        global $product;

        if ( ! $product ) {
            return;
        }

        $defaults = array(
            'posts_per_page' => 4,
            'columns'        => 4,
            'orderby'        => 'price', // @codingStandardsIgnoreLine.
            'order'          => 'desc'
        );

        $args = wp_parse_args( $args, $defaults );

        // Get visible related products then sort them at random.
        $args['related_products'] = array_filter( array_map( 'wc_get_product', wc_get_related_products( $product->get_id(), $args['posts_per_page'], $product->get_upsell_ids() ) ), 'wc_products_array_filter_visible' );

        // Handle orderby.
        $args['related_products'] = wc_products_array_orderby( $args['related_products'], $args['orderby'], $args['order'] );

        // Set global loop values.
        wc_set_loop_prop( 'name', 'related' );
        wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_related_products_columns', $args['columns'] ) );

        wc_get_template( 'single-product/related.php', $args );
    }
0
Gudok