WordPress 플러그인에서 플러그인 클래스를 재정의하려고합니다. 다음은 원래 플러그인 클래스입니다.
class WCV_Vendor_Dashboard
{
/**
* __construct()
*/
function __construct()
{
add_shortcode( 'wcv_shop_settings', array( $this, 'display_vendor_settings' ) );
add_shortcode( 'wcv_vendor_dashboard', array( $this, 'display_vendor_products' ) );
add_action( 'template_redirect', array( $this, 'check_access' ) );
add_action( 'init', array( $this, 'save_vendor_settings' ) );
}
public function save_vendor_settings(){
//some codes here
}
}
다음은 내가 시도하는 것입니다 (functions.php에서).하지만 작동하지 않습니다.
$wcv_vendor_dashboard = new WCV_Vendor_Dashboard();
global $wcv_vendor_dashboard;
remove_action( 'init', array( $wcv_vendor_dashboard , 'save_vendor_settings' ) );
올바르게 제거하는 방법과 대체물을 만드는 방법은 무엇입니까?
추가 정보 : WooCommerce 코어에서 비슷한 일을했습니다. 클래스 / 함수를 재정의하려면 다음을 사용합니다 (예 :
remove_action( 'template_redirect', array( 'WC_Form_Handler', 'save_account_details' ) );
function new_save_account_details() {
//custom code here
}
add_action( 'template_redirect', 'new_save_account_details' );
WooCommerce 코어에서 제대로 작동하고 있습니다. WCV_Vendor_Dashboard에서 비슷한 것을 시도했지만 작동하지 않습니다.
왜 woocommerce와 함께 작동했지만이 경우에는 작동하지 않습니까?
특정 작업에 함수를 연결하면 WoredPress는 해당 콜백에 대한 고유 ID를 만들고이를 전역 $wp_filter
배열에 저장합니다 (사실 이전에는 배열 이었지만 이제는 객체입니다). 객체 메소드 콜백 (예 :)의 array( $this, 'save_vendor_settings' )
경우 ID는 spl_object_hash
php 함수 로 생성됩니다 . 위의 예에서
spl_object_hash( $this ) . 'save_vendor_settings'
, 그리고 그것은처럼 보입니다 000000001c0af63f000000006d7fe83asave_vendor_settings
.
개체 메서드를 "합법적으로"제거하려면 remove_action()
처음에 함수를 연결하는 데 사용 된 원래 개체에 액세스 할 수 있어야합니다. 객체가 전역 네임 스페이스에있는 경우 :
global $wcv;
remove_action( 'init', array( $wcv, 'save_vendor_settings' ) );
생성 된 ID는 동일한 클래스의 인스턴스 인 경우에도 각 개체에 대해 고유하므로 다른 클래스 인스턴스를 만들 수 없습니다.
WooCommerce의 경우 정적 클래스 메서드에 관한 것 같습니다. 정적 클래스 메서드의 ID를 생성하는 데 다른 논리가 사용되며, 함수 및 정적 메서드 콜백은 문자열로 반환됩니다. 귀하의 예를 들면 다음과 같습니다.
'WC_Form_Handler' . '::' . 'save_account_details'
한 경우에는 작동하지만 다른 경우에는 작동하지 않는 이유를 알 수 있습니다.
첨부 된 함수를 전역 $wp_filter
객체 에서 직접 대체하여 대체하는 해킹이 있지만 100 % 신뢰할 수있는 것은 아닙니다. 원래 객체에 액세스 할 수 없기 때문에 $wp_filter
함수 이름으로 만 필터링 할 수 있습니다 . 동일한 작업에 대해 동일한 이름이 있으면 잘못된 핸들러를 대체합니다.
global $wp_filter;
foreach ( $wp_filter['init']->callbacks as $priority => &$callbacks ) {
foreach ( $callbacks as $id => &$callback ) {
if ( substr( $id, -strlen( 'save_vendor_settings' ) ) === 'save_vendor_settings' ) {
// replace the callback with new function
$callback['function'] = 'new_save_vendor_settings';
}
}
}
나는 그것이 효과가 있기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다