mathiregister
  • 0
Новичок

Проблема с реализацией виджета через the_content()

  • 0

Эй, ребята, мне очень нужна ваша помощь с этим.

Я использую плагин subscribe2 (для подписки по электронной почте). Я хочу показать форму регистрации в виде виджета. Автор плагина рекомендует делать это следующим образом.

$content = apply_filters('the_content', '<!--subscribe2-->');
$content = remove_filter('the_content', 'page_route');
echo $content;

это работает нормально, за исключением того факта, что я дополнительно использую плагин для смешивания (своего рода плагин для социальной сети).

Всякий раз, когда я нахожусь на странице плагина смешивания (например, /login, /register, /activity и т. д.), виджет с формой подписки внезапно отображает то же самое содержимое, что и сами страницы? Просто странно!

Любая идея, почему это могло произойти? Или как я мог предотвратить это! Мне действительно нужно решение для этого!

редактировать: все фильтры смешиваются…

add_filter('get_avatar', array($this,'override_avatar'), 10, 4);
add_filter('get_comment_author_url', array($this,'override_author_url'));
add_filter('mngl-show-powered-by', array(&$this, 'show_powered_by'));
add_filter('the_content', array( &$this, 'page_route' ), 100);
add_action('wp_enqueue_scripts', array(&$this, 'load_scripts'), 1);
add_action('admin_enqueue_scripts', array(&$this,'load_admin_scripts'));
register_activation_hook(MNGL_PATH."/mingle.php", array( &$this, 'install' ));

// Used to process standalone requests (make sure mingle_init comes before parse_standalone_request)
add_action('init', array(&$this,'mingle_init'));
add_action('init', array(&$this,'parse_standalone_request'));
add_filter('request', array(&$this,'parse_pretty_profile_url'));

add_action('phpmailer_init', array(&$this, 'set_wp_mail_return_path'));
add_action('phpmailer_init', array(&$this, 'set_wp_mailer'));
add_action('admin_init', array(&$this, 'prevent_admin_access'));

add_filter('mngl-activity-types', array( &$this, 'add_activity_types' ));
add_filter('mngl-notification-types', array( &$this, 'add_notification_types' ));

add_filter('mngl-notification-types', array( $this, 'add_notification_types' ));
add_filter('mngl-activity-types', array( &$this, 'add_activity_types' ));
add_action('user_register', array(&$this, 'add_default_friends') );
add_filter('mngl-activity-types', array( &$this, 'add_activity_types' ));
Share
  1. Дает ли echo apply_filters( 'do_shortcode', '<!--subscribe2-->'); вам то, что вы хотите? Если это сработает, это может быть проще, чем пытаться удалить все дополнительные фильтры из the_content…

    • 0
    • нет, извините, это не работает. я уже пробовал apply_filters( 'do_shortcode', '<!--subscribe2-->' и do_shortcode('<!--subscribe2-->') . Ни один из них не работает — я думаю, потому что это не совсем шорткод, не так ли? Шорткод больше похож на [шорткод], который можно разместить внутри обычного поста. <!--subscribe2--> должен быть опубликован как html, так что это может быть важно. что вы имеете в виду под удалением всех дополнительных фильтров? Для этого должно быть решение. Можете ли вы объяснить, почему виджет показывает содержимое текущей страницы только тогда, когда я нахожусь на странице, специфичной для mingle()? почему не на всех страницах?

      • 0
    • Что ж, похоже, что этот плагин смешивания добавляет свои собственные специальные фильтры к the_content тем, которые срабатывают на определенных страницах. Вы можете выполнить поиск в исходном коде плагина, чтобы узнать, что это remove_filter за фильтры, вызвать каждый из них в своем виджете. Затем не забудьте добавить их обратно после того, как вы закончите отображать свой виджет, иначе обычное содержимое страницы не будет правильно отображаться на этих страницах, если виджет отображается перед содержимым публикации.

      • 0
    • Спасибо за помощь. мигл добавляет только один фильтр к the_content! add_filter('the_content', array( &$this, 'page_route' ), 100); он добавляет, вероятно, еще 15 фильтров, но всегда для конкретных плагинов. Я отредактировал свой пост и добавил строку remove_filter. однако, если я так, ничего не распечатывается в моем виджете?

      • 0
    • когда я это делаю, я по-прежнему вывожу $content или $result_remove_filter? Если я повторяю $result_remove_filter, ничего не печатается. Если я повторяю $content, поведение не меняется — виджет показывает то же содержимое, что и сама страница. Я обновил свой вопрос, чтобы вы могли видеть, какие фильтры применяются. я обыскал всю папку плагина для «add_filter», и это все, что я нашел.

      • 0
    • Хорошо, я вижу. Если с помощью $result_remove_filter ничего не печатается, то удаление фильтра не удалось (!), ничего не напечатано означает на самом деле FALSE, используйте var_dump($variable), чтобы получить больше информации о том, что находится внутри переменной. remove_filter() -Reference (объяснены возвращаемые значения и их значение).

      • 0
    • Вы не можете удалить этот фильтр таким образом, потому что он был добавлен как часть объекта. Однако вы можете удалить все фильтры с этим приоритетом или просмотреть глобальные фильтры $wp_filters, чтобы найти тот, который вам нужен.

      • 0
  2. Чрезвычайно сложно удалить фильтр, добавленный как часть объекта. Вы получаете ссылку на исходный объект и передаете ее как часть удаляемой функции.

    К счастью, фильтр был добавлен с необычным приоритетом, поэтому вы, вероятно, будете в безопасности, удалив все фильтры с приоритетом 100:

    remove_all_filters( 'the_content', 100 );
    $content = apply_filters('the_content', '<!--subscribe2-->');
    echo $content;
    

    Просто убедитесь, что у вас нет ничего важного, добавленного с приоритетом 100…

    Если вам нужно найти только этот конкретный фильтр для удаления, то я не в своей тарелке. Кто-нибудь еще?

    Редактировать:

    Мне пришлось разобраться с этим, так как я действительно некоторое время задавался вопросом, как удалить фильтр, который был передан по ссылке. В этом случае класс MnglAppController, который добавляет фильтр, инициируется как переменная:

    $mngl_app_controller           = new MnglAppController();
    

    Поэтому, чтобы удалить его, вы должны глобализовать эту переменную и передать ее как часть вызова remove_filter:

    global $mngl_app_controller;
    remove_filter( 'the_content', array($mngl_app_controller, 'page_route'), 100 );
    $content = apply_filters('the_content', '<!--subscribe2-->');
    echo $content;
    add_filter( 'the_content', array($mngl_app_controller, 'page_route'), 100 );
    
    • 0
  3. Я думаю, что у вас есть небольшая ошибка в вашем коде, которая помешает ему работать:

    $content = apply_filters('the_content', '<!--subscribe2-->');
    $content = remove_filter('the_content', 'page_route');
    echo $content;
    

    Вторая строка:

    $content = remove_filter('the_content', 'page_route');
    

    положит TRUE или FALSE в $content .

    Просто замените его на

    $result_remove_filter = remove_filter('the_content', 'page_route');
    

    и попробуй еще раз.

    • 0

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

You must login to add an answer.