add_filter per pagine specifiche

11 set 2011, 15:44:13
Visualizzazioni: 19.6K
Voti: 4

È possibile aggiungere questo filtro

add_filter("the_content", "magicalender_get_event_page");

Ma solo per una pagina specifica, ad esempio

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

Se metto l'istruzione if all'interno della funzione, su tutte le altre pagine il contenuto non viene visualizzato - e con un'istruzione else che restituisce il contenuto della pagina altrimenti incontro problemi in cui interferisce con altri plugin che fanno anche loro operazioni con

add_filter("the_content", "foo");

La funzione magicalender_get_event_page è la seguente

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
Tutte le risposte alla domanda 1
6

È utile pubblicare l'intero codice del filtro e della callback, piuttosto che solo frammenti.

Ma sospetto che il problema sia che non stai restituendo $the_content al di fuori del tuo condizionale, ad esempio:

function magicalendar_get_event_page( $content ) {
    if ( $post->post_name == 'magicalendarpage' ) {
        // Fai qualcosa a $content
        return $content;
    }
}
add_filter( 'the_content', 'magicalendar_get_event_page' );

Se è così, sposta il return fuori dal condizionale:

function magicalendar_get_event_page( $content ) {
    if ( $post->post_name == 'magicalendarpage' ) {
        // Fai qualcosa a $content
    }
    return $content;
}
add_filter( 'the_content', 'magicalendar_get_event_page' );

Per capire perché/come interferisce con altri filtri su 'the_content', probabilmente abbiamo bisogno di vedere il tuo codice.

MODIFICA

Almeno due problemi:

  1. Non stai passando $content come argomento alla tua callback del filtro
  2. NON FARE ECHO DELL'OUTPUT DEL FILTRO! Restituiscilo. Questo è molto probabilmente la causa del tuo problema con altri filtri applicati a the_content.

Se hai bisogno di filtrare the_content specificamente prima o dopo altri filtri, allora aggiungi una priorità alla tua chiamata add_filter(). 10 è il valore predefinito. Usa un numero più basso per filtrare prima; usa un numero più alto per filtrare dopo.

11 set 2011 15:57:39
Commenti

In realtà ho praticamente quello che hai tu, ma il problema è che alcuni plugin che fanno cose simili al mio (dove il $content viene sostituito con qualcos'altro e non viene effettivamente mostrato) fanno sì che i due plugin entrino in conflitto. Ho aggiornato il mio post per includere tutta la mia funzione.

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

@Stephen Cook - il tuo codice certamente non ha $content come argomento della funzione - vedi nella risposta di @Chip Bennett function magicalendar_get_event_page( $content ) { - inoltre, perché non consideri di creare un page template per questa pagina?

Michael Michael
11 set 2011 17:47:44

Un Page Template è probabilmente la strada giusta da seguire qui. P.S. vedi risposta modificata.

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

In realtà avevo $content come parametro nel mio plug-in, non so come ho trovato una copia da incollare qui senza di esso. Ma grazie, proverò a usare "return" invece di "echo" e anche un template di pagina

Stephen Cook Stephen Cook
11 set 2011 23:06:23

Probabilmente opterei per un template di pagina personalizzato. Se scegli questa strada, non devi nemmeno chiamare the_content() (basta inserire il tuo codice personalizzato al posto del Loop). In questo modo, non devi nemmeno preoccuparti di altri Plugin che filtrano the_content.

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

in realtà, bisogna rendere $post globale.

Janos Szabo Janos Szabo
19 mar 2018 08:55:09
Mostra i restanti 1 commenti