add_filter para páginas específicas

11 sept 2011, 15:44:13
Vistas: 19.6K
Votos: 4

¿Es posible agregar este filtro

add_filter("the_content", "magicalender_get_event_page");

Pero solo para una página específica, por ejemplo

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

Si coloco la condición if dentro de la función, entonces en cualquier otra página no se muestra el contenido - y con un else posterior que muestre el contenido de la página de lo contrario encuentro problemas donde interfiere con otros plugins que también hacen cosas con

add_filter("the_content", "foo");

La función magicalender_get_event_page es la siguiente

function magicalender_get_event_page($content){
    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>
        ";
        return ''; // Devuelve cadena vacía para evitar duplicación
    }
    else{
        return $content; // Devuelve el contenido original para otras páginas
    }
}
0
Todas las respuestas a la pregunta 1
6

Es útil publicar todo tu código de filtro y callback, en lugar de solo fragmentos.

Pero sospecho que el problema es que no estás devolviendo $the_content fuera de tu condicional, por ejemplo:

function magicalendar_get_event_page( $content ) {
    if ( $post->post_name == 'magicalendarpage' ) {
        // Haz algo con $content
        return $content;
    }
}
add_filter( 'the_content', 'magicalendar_get_event_page' );

Si ese es el caso, mueve el return fuera del condicional:

function magicalendar_get_event_page( $content ) {
    if ( $post->post_name == 'magicalendarpage' ) {
        // Haz algo con $content
    }
    return $content;
}
add_filter( 'the_content', 'magicalendar_get_event_page' );

Para saber por qué/cómo está interfiriendo con otros filtros en 'the_content', probablemente necesitemos ver tu código.

EDITADO

Al menos dos problemas:

  1. No estás pasando $content como argumento a tu callback de filtro
  2. ¡NO HAGAS ECHO DE LA SALIDA DEL FILTRO! Devuélvelo. Eso muy probablemente está causando tu problema con otros filtros aplicados a the_content.

Si necesitas filtrar the_content específicamente antes o después de otros filtros, entonces añade una prioridad a tu llamada add_filter(). 10 es el valor por defecto. Usa un número menor para filtrar antes; usa un número mayor para filtrar después.

11 sept 2011 15:57:39
Comentarios

En realidad, básicamente tengo lo mismo que tú, pero el problema es que algunos plugins que hacen cosas similares a las mías (donde el $content se reemplaza con otra cosa y no se muestra realmente) hacen que los dos plugins entren en conflicto. He actualizado mi publicación para incluir toda mi función.

Stephen Cook Stephen Cook
11 sept 2011 16:19:05

@Stephen Cook - tu código ciertamente no tiene $content como argumento de la función - mira en la respuesta de @Chip Bennett function magicalendar_get_event_page( $content ) { - además, ¿por qué no consideras crear una plantilla de página para esta página?

Michael Michael
11 sept 2011 17:47:44

Una plantilla de página es posiblemente la mejor solución aquí. PD: mira la respuesta editada.

Chip Bennett Chip Bennett
11 sept 2011 22:48:08

De hecho, sí tenía $content como parámetro en mi plugin, no sé cómo encontré una copia para pegar aquí sin él. Pero gracias, intentaré usar "return" en lugar de "echo" y también una plantilla de página

Stephen Cook Stephen Cook
11 sept 2011 23:06:23

Probablemente optaría por una plantilla de Página personalizada. Si eliges esa ruta, ni siquiera necesitas llamar a the_content() (simplemente coloca tu código personalizado en lugar del Loop). De esa manera, ni siquiera tendrás que preocuparte por otros Plugins que filtren the_content.

Chip Bennett Chip Bennett
11 sept 2011 23:28:36

en realidad, necesitas poner $post como global.

Janos Szabo Janos Szabo
19 mar 2018 08:55:09
Mostrar los 1 comentarios restantes