Xóa Tác vụ / Bộ lọc được thêm qua Chức năng ẩn danh


10

Đó là một thực tế tồi tệ tôi phải nói. Đã dành hai giờ qua để tìm giải pháp xóa các hành động và bộ lọc được thêm thông qua các chức năng Ẩn danh.

Đây là mã được sử dụng trên Chủ đề phụ huynh và tôi cần xóa nó.

/**
 * Add custom columns to admin comments grid
 *  * Rate that user set.
 */
add_filter( 'manage_edit-comments_columns', function( $default ) {
    $columns['smr_comment_rate']  = __( 'Rate', 'txtdmn' );

    return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
});

câu trả lời của toscho , chơi với nó rất nhiều, nhưng không có sự giúp đỡ. Vì vậy, có bất kỳ sự thay thế nào khác sẽ loại bỏ các hành động / bộ lọc được thêm vào thông qua các chức năng ẩn danh không?

Cảm ơn


Tôi sẽ đề nghị liên hệ với các tác giả của chủ đề. Đó là một sửa chữa tương đối dễ dàng cho anh ấy / cô ấy để sử dụng một chức năng được đặt tên thay cho ẩn danh và sẽ cải thiện mã.
xe đạp vào

gmazzap có vẻ như @ vishalbasnet23 đã làm điều đó ở đây: gist.github.com/vishalbasnet23/5f74df4c800681199ab0246bc037d1d5 Tôi đang thử nghiệm nó và cho đến nay nó vẫn hoạt động hoàn hảo.
Renan Oliveira

Câu trả lời:


10

Vấn đề là bạn không thể phân biệt một hàm ẩn danh và một hàm khác, vì vậy, có thể loại bỏ một bao đóng (tức là hàm ẩn danh) nhưng nếu có nhiều hơn một đóng hoạt động trên cùng một bộ lọc theo cùng một mức ưu tiên, bạn phải lựa chọn , loại bỏ tất cả, quặng chỉ loại bỏ một (mà không biết chính xác).

Tôi sẽ chỉ cho bạn cách xóa tất cả chúng bằng cách sử dụng một hàm có nguồn gốc cao từ hàm trong câu trả lời @toscho mà bạn đã đăng:

/**
 * Remove an object filter.
 *
 * @param  string $tag                Hook name.
 * @param  string $class              Class name. Use 'Closure' for anonymous functions.
 * @param  string|void $method        Method name. Leave empty for anonymous functions.
 * @param  string|int|void $priority  Priority
 * @return void
 */
function remove_object_filter( $tag, $class, $method = NULL, $priority = NULL ) {
  $filters = $GLOBALS['wp_filter'][ $tag ];
  if ( empty ( $filters ) ) {
    return;
  }
  foreach ( $filters as $p => $filter ) {
    if ( ! is_null($priority) && ( (int) $priority !== (int) $p ) ) continue;
    $remove = FALSE;
    foreach ( $filter as $identifier => $function ) {
      $function = $function['function'];
      if (
        is_array( $function )
        && (
          is_a( $function[0], $class )
          || ( is_array( $function ) && $function[0] === $class )
        )
      ) {
        $remove = ( $method && ( $method === $function[1] ) );
      } elseif ( $function instanceof Closure && $class === 'Closure' ) {
        $remove = TRUE;
      }
      if ( $remove ) {
        unset( $GLOBALS['wp_filter'][$tag][$p][$identifier] );
      }
    }
  }
}

Tôi đã đổi tên hàm remove_object_filtervì nó có thể loại bỏ tất cả các loại bộ lọc đối tượng: phương thức lớp tĩnh, phương thức đối tượng động và đóng.

Đối $prioritysố là tùy chọn, nhưng khi loại bỏ các bao đóng nên luôn luôn được sử dụng, nếu không, hàm sẽ loại bỏ bất kỳ bao đóng nào được thêm vào bộ lọc, bất kể mức độ ưu tiên nào, bởi vì khi $priorityđược bỏ qua, tất cả các bộ lọc sử dụng lớp / phương thức đích hoặc đóng loại bỏ.

Cách sử dụng

// remove a static method
remove_object_filter( 'a_filter_hook', 'AClass', 'a_static_method', 10 );

// remove a dynamic method
remove_object_filter( 'a_filter_hook', 'AClass', 'a_dynamic_method', 10 );

// remove a closure
remove_object_filter( 'a_filter_hook', 'Closure', NULL, 10 );

Tôi đã thử cái này và nhiều cái khác, nhưng đơn giản là nó không hoạt động
adamj 7/07/17

@adamj kể từ phiên bản 4.7, WordPress đã giới thiệu cách mới để xử lý các hook, vì vậy cách này không hoạt động nữa ...
gmazzap

Bạn có biết bất kỳ sự thay thế nào bằng cơ hội nào không?
adamj

1
@adamj Tôi có thể cập nhật cái này cho 4.7+, nhưng không có thời gian, và không chắc chắn khi nào tôi sẽ có. Bạn có thể mở một câu hỏi mới, nơi bạn liên kết đến Hỏi / Đáp này và nói rằng câu hỏi này đã lỗi thời, theo cách đó bất cứ ai cũng có thể trả lời, vì vậy nếu tôi không có thời gian, có thể người khác sẽ làm. Thay vào đó, bạn có thể đặt tiền thưởng cho Q này, giải thích rằng câu trả lời được nâng cao nhất ở đây không hoạt động trong phiên bản hiện tại của WP ...
gmazzap

3

Điều gì sẽ xảy ra nếu bạn thêm bộ lọc của mình, với mức độ ưu tiên 11, vì vậy nó sẽ đi sau? Điều đó xấu, nhưng có thể làm việc trong trường hợp của bạn.

add_filter( 'manage_edit-comments_columns', function( $default ) {
    unset( $default['smr_comment_rate'] );

    return $default;
}, 11, 1 );

2

Các bộ lọc và hành động ẩn danh có thể được loại bỏ nguyên bản bằng cách sử dụng như sau:

remove_filter( $tag, function(){}, $priority )

Khi tạo id duy nhất bằng cách sử dụng spl_object_hash(), các hàm ẩn danh có thể so sánh với nhau, vì vậy đối tượng đóng hoàn toàn không cần phải tạo lại.

Nếu nhiều bộ lọc hoặc hành động được kết nối với cùng một thẻ có cùng mức độ ưu tiên, thì nó sẽ xóa bộ lọc hoặc hành động mới nhất được thêm vào. Nếu có một cái bạn cần giữ, bạn sẽ phải xóa tất cả các bộ lọc theo bộ lọc bạn cần loại bỏ, sau đó thêm lại các bộ lọc khác nếu cần.

// Filter which was added and needs to be removed
add_filter( 'manage_edit-comments_columns', function( $default ) {
    $columns['smr_comment_rate']  = __( 'Rate', 'txtdmn' );

    return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
} );

// Removes the last anonymous filter to be added
remove_filter( 'manage_edit-comments_columns', function(){} );

Điều này thường sẽ trở lại với thực tiễn tốt nhất. Tôi sẽ chỉ sử dụng các chức năng ẩn danh như một phần của chủ đề tùy chỉnh mà tôi đang phát triển cho một khách hàng, nơi tôi không muốn bộ lọc bị ghi đè hoặc bị xóa. Trong bất kỳ chủ đề công cộng hoặc plugin nào tôi phát triển, tôi sẽ sử dụng một nhà máy để khởi tạo một lớp, thêm tất cả các bộ lọc và hành động của mình, sau đó lưu trữ thể hiện dưới dạng một biến tĩnh.

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.