Fișierele PHP din tema copil nu suprascriu fișierele PHP din tema părinte

7 apr. 2016, 01:30:01
Vizualizări: 26.9K
Voturi: 12

Am un fișier php localizat la:

.../wp-content/themes/kallyas-child/pagebuilder/elements/TH_TeamBox/TH_TeamBox.php

Încerc să folosesc fișierul de mai sus pentru a suprascrie fișierul TH_TeamBox.php din tema părinte care se găsește aici:

.../wp-content/themes/kallyas/pagebuilder/elements/TH_TeamBox/TH_TeamBox.php

Tema mea copil este activă și am creat calea fișierului în tema copil pentru a imita tema părinte. Credeam că dacă fac acest lucru voi putea edita fișierele PHP după bunul plac în tema copil fără să-mi pierd modificările când actualizez tema părinte.

Dezvolt de ceva vreme, dar după cum puteți vedea sunt mai nou(ă) în WordPress. Orice informație despre motivul pentru care fișierul .php din tema copil nu suprascrie fișierul .php din tema părinte ar fi foarte apreciată. Aș fi bucuros(oasă) să ofer orice altă informație de care ați putea avea nevoie pentru a mă ajuta, mulțumesc! : )

3
Comentarii

Greu de știut fără a ști ce conține fișierul. Presupun că acel fișier este sau este încapsulat într-o clasă PHP. Dacă este cazul, poți încerca să extinzi clasa. Dacă nu funcționează, poți experimenta cu add_action, remove_action și priorități, dar depinde mult de cum este aranjat în tema părinte.

Luis Sanz Luis Sanz
7 apr. 2016 01:47:14

Nu-mi imaginez că extinderea clasei ar funcționa. Dacă clasa C (copil) extinde P (părinte), atunci un obiect de tip C va avea tot ce are P, dar P nu va avea nimic din C, iar tema va folosi implicit P chiar și când tema copil este activă. Voi investiga hook-urile de acțiune. Mulțumesc că ai răspuns la discuția mea, apreciez.

domdambrogia domdambrogia
19 apr. 2016 18:41:05

Ar putea fi o problemă cu permisiunile fișierelor. Asigură-te că toate permisiunile sunt configurate corespunzător pentru ca procesul serverului să le poată citi.

Flimm Flimm
3 dec. 2024 12:08:15
Toate răspunsurile la întrebare 4
2
18

Temele copil pot suprascrie șabloanele, nu doar fișiere PHP arbitrare.

În WordPress, o temă este formată dintr-un set de fișiere PHP care sunt folosite ca Șabloane. Puteți găsi o listă cu aceste fișiere în Ierarhia Șabloanelor.

Acele fișiere șablon specifice pot fi suprascrise cu altele noi, dar dacă tema părinte nu are mecanisme speciale pentru a suprascrie alte fișiere, atunci fișierele incluse pur și simplu de către părinte ca parte a unei structuri de suport sau ca biblioteci pentru o bucată de cod a unui constructor de pagini nu pot fi suprascrise în acest mod.

7 apr. 2016 01:34:35
Comentarii

Nu era ceea ce voiam să aud, dar mulțumesc pentru informație. Apreciez asta.

domdambrogia domdambrogia
19 apr. 2016 18:34:09

Aici sunt menționate o serie de funcții utile care ajută la suprascrierea fișierelor unei teme părinte. (Totuși, este necesară o mică modificare în fișierul temei părinte. Din câte știu, este imposibil să evităm 100% acest lucru.) Verificați acestea: locate_template(), get_theme_file_path().

Viktor Borítás Viktor Borítás
13 oct. 2020 20:41:42
1

Soluția este să mutați modificările necesare în fișierul functions.php al temei child.

Dacă este vorba despre o funcție, de obicei va exista o instrucțiune if care verifică dacă este deja declarată. În acest caz, puteți copia funcția în functions.php cu același nume și faceți modificările necesare - aceasta va avea prioritate față de celelalte fișiere ale temei. Dacă funcția a fost declarată fără o instrucțiune if, atunci trebuie să-i schimbați numele în functions.php, să găsiți fișierul template unde este apelată funcția, să-l copiați în tema child și să modificați apelul funcției în acel fișier.

Dacă este vorba despre un widget, copiați întreaga declarație de clasă în functions.php, schimbați-i numele și faceți celelalte modificări. Asigurați-vă că înregistrați noul widget și îl veți găsi disponibil în zona de widget-uri cu noul nume și modificările aduse.

1 apr. 2018 15:58:30
Comentarii

Mulțumesc pentru contribuția ta. La momentul întrebării, nu căutam cum să suprascriu o funcție, ci mai degrabă cum să suprascriu un fișier. De asemenea, răspunsul corect a fost oferit de Otto. Cu excepția cazului în care există o funcție de șablon personalizată pe care o poți filtra (cum ar fi wc_get_template din WooCommerce), doar fișierele principale de șablon (header.php, footer.php, page.php etc.) pot fi suprascrise.

domdambrogia domdambrogia
1 apr. 2018 21:17:05
0

Am o soluție pentru tine care poate fi mai bună decât simpla modificare a fișierelor din tema părinte, lucru care nu este de dorit din motivele menționate de Otto.

Dacă adaugi aceste două linii de PHP la începutul oricărui fișier pe care dorești să-l modifici în structura temei copil:

<?php
    $filepath = str_replace(get_option('template'), get_option('stylesheet'), __FILE__);
    if (file_exists($filepath)) {include($filepath); return;}
?>

Desigur, va trebui să faci acest lucru din nou pentru fiecare fișier după actualizarea temei, așa că recomandarea este să ții evidența acestor fișiere și probabil să nu mai actualizezi tema direct, ci să o descarci, să adaugi aceste linii local și să încarci copia actualizată prin FTP.

Poate părea că nu merită efortul, dar ceea ce face este să îți permită să păstrezi fișierele personalizate împreună în structura temei copil, fără a fi suprascrise de actualizările temei. Din nou, va trebui doar să readaugi aceste linii la începutul oricărui fișier părinte pe care dorești să-l suprascrii.

De asemenea, înseamnă că poți elimina copia modificată a fișierului de funcții din tema copil fără a afecta site-ul (de exemplu, pentru a testa împotriva unui fișier actualizat al temei) - deoarece acest lucru va reveni la fișierul original dacă nu este găsită o copie modificată.

(CEM Corectare Tipografică: a înlocuit primul apel get_options cu get_option.)

7 apr. 2016 10:51:14
1

Am folosit o altă abordare: în fișierul functions.php al temei mele copil, am suprascris fișierul țintă din tema părinte pe care vreau să-l înlocuiesc.

require(get_parent_theme_file_path() . "-child/include/header-content.php");
30 mai 2023 19:30:34
Comentarii

Nu pare să funcționeze dacă fișierul header-content.php include o linie precum class Thing extends Thing_Base {

Jay Jay
3 aug. 2024 07:41:40