it-swarm.asia

متى لا تعمل remove_filter؟

هناك تقارير تفيد بأن remove_filter لا يعمل في ظل بعض الظروف ، وأنه يجب علينا تقديم بدائل . ومع ذلك ، فإن المقال لا يوضح حقيقة الظروف التي يحدث فيها ذلك.

أنا أبحث عن أمثلة للشفرات التي من شأنها كسر remove_filter ، مع إصدار WordPress و PHP، وفي النهاية معلومات أخرى ذات صلة. أعتقد أن المقتطف التالي يجب أن يكون نموذجًا صالحًا للاستخدام:

<?php
include('wp-load.php');

function filtertest_function($value)
{
    return 'Filtered';
}

var_dump(apply_filters('filtertest', 'Original value'));
add_filter('filtertest', 'filtertest_function');
var_dump(apply_filters('filtertest', 'Original value'));
remove_filter('filtertest', 'filtertest_function');
var_dump(apply_filters('filtertest', 'Original value'));

هذا سيعود المتوقع:

string(14) "Original value"
string(8) "Filtered"
string(14) "Original value"

أعتقد أن الخطأ يظهر في بعض الحالات التي يكون فيها المرشح جزءًا من الفصل الدراسي ، أو يتم استخدام عوامل تصفية متعددة. أفهم _wp_filter_build_unique_idمتورط . الرجاء الإشارة إلى مصدر الخطأ في هذا الرمز.

3
Jan Fabry

حسنًا ، هذا موضوع محدد جدًا يرتبط بطريقة ما بتطوير Wordpress. أقترح عليك بشدة أن تتبع تذكرة trac إذا كنت تحب مقالتي. هذا هو أفضل شيء يمكنك القيام به لأفترضه لمعرفة متى تبدأ المشاكل وكذلك كيفية التحايل عليها تقنيًا (إذا كنت لا تحب لا تستخدم remove_filter() - الجواب).

خذها من وجهة نظر نظرية: إنها مجرد عدم التعامل مع أنواع البيانات المستخدمة بشكل صارم لضمان نفس الوظيفة على جميع القيم الممكنة (f (n)! = f (n)). باختصار: تصميم مكسور.

هل هذا يعني أنه سينتهي دائما في الممارسة؟ - لا! انها مجرد أنه يمكن أن يحدث في بعض الأحيان. وبعد ذلك تكون محاصرين عندما تحتاج إلى الاعتماد على remove_filter().

قد يكون هذا اقتراحًا أفضل: إذا قمت بتطوير مكونات إضافية تستخدم الخطافات كطرق فصل ، فتأكد من تنفيذ المكون الإضافي على عمليات التثبيت باستخدام PHP 5.2/5.3.

يرجى الحفاظ على المناقشة الفنية في تذكرة trac. وإذا كنت مهتمًا بجدية ، فيرجى المساعدة في إصلاح أوجه القصور في التصميم الحالي.

3
hakre

وكما علق دينيس على مدونة هكر ، فإن هذا مثال أساسي للغاية على هذه القضية.

function run_me_once() {
    remove_action( 'foobar', 'run_me_once' );
    echo 'test....';
}
add_action( 'foobar', 'run_me_once' );

function run_me2() {
    echo 'test2....';
}
add_action( 'foobar', 'run_me2', 11 );

echo '';
do_action( 'foobar' ); // test....
echo '';
echo '';
do_action( 'foobar' ); // test2....
echo '';

قبل تشغيل هذا الرمز رغم ذلك ، اسأل نفسك ، ماذا تتوقع أن تكون النتيجة. بمجرد أن تقرر النتيجة التي يجب أن تكون عليها ، شغِّلها وشاهد ما سيحدث.

1
t31os