Làm cách nào để kiểm tra xem plugin (WooC Commerce) có hoạt động không?


9

Tôi đang cố gắng sửa đổi phần đầu và chân của các trang WooC Commerce của mình. Tôi có một iftuyên bố được cho là nhắm mục tiêu vào cửa hàng và giỏ hàng của WooC Commerce, nhưng không phải vậy. Nếu tôi sửa đổi PHP sau ifcâu lệnh thì không có gì thay đổi. Nhưng nếu tôi sửa đổi PHP trong elsecâu lệnh là hoạt động:

Điều này không hoạt động:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/CHANGE'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/page-header'); ?>
<?php endif ?>

Điều này không hoạt động:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/CHANGE'); ?>
<?php endif ?>

Tôi nghĩ rằng chức năng WooC Commerce có thể không được xác định đúng, bởi vì chức năng này cũng hoạt động:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>

Câu trả lời:


18

Lưu ý: Đối với một cách mới, đầy đủ hơn, tốt hơn và ít nhiều chính thức hơn, vui lòng xem câu trả lời của kontur . Như ông nhận xét , điều này cũng có thể được thực hiện với việc kiểm tra lớp.


Chỉnh sửa của bạn đã cho tôi ý tưởng này, thực sự không có chức năng gọi là »thương mại điện tử«, WooCommercemặc dù có một lớp » «. Một điều cần lưu ý là, séc phải trễ đủ để các plugin thực sự được khởi tạo, nếu không - rõ ràng - lớp sẽ không tồn tại và séc trả về false. Vì vậy, kiểm tra của bạn sẽ trông như thế này:

if ( class_exists( 'WooCommerce' ) ) {
  // some code
} else {
  / more code
}

Trên trang tài liệu WooC Commerce » Tạo plugin cho WooC Commerce « Tôi đã tìm thấy điều này:

/**
 * Check if WooCommerce is active
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Put your plugin code here
}

Cá nhân tôi nghĩ rằng nó gần như không đáng tin cậy như việc kiểm tra lớp học. Vì lý do rõ ràng, điều gì sẽ xảy ra nếu tên thư mục / tệp khác nhau, nhưng cũng hoạt động tốt. Ngoài ra, nếu bạn làm như thế này, thì có một hàm API bạn có thể sử dụng, được đặt tên phù hợp is_plugin_active(). Nhưng vì nó thường chỉ có sẵn trên các trang quản trị, bạn phải làm cho nó có sẵn bằng cách bao gồm wp-admin/includes/plugin.php, nơi chức năng cư trú. Sử dụng nó, kiểm tra sẽ như thế này:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}

3
Đây có thể là một trò chơi "tiệc tùng" thú vị, tìm cách khác ;-) Hãy để tôi tham gia cùng if( function_exists( 'WC' ) ), nhưng chính xác hơn là có tên plugin trong kiểm tra lớp, như bạn đề xuất ;-)
birgire

2
Trên thực tế chức năng này WC() tồn tại , tôi chỉ cố gắng tìm một cách ngắn hơn bằng cách tham khảo nó ;-) Tôi đoán nó sẽ chính xác hơn với if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). Chơi cùng, chúng tôi cũng có thể kiểm tra các hằng số (ví dụ WOOCOMMERCE_VERSION) hoặc hành động (ví dụ did_action( 'woocommerce_loaded' )) ;-) @ialocin
birgire

1
Đúng vậy, vào cuối ngày có rất nhiều khả năng! @birgire
Nicolai

1
Vâng, đi thôi :) Vì vậy, WPSE thực sự là phiên bản trực tuyến của »99 cách để giải quyết các vấn đề về PHP / WorPress của bạn« - Tôi đã phải đồng xu, để chính thức :) @birgire
Nicolai

2
Câu trả lời này KHÔNG đáng tin cậy. Vì cả câu hỏi và câu trả lời đều không nêu rõ ngữ cảnh, có thể WooC Commerce đang hoạt động, nhưng được tải sau mã này. Ví dụ: trong một plugin khác, điều đó xảy ra để được tải trước đó. Kiểm tra lớp được đề xuất là đáng tin cậy hơn nhiều, nếu bạn thêm nó vào hookins_loaded hook . Tức là bọc mệnh đề if trong một check_for_woocommerce()hàm và đăng ký nó vớiadd_action('plugins_loaded', 'check_for_woocommerce');
kontur

6

Nhiều plugin chính thức của WooC Commerce giải quyết vấn đề này bằng cách kiểm tra WC_VERSIONhằng số, mà WooC Commerce xác định, một khi tất cả các plugin đã được tải. Mã đơn giản:

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // no woocommerce :(
    } else {
        var_dump("WooCommerce installed in version", WC_VERSION);
    }
}

Phần thưởng thêm vào là bạn có thể sử dụng PHP version_compare()để kiểm tra thêm xem phiên bản WooC Commerce mới đã được cài đặt chưa (nếu mã của bạn yêu cầu các khả năng cụ thể), vì hằng số WC_VERSION phù hợp cho việc này.


đây là một cách thực sự tốt Mẹo hay cho các nhà phát triển plugin bao gồm là tốt.
Jacob Raccuia

3

Để cải thiện các câu trả lời được đưa ra, chúng tôi đang sử dụng điều này:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Put your plugin code here
}

Điều này ngăn ngừa hai vấn đề:

  • WooC Commerce đang được cài đặt trong một thư mục không chuẩn - trong trường hợp if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...này không hoạt động.
  • Kiểm tra này được gọi trước khi WooC Commerce được tải - trong trường hợp if ( class_exists( 'WooCommerce' ) ) { .. }đó không hoạt động.

Câu trả lời này rất hữu ích cho các nhà phát triển plugin vì bạn chỉ có thể bọc toàn bộ tệp chính của plugin bằng câu lệnh IF này.
Dave Hilditch

Đây là giải pháp duy nhất hiệu quả với tôi trong plugin của tôi! Cảm ơn bạn!!!
Sam

1

Tôi thấy điều này hữu ích từ tài liệu dành cho nhà phát triển WooC Commerce.

Bạn chỉ có thể gọi is_woocommerce_active()chức năng trong tập tin plugin của bạn.

Thí dụ

if ( ! is_woocommerce_active() ) 
{
    add_action( 'admin_notices', 'WC_Subscriptions::woocommerce_inactive_notice' );
    return;
}

is_wooc Commerce_active được định nghĩa như dưới đây theo tài liệu woo

/**
 * Check if WooCommerce is activated
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}

0

Bạn có thể bọc plugin của mình trong một kiểm tra để xem WooC Commerce đã được cài đặt và hoạt động hay chưa:

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce is active.';
} else {
echo 'WooCommerce is not Active.';
}

2
Điều này không hoạt động với nhiều người
Andrew Lazarus

@AndrewLazarus Cảm ơn bạn đã đề cập đến điều đó - Tôi vừa mất một giờ cho vấn đề này! :)
wickywills
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.