janfabry
  • 0
Гуру

Когда remove_filter не работает?

  • 0

Есть отчеты, которые 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

Share
  1. Привет @Jan: Какова твоя цель? Вы столкнулись с ошибкой, хотите написать код, который позволяет избежать ошибки, или что-то другое? При рассмотрении поста @hakre[1] и связанного с ним trac-тикета[2] кажется, что это довольно эзотерическая ошибка, и даже ведутся споры о том, является ли то, что написал @hakre, полностью законным (см. комментарии.) [1]: hakre. wordpress.com/2010/08/09/… [2]: core.trac.wordpress.org/ticket/10535

    • 0
    • @Mike: я хочу знать, когда я могу столкнуться с ошибкой, поэтому я знаю, стоит ли ее кодировать. Действительно, я читал комментарии и тикеты, но мы могли бы использовать одно обновляемое место, где объясняется эта проблема. Этот сайт показался мне идеально подходящим.

      • 0
    • @Jan: FWIW Я очень много кодировал и никогда не сталкивался с ошибкой. Я также редко сталкивался с необходимостью использования remove_filter(), заставляя меня думать, что люди могут использовать его, когда можно/нужно использовать более правильный подход к кодированию (может быть, поэтому я не столкнулся с проблемой?) Мне было бы любопытно чтобы знать, когда это действительно необходимо, помимо фактического удаления фильтра, добавленного ядром или другим плагином, который вам не нужно запускать.

      • 0
    • Хороший вопрос, и, с моей точки зрения, действительно правильный. Но, как уже указывал Майк, это не то, с чем придется иметь дело всем разработчикам (когда вы в последний раз использовали remove_filter() ?). Рядом со статьей в коде тикета и комментариев уже показаны проблемные места. Но имейте в виду, что это обсуждение разработки, и Майк задал правильный встречный вопрос: что вам нужно? Я просто предлагаю в статье не полагаться на remove_filter(), чтобы быть в безопасности.

      • 0
    • @hakre: В вашей статье действительно показаны обходные пути, но они нестандартны, поэтому я хотел бы знать, нужно ли их использовать для фильтров, которые я создаю. Билеты trac показывают примеры, но трудно понять, к каким версиям WordPress они применимы. Если мы разместим здесь нерабочие примеры, они могут быть обновлены новыми ответами, если ограничения изменятся. Я хочу создавать плагины , которые приятны друг другу, поэтому все фильтры должны быть съемными.

      • 0
    • Я понимаю, что это технический вопрос, и что лучшее обсуждение можно найти в списках отслеживания и рассылки, но, возможно, в разных тикетах и ​​ветках. Поскольку эта внутренняя проблема может иметь последствия для разработчиков плагинов, многие из которых не следят за trac или списками рассылки, думаю, наглядный пример на этом сайте не помешает. Если вы считаете, что этот вопрос не входит в рамки этого сайта, мы могли бы обсудить его на мета-сайте.

      • 0
    • @ Ян Фабри, конечно, хорошая мысль. но для меня техническое обсуждение имеет смысл, если оно приводит к исправлению. has_filter() может и сломаться. Сейчас я начал рефакторинг файла plugin.php: core.trac.wordpress.org/ticket/14789, но пока не буду касаться подпрограммы uniq_id.

      • 0
    • Это отдельный дефект, который был закрыт в trac as wontfix, из того, что было выделено hakre. Это одна из самых ярких особенностей, к которым нужно привыкнуть при разработке WP. 🙂

      • 0
    • Вы, ребята, знаете больше, чем я.. это читается как та же проблема (думаю, я знаю меньше, чем я думал).. хе-хе.. 🙂 У каждой программы/приложения есть свои причуды. догадка)..

      • 0
    • @Denis: не хочешь дать ссылку на этот неисправленный билет? Я не мог найти его.

      • 0
    • @scribu: извини. Все, что я помню, это то, что его закрыли, и это меня очень разозлило, когда это произошло. Один из тех многих, многих, многих, многих дней, когда я пообещал себе больше не выпускать патчи для WP… (Чего я больше не делаю по какой-то причине…)

      • 0
  2. Ну, это как-то очень специфическая тема, связанная с проблемой разработки WordPress. Я настоятельно рекомендую вам следить за билетом trac, если вам понравилась моя статья. Я предполагаю, что это лучшее, что вы можете сделать, чтобы выяснить, когда возникают проблемы, а также как их обойти технически (если вам не нравится не используйтеremove_filter() -ответ).

    Взгляните на это с теоретической точки зрения: просто используемые типы данных строго не обрабатываются, чтобы обеспечить одинаковую функциональность для всех возможных значений (f(n) != f(n)). Вкратце: сломанный дизайн.

    Означает ли это, что на практике он всегда будет ломаться? — Нет! Просто иногда это может случиться. И тогда вы в ловушке, когда вам нужно полагаться на remove_filter() .

    Лучшее предложение может быть таким: если вы разрабатываете плагины, использующие хуки в качестве методов класса, убедитесь, что плагин выполняется на установках с PHP 5.2/5.3.

    Пожалуйста, держите техническое обсуждение в тикете trac. И если вы серьезно заинтересованы, пожалуйста, помогите исправить недостатки текущего дизайна.

    • 0
  3. Как прокомментировал Денис в блоге Хакре, это очень простой пример проблемы.

    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 '';
    

    Прежде чем запускать этот код, спросите себя, какого результата вы ожидаете. Как только вы решили, каким должен быть результат, запустите его и посмотрите, что произойдет.

    • 0

Оставить ответ

You must login to add an answer.