Afișarea unui sidebar dinamic cu widget-uri specifice pe o anumită pagină
Mi s-a predat un site WordPress la jumătatea finalizării. A trecut cel puțin un an de când am lucrat ultima dată cu WordPress și găsesc multe lucruri diferite. Modul în care eram obișnuit să afișez conținut diferit pe pagini diferite era să creez șabloane de pagină pentru fiecare pagină care necesită conținut unic.
Încerc să afișez un sidebar diferit pe o anumită pagină față de restul site-ului. Ceea ce aș fi făcut acum un an ar fi să creez un șablon de pagină și să fac un nou fișier sidebar pe care să-l includ în șablonul paginii. Am descoperit că acest lucru nu funcționează. Principalele probleme pe care le pot vedea sunt loop.php
și loop-page.php
, care nu existau în tema simplificată pe care o foloseam de obicei când construiam un site în trecut. Cu toate acestea, se pare că cine a lucrat înainte la acest proiect a copiat tema 'twenty ten' și a făcut modificări sub un nume nou.
Am înregistrat un nou sidebar dinamic în functions.php
al temei și îl pot vedea în secțiunea Widgets din Dashboard și pot adăuga widget-uri la acesta.
Nu reușesc însă să-l afișez pe pagina dorită. Am încercat următoarele:
1.) Am dat paginii un șablon personalizat template_news.php
și am plasat următorul cod unde ar trebui apelat sidebar-ul:
include ('sidebar-news.php');
Fișierul sidebar-news.php
conține codul copiat din sidebar.php
cu ID-ul sidebar-ului "News" pe care l-am listat în functions.php
:
<?php if ( is_active_sidebar( 'sidebar-news' ) ) : ?>
<div id="secondary" class="widget-area" role="complementary">
<ul class="xoxo">
<?php dynamic_sidebar( 'sidebar-news' ); ?>
</ul>
</div>
<?php endif; ?>
Șablonul paginii este aplicat paginii corecte.
2.) Am modificat în page.php
din:
<?php get_sidebar(); ?>
în:
<?php
if(is_page('18')) {
include ('sidebar-news.php');
}
else {
get_sidebar();
} ?>
Am verificat de mai multe ori pentru a mă asigura că ID-ul paginii este corect și am încercat să folosesc și slug-ul în loc de ID, dar fără succes.
3.) Am încercat codul anterior în loop-page.php
4.) Am plasat următoarea declarație condițională în sidebar.php
:
<?php
if ( is_active_sidebar( 'sidebar-news' ) && is_page('18') ) : ?>
<div id="sidebarnews" class="widget-area" role="complementary">
<ul class="xoxo">
<?php dynamic_sidebar( 'sidebar-news' ); ?>
</ul>
</div>
<?php endif; ?>
De asemenea, după ce am făcut cercetări și am aflat că modul corect de a extinde sau modifica funcționalitatea unei teme este să creez o temă copil, am încercat să fac asta, dar a cauzat unele probleme pe care nu am timp să încerc să le rezolv.
Am descoperit că sidebar.php
implicit este apelat și afișat pe pagină, totuși, chiar dacă declarația mea condițională cu ID-ul paginii este prezentă, nu afișează widget-urile sidebar-ului personalizat.
De asemenea, nu pot găsi cum este apelat sidebar-ul implicit pe pagină deoarece eliminarea completă a get_sidebar();
din șablonul meu personalizat template_news.php
, page.php
sau loop-page.php
nu pare să aibă niciun efect.
Vă rog să mă ajutați să înțeleg cum pot adăuga acest sidebar pe pagină.

Cred că ai nevoie pur și simplu să apelezi register_sidebar()
într-un hook 'widgets_init'
. Tema TwentyTen are exemple pentru register_sidebar()
în fișierul său functions.php
, dar iată cum ar putea arăta:
add_action( 'widgets_init', 'twentyten_widgets_init' );
function twentyten_widgets_init() {
register_sidebar( array(
'name' => __( 'Bara laterală știri', 'yoursite' ),
'id' => 'sidebar-news',
'description' => __( 'Zona barei laterale pentru știri', 'yoursite' ),
'before_widget' => '<li id="%1$s" class="widget-container %2$s">',
'after_widget' => '</li>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>',
));
/*
* RESTUL CODULUI DE ÎNREGISTRARE A BAREI LATERALE DIN twentyten_widgets_init() SE ADĂUGĂ AICI
*/
}
De asemenea, în șablonul tău de pagină template_news.php
folosește următorul cod pentru a apela bara ta laterală, care va încărca fișierul sidebar-news.php
pe care l-ai creat mai sus:
<?php get_sidebar( 'news' ); ?>
Nu ar trebui să ai nevoie de celelalte încercări pe care le-ai făcut, și cu siguranță nu de niciun include
.

Am făcut deja asta. A fost primul lucru pe care l-am încercat exact cum ai descris. Totuși, nu funcționează. Codul din șablonul meu personalizat pentru conținut și bara laterală este suprascris de setările implicite din loop.php
și loop-page.php
.

@jlego - Hmm. Am testat soluția inițială cu TwentyEleven și am retestat acum cu TwentyTen și funcționează. loop.php
și loop-page.php
nu au nicio legătură cu generarea barei laterale, decât dacă celălalt developer a făcut niște modificări foarte ciudate. Poți să actualizezi întrebarea ta și să postezi acele două fișiere, precum și conținutul fișierului tău template_news.php
?

@jlego - De asemenea, dacă nu ai PhpStorm + Zend Debugger în setul tău de unelte, ai putea să iei în considerare obținerea unei copii. Cu acesta, ai putea să urmărești site-ul linie cu linie și să vezi exact de ce funcționează sau nu funcționează.

Era extrem de frustrant pentru mine, pentru că știam că asta ar trebui să funcționeze și verificasem toate variabilele pentru a mă asigura că am setat corect template-ul și nu aveam greșeli în cod. S-a dovedit că cine a lucrat la el înaintea mea a reușit să afișeze o listă de bloguri pe pagină prin setarea acelei pagini specifice ca pagină de "articole" în administrarea WordPress. Așa că, atunci când am încercat să creez un template personalizat, acea setare suprascria template-ul meu și forța pagina să ruleze codul din acele fișiere. Oricum, mulțumesc pentru ajutor. Voi încerca PHPStorm și Zend Debugger.

Chiar dacă aceasta nu a rezolvat problema specifică pe care o aveam, aceasta este metoda corectă de a adăuga o bară laterală pe pagină. Cred că soluția reală la problema mea era specifică cazului meu, așa că îți marchez răspunsul ca soluție la această întrebare, având în vedere numărul mare de vizualizări pe care le are întrebarea.

Pentru a afișa un widget doar pe anumite pagini, unde toate paginile tale au aceeași bară laterală, poți folosi unul dintre aceste plugin-uri:
Pur și simplu ascunde widget-urile pe paginile specificate. Adaugă casete de bifat la fiecare widget pentru a-l afișa sau ascunde pe fiecare pagină a site-ului.
Widget Logic îți permite să controlezi pe ce pagini apar widget-urile folosind tag-urile condiționale ale WordPress. De asemenea, adaugă un filtru 'widget_content'.

De asemenea, un alt plugin excelent pentru aceasta este https://wordpress.org/plugins/dynamic-widgets/
