add_filter для конкретных страниц

11 сент. 2011 г., 15:44:13
Просмотры: 19.6K
Голосов: 4

Можно ли добавить этот фильтр

add_filter("the_content", "magicalender_get_event_page");

Но только для одной конкретной страницы, например

if($post->post_name == "magicalenderpage")

Если я помещу условие if внутрь функции, то на всех других страницах контент не отображается - а с добавлением else, который выводит контент страницы в других случаях, возникают проблемы, когда это мешает работе других плагинов, которые также используют

add_filter("the_content", "foo");

Функция magicalender_get_event_page выглядит следующим образом

function magicalender_get_event_page(){
    global $wpdb;
    global $post;

    if($post->post_name == "magicalenderpage"){
        echo "<div class=\"magi_calender\">";
        for($i = 0; $event = $wpdb->get_row("SELECT * FROM ".$wpdb->prefix."magicalender", ARRAY_A, $i); $i++){
            echo"
                <div class=\"event\">
                    <h1>".$event['event']."</h1>
                    <h2>".date('m/d/Y', strtotime($event['dmy']))."</h2>
                    <div>".str_replace("&amp;", "&", str_replace("&#39;", "'", str_replace("&#34;", "\"", $event['desc'])))."</div>
                </div>
            ";
        }
        echo "</div>";

        $o = $wpdb->get_row("SELECT * FROM ".$wpdb->prefix."magioptions", ARRAY_A);
        echo"
            <script type=\"text/javascript\">
                var priority = '".$o['dm']."';
                var customDays = new Array('".$o['monday']."', '".$o['tuesday']."', '".$o['wednesday']."', '".$o['thursday']."', '".$o['friday']."', '".$o['saturday']."', '".$o['sunday']."');
                var customMonths = new Array('".$o['january']."', '".$o['february']."', '".$o['march']."', '".$o['april']."', '".$o['may']."', '".$o['june']."', '".$o['july']."', '".$o['august']."', '".$o['september']."', '".$o['october']."', '".$o['november']."', '".$o['december']."');
                var customMonthsShort = new Array('".$o['jan']."', '".$o['feb']."', '".$o['mar']."', '".$o['apr']."', '".$o['ma']."', '".$o['jun']."', '".$o['jul']."', '".$o['aug']."', '".$o['sep']."', '".$o['oct']."', '".$o['nov']."', '".$o['dec']."');
                jQuery(\".magi_calender\").magiCalender(priority, customDays, customMonths, customMonthsShort);
            </script>
        ";
    }
    else{
        return $content;
    }
}
0
Все ответы на вопрос 1
6

Полезно публиковать весь код фильтра и функции обратного вызова, а не только его части.

Однако, я подозреваю, что проблема в том, что вы не возвращаете $the_content за пределами вашего условия, например:

function magicalendar_get_event_page( $content ) {
    if ( $post->post_name == 'magicalendarpage' ) {
        // Делаем что-то с $content
        return $content;
    }
}
add_filter( 'the_content', 'magicalendar_get_event_page' );

Если это так, переместите возврат за пределы условия:

function magicalendar_get_event_page( $content ) {
    if ( $post->post_name == 'magicalendarpage' ) {
        // Делаем что-то с $content
    }
    return $content;
}
add_filter( 'the_content', 'magicalendar_get_event_page' );

Чтобы понять, почему/как это мешает другим фильтрам на 'the_content', нам, вероятно, нужно увидеть ваш код.

РЕДАКТИРОВАНИЕ

Как минимум две проблемы:

  1. Вы не передаете $content в качестве аргумента вашей функции обратного вызова фильтра
  2. НЕ ВЫВОДИТЕ РЕЗУЛЬТАТ ФИЛЬТРА ЧЕРЕЗ ECHO! Возвращайте его. Это очень вероятно вызывает вашу проблему с другими фильтрами, примененными к the_content.

Если вам нужно фильтровать the_content конкретно до или после других фильтров, то добавьте приоритет в ваш вызов add_filter(). 10 — значение по умолчанию. Используйте меньшее число для фильтрации раньше; используйте большее число для фильтрации позже.

11 сент. 2011 г. 15:57:39
Комментарии

Фактически у меня есть почти то же самое, что и у вас, но проблема в том, что некоторые плагины делают похожие вещи (когда $content заменяется на что-то другое и не отображается), и тогда два плагина конфликтуют. Я обновил свой пост, включив в него всю свою функцию.

Stephen Cook Stephen Cook
11 сент. 2011 г. 16:19:05

@Stephen Cook - в вашем коде точно нет $content в качестве аргумента функции - смотрите в ответе @Chip Bennett function magicalendar_get_event_page( $content ) { - также, почему бы вам не рассмотреть возможность создания шаблона страницы для этой страницы?

Michael Michael
11 сент. 2011 г. 17:47:44

Шаблон страницы, вполне возможно, является правильным решением в данном случае. P.S. см. отредактированный ответ.

Chip Bennett Chip Bennett
11 сент. 2011 г. 22:48:08

У меня действительно был параметр $content в моём плагине, не знаю как я нашел копию для вставки здесь без него. Но спасибо, я попробую использовать "return" вместо "echo" и также шаблон страницы

Stephen Cook Stephen Cook
11 сент. 2011 г. 23:06:23

Я бы, вероятно, выбрал пользовательский шаблон страницы. Если пойти этим путем, вам даже не придется вызывать the_content() (просто разместите ваш пользовательский код вместо цикла). Таким образом, вам даже не нужно беспокоиться о других плагинах, фильтрующих the_content.

Chip Bennett Chip Bennett
11 сент. 2011 г. 23:28:36

на самом деле, нужно объявить $post как глобальную переменную.

Janos Szabo Janos Szabo
19 мар. 2018 г. 08:55:09
Показать остальные 1 комментариев