Úprava functions.php v odvozené šabloně

Úvodní stránka Fórum podpory WordPressu Šablony, CSS (zobrazení webu) Úprava functions.php v odvozené šabloně

Zvolené téma obsahuje celkem 7 odpovědí. Do diskuze (2 účastníci) se naposledy zapojil uživatel  admin a poslední změna je stará 6 let, 9 měsíců.

Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (z celkem 8)
  • Autor
    Příspěvky
  • #32761

    jan.rok
    Participant

    Dobrý den,
    chtěl bych se zeptat, jak se prakticky řeší situace, kdy vytvořím odvozenou šablonu a chtěl bych mj. modifikovat funkci, která je v původní šabloně v souboru functions.php.

    Když totiž v odvozené šabloně tuto funkci v souboru functions.php upravím, WordPress na to reaguje logicky chybou “Cannot redeclare nejaka_funkce() (previously declared in…”

    Popisuje se řešení, kdy se rodičovská funkce v původním functions.php zavře do
    if (! function_exist('nejaka_funkce') )

    Tomu bych rozuměl, ale při aktualizaci šablony se mnou upravený původní soubor functions.php přece přepíše, ne?

    Jak to tedy udělat, abych funkci v původní šabloně mohl nahradit mnou upravenou funkcí v odvozené šabloně a zároveň abych tuto změnu ochránil před přepisem nějakou aktualizací?

    Děkuji.
    J.R.

    #32763

    admin
    Keymaster
    Web

    Funkci se stejným názvem můžete použít pouze v případě, kdy podmínku function_exists() (pozor, na konci je písmeno s, v příkladu ho nemáte) definuje rodičovská šablona.

    Jinak je možné celou funkci přes příslušný hook odebrat a nahradit funkcí novou/upravenou. Ale ideální by to bylo vysvětlit na nějaké příkladu, klidně sem nějaký vložte…

    #32767

    jan.rok
    Participant

    V rodičovské šabloně je funkce, kterou bych rád v odvozené šabloně upravil:

    function rainforest_remove_forced_spaces( $content ) { 
        $string = htmlentities( $content, null, 'utf-8' ); 
        $content = str_replace( ' ', ' ', $string ); 
        $content = html_entity_decode( $content ); 
        return $content;     
    } 
    
    add_filter( 'the_content', 'rainforest_remove_forced_spaces', 9 );

    Podle návodu na webu jsem tedy použil hook, kdy jsem chtěl původní funkci odebrat a nahradit novou:

    function child_remove_parent_function() {
        remove_action( 'init', 'rainforest_remove_forced_spaces',8 );
    }
    
    add_action( 'wp_loaded', 'child_remove_parent_function' );
    
    function rainforest_remove_forced_spaces_NEW( $content ) { 
        $string = htmlentities( $content, null, 'utf-8' ); 
        $content = str_replace( ' ', ' ', $string ); 
        $content = html_entity_decode( $content, ENT_QUOTES, 'UTF-8' ); 
        return $content;     
    }
    add_action( 'init', 'rainforest_remove_forced_spaces_NEW' );

    Ale nefunguje mi to.

    #32768

    admin
    Keymaster
    Web

    Aha, už si vzpomínám, to je souvislost s tímto tématem :-)

    Je tam několik chyb, rodičovská šablona např. používá filtr (a nikoli akci), tedy add_filter(), který se odebírá pomocí remove_filter().

    Mělo by tedy stačit něco takového (netestováno):

    remove_filter( 'the_content', 'rainforest_remove_forced_spaces', 9 ); // Odstraníme původní funkci z rodičovské šablony...
    add_filter( 'the_content', 'rainforest_remove_forced_spaces_NEW', 9 ); // Načteme novou funkci...
    function rainforest_remove_forced_spaces_NEW( $content ) { // Definice nové funkce...

    #32769

    jan.rok
    Participant

    Nyní mám tedy:

    // Odstraníme původní funkci z rodičovské šablony...
    remove_filter( 'the_content', 'rainforest_remove_forced_spaces', 9 ); 
    
    // Načteme novou funkci...
    add_filter( 'the_content', 'rainforest_remove_forced_spaces_NEW', 9 );
    
    // Definice nové funkce...
    function rainforest_remove_forced_spaces_NEW( $content ) { 
        $string = htmlentities( $content, null, 'utf-8' ); 
        $content = str_replace( ' ', ' ', $string ); 
        $content = html_entity_decode( $content, ENT_QUOTES, 'UTF-8' ); 
        return $content;
    }
    // Konec upravy

    Bohužel to vypadá, jakoby se nová funkce neprovedla, protože české znaky jsou opět kosočtverečné :-(

    #32770

    admin
    Keymaster
    Web

    Jasné, ono je to trochu logické… První se totiž načte soubor functions.php z aktivní šablony, což je nyní naše odvozená šablona. Jenže tam odebíráme filtr, o kterém ještě WordPress neví, že bude vůbec definovaný, protože soubor functions.php z rodičovské šablony se bude načítat až následně :-) Takže musíme ten filtr odebrat až ve chvíli, kdy budou šablony kompletně načtené, k čemuž slouží např. akce after_setup_theme.

    add_action( 'after_setup_theme', 'separatista_odebrat_content_filtr' );
    function separatista_odebrat_content_filtr() {
      // Odstraníme původní funkci z rodičovské šablony...
      remove_filter( 'the_content', 'rainforest_remove_forced_spaces', 9 );
      // Načteme novou funkci...
      add_filter( 'the_content', 'rainforest_remove_forced_spaces_NEW', 9 ); 
    }
    // Definice nové funkce...
    function rainforest_remove_forced_spaces_NEW( $content ) { 
      $string = htmlentities( $content, null, 'utf-8' ); 
      $content = str_replace( ' ', ' ', $string ); 
      $content = html_entity_decode( $content, ENT_QUOTES, 'UTF-8' ); 
      return $content;
    }
    #32771

    jan.rok
    Participant

    Rozumím. Filtry a akce musím nastudovat, nicméně důležité je, že vaše rada opět zafungovala.
    Děkuji moc!

    #32797

    admin
    Keymaster
    Web

    Perfektní, není zač… Začátky jsou trochu složitější, ale až pochopíte logiku fungování WordPressu a jeho hooků, tak to začne dávat smysl :-)

Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (z celkem 8)

Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.

WordPress – novinky, návody a zajímavosti