Úvodní stránka › Fórum podpory WordPressu › Šablony, CSS (zobrazení webu) › Úprava functions.php v odvozené šabloně
Štítky: add_filter, after_setup_theme, functions.php, function_exists(), Odvozená šablona, remove_filter(), the_content()
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á 7 let, 4 měsíce.
-
AutorPříspěvky
-
1. června 2017 (20:42) #32761
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 souborufunctions.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.2. června 2017 (9:11) #32763Funkci 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…
2. června 2017 (10:00) #32767V 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.
2. června 2017 (10:14) #32768Aha, 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...
2. června 2017 (10:34) #32769Nyní 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é :-(
2. června 2017 (10:59) #32770Jasné, 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 souborfunctions.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; }
2. června 2017 (11:10) #32771Rozumím. Filtry a akce musím nastudovat, nicméně důležité je, že vaše rada opět zafungovala.
Děkuji moc!5. června 2017 (14:52) #32797 -
AutorPříspěvky
Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.