2016-04-15 16 views
5

Vì vậy, tôi có mã plugin nàyWordPress - xóa tác vụ được định nghĩa trong lớp Plugin

class WC_List_Grid { 

public function __construct() { 
    add_action('wp' , array($this, 'setup_gridlist') , 20); 
} 

function setup_gridlist() { 
    add_action('woocommerce_before_shop_loop', array($this, 'gridlist_toggle_button'), 30); 
} 

function gridlist_toggle_button() {?> 
       <nav class="gridlist-toggle"> 
        <a href="#" id="grid" title="<?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-grid-view"></span> <em><?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?></em></a> 
        <a href="#" id="list" title="<?php _e('List view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-exerpt-view"></span> <em><?php _e('List view', 'woocommerce-grid-list-toggle'); ?></em></a> 
       </nav> 
<?php } 
} 

Tôi muốn thay đổi nội dung của gridlist_toggle_button chức năng. Đây là cách tôi dự định thay đổi nội dung của hàm đó. Cũng giống như viết một hàm khác với hầu như cùng một html như là một bản gốc nhưng bit của những thay đổi của tôi. Một cái gì đó như

add_action('woocommerce_before_shop_loop','new_gridlist_toggle_button') 
function new_gridlist_toggle_button() {?> 
       <nav class="gridlist-toggle"> 
        <a href="#" class="grid-view" title="<?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-grid-view"></span> <em><?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?></em></a> 
        <a href="#" class="list-view" title="<?php _e('List view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-exerpt-view"></span> <em><?php _e('List view', 'woocommerce-grid-list-toggle'); ?></em></a> 
       </nav> 
<?php } 
} 

Bằng cách đó, tôi sẽ không cần phải thay đổi các tập tin trực tiếp cắm

Cho rằng, tôi đang cố gắng để loại bỏ hành động liên quan của nó.

add_action('woocommerce_before_shop_loop', array($this, 'gridlist_toggle_button'), 30); 

Để tôi có thể sử dụng mã của riêng mình. Nhưng tôi dường như không thể loại bỏ hành động này. Tôi đã thử điều này cho đến nay.

Phương pháp 1:

global $WC_List_Grid ; 
remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 100); 

Cách 2:

function remove_plugin_actions(){ 
global $WC_List_Grid ; 
remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 100); 
} 
add_action('init','remove_plugin_actions'); 

Phương pháp 3

remove_action('woocommerce_before_shop_loop', array('WC_List_Grid', 'gridlist_toggle_button'), 100); 

Không ai trong số họ có vẻ làm việc.

Với một chút suy nghĩ, tôi nghĩ có thể có hai nguyên nhân có thể xảy ra.

  1. Không hoạt động vì hành động tôi muốn xóa không được gắn trực tiếp vào móc. Hành động của nó bên trong hành động.
  2. Tôi đang cố gắng chặn đầu ra của gridlist_toggle_button qua functions.php. Nhưng nếu các plugin tải trước functions.php thì chức năng bị chặn đi đã được gọi và do đó nó luôn hiển thị đầu ra.

Tôi không tốt với OOP. Ai đó có thể giúp tôi không?

Trả lời

3

Bất cứ khi nào $wc_lg = new WC_List_Grid() được khởi tạo, nó sẽ kích hoạt móc wp. Ngay sau khi đối tượng lớp WP toàn cục được thiết lập, cá thể $wg_lg sẽ tự động gọi số setup_gridlist(). Nó sẽ kích hoạt móc woocommerce_before_shop_loop. Và bất cứ khi nào điều đó xảy ra, một lần nữa $wg_lg sẽ tự gọi một hàm. Cụ thể là gridlist_toggle_button().

Tôi muốn thay đổi nội dung của hàm gridlist_toggle_button

Tại sao không chỉ để thay đổi nó trong plugin? Giống như ghi đè mọi thứ bên trong nó.

toàn cầu $ WC_List_Grid;

Làm cách nào để bạn biết rằng $WC_List_Grid có tên? Nó chỉ là một tên lớp. Nó có thể được khởi tạo dưới bất kỳ tên nào như $foo hoặc $bar.

Tôi giả sử rằng bạn đang mã hóa trong tệp functions.php của mẫu của bạn. Plugin đang được tải trước khi functions.php và remove_action() chỉ có thể hoạt động sau add_action() happend.

Quan trọng: Để tháo móc, các đối số $ function_to_remove và $ priority phải khớp khi móc được thêm vào. Điều này xảy ra cho cả bộ lọc và hành động . Không có cảnh báo nào được đưa ra về lỗi xóa.

http://codex.wordpress.org/Function_Reference/remove_action

Vì vậy, đây thực sự nên làm việc chỉ để loại bỏ các hành động, nhưng làm thế nào để giúp bạn thay đổi nội dung bên trong của hàm? :

remove_action(
    'woocommerce_before_shop_loop', 
    array('WC_List_Grid', 'gridlist_toggle_button'), 
    30 
); 

Chú ý rằng bạn đang sử dụng ưu tiên 100

EDIT

tôi phát hiện ra rằng do_action('woocommerce_archive_description') xảy ra trong archive-product.php và trong wc-template-functions.php ngay trước woocommerce_before_shop_loop hành động móc đang được thực hiện trong plugin. Hãy thử sử dụng điều này:

function remove_plugin_actions(){ 
    global $WC_List_Grid; 
    remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 30); 
} 
add_action('woocommerce_archive_description','remove_plugin_actions'); 
+0

Vui lòng xem lại câu hỏi được cập nhật của tôi. Và tôi đã thử phương pháp này và nó cũng không hoạt động. –

+0

Bạn đã thử ưu tiên 30 hoặc 100 chưa? Bạn đã thử không có ưu tiên chưa? –

+0

Đã thử với tất cả, 30 và 100 và không được ưu tiên. Tôi nghĩ rằng điểm của bạn "Plugins đang được nạp trước khi functions.php" là lý do. Bởi vì tôi đang cố gắng chặn đầu ra của gridlist_toggle_button. Nhưng như bạn đã gợi ý, nếu các plugin tải trước functions.php thì hàm đó đã được gọi và do đó nó luôn hiển thị đầu ra. –

Các vấn đề liên quan