Modifică dinamic the_title() pentru o pagină

28 ian. 2013, 23:39:36
Vizualizări: 21K
Voturi: 11

Dezvolt un plugin care nu folosește un tip de postare personalizat, ci tabele separate în baza de date. Este un plugin care afișează o listă de cursuri cu linkuri care duc către diferite pagini cu detalii despre cursuri, unde utilizatorul poate apoi să se înscrie la un curs.

În starea actuală, folosesc un shortcode pentru a introduce datele pluginului într-o pagină cu un șablon de pagină personalizat (page-courses.php).

Acum vreau să modific the_title() în mod dinamic, în funcție de pagina pe care o afișează pluginul (lista de cursuri, pagina cu detalii despre curs cu formulare, pagina de succes pentru trimiterea formularului). Dar ori de câte ori fac asta cu următorul filtru, și linkurile către alte pagini din footer se modifică:

<?php
 
add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Titlu Personalizat';
}

Editare

În footer.php am o funcție care include linkuri de footer cu wp_nav_menu() astfel încât să le pot defini în Aspect > Meniuri. Dar cu filtrul de mai sus, toate linkurile din footer se schimbă și ele în 'Titlu Personalizat'. Dar vreau doar să schimb titlul paginii, fără a afecta linkurile din meniu din footer.

Încercând să adaug o etichetă condițională in_the_loop() linkurile din footer sunt încă afectate, deși nu sunt în buclă.

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    if ( in_the_loop() ) {
        add_filter( 'the_title', 'custom_page_title' );
    }
}

function custom_page_title() {
    return 'Titlu Personalizat';
}

Este similar cu această întrebare: problemă cu filtrul the_title în nav, doar că linkurile afectate sunt în footer și in_the_loop() nu funcționează.

Cum pot modifica the_title() afectând doar titlul paginii curente afișate fără a afecta linkurile din footer?

Editare 2 - Soluție

În final am reușit să-l fac să funcționeze:

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
}

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-listcourses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Titlu Personalizat';
    }
    return $title;
}

Fișierul page-listcourses.php este un Șablon de Pagină Personalizat pe care l-am atribuit paginii statice numite 'Cursuri'.

Presupun că nu a funcționat înainte deoarece numele paginii statice și numele fișierului Șablonului de Pagină Personalizat erau identice.

5
Comentarii

De ce creezi propriile tabele de baze de date? Viața ta ar fi mult mai simplă dacă ai implementa conținutul personalizat ca un Custom Post Type.

Chip Bennett Chip Bennett
29 ian. 2013 17:10:30

De fapt, mă gândeam că această întrebare va apărea. Dezvolt acest plugin pentru a învăța WordPress, așa că la început nu știam despre Custom Post Types. Am două tabele de baze de date, unul pentru cursuri și unul pentru categoriile de cursuri. O categorie poate avea mai multe cursuri, așa că cele două tabele sunt legate. Nu cred că este atât de ușor să realizezi asta cu Custom Post Types. Sigur, aș putea folosi Custom Taxonomies pentru cursuri, dar ar trebui să adaug mai multe câmpuri, deoarece o categorie de cursuri nu are doar nume. Momentan, este mult mai ușor să fac asta cu tabele personalizate de baze de date.

Gchtr Gchtr
29 ian. 2013 21:23:21

Cazul tău de utilizare este exact cazul intenționat pentru Custom Post Types și Custom Taxonomies. S-ar putea să subestimezi eleganța, flexibilitatea și puterea CPT-urilor și a Taxonomiilor Personalizate.

Chip Bennett Chip Bennett
29 ian. 2013 21:25:52

Este într-adevăr posibil să am nevoie. Probabil ar trebui doar să încerc. Mulțumesc pentru sfat.

Gchtr Gchtr
29 ian. 2013 21:30:09

in_the_loop() este setat la true ori de câte ori este apelat the_post(). Fără a intra prea adânc în nucleu și știind că meniurile de navigare sunt în sine bucle, presupun că undeva pe parcurs, wp_nav_menu() inițializează o buclă, cauzând ca in_the_loop() să returneze true.

Chip Bennett Chip Bennett
30 ian. 2013 16:22:06
Toate răspunsurile la întrebare 4
9

Aș folosi condiția is_page_template():

if ( is_page_template( 'page-courses.php' ) ) {
    // Pagina curentă folosește
    // șablonul personalizat;
    // fă ceva
}

Editare

Ați folosi această condiție în interiorul funcției de callback a filtrului:

function wpse83525_filter_the_title( $title ) {
    if ( is_page_template( 'page-courses.php' ) ) {
        return 'Titlu Personalizat';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Acum, pentru a izola doar titlurile paginilor care folosesc șablonul dvs., puteți profita de celălalt parametru transmis la the_title: $id. Deoarece cunoașteți ID-ul postării pentru care se filtrează titlul, puteți interoga metadatele postului _wp_page_template și vă asigurați că acesta este egal cu șablonul dvs. de pagină:

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Titlu Personalizat';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );

Editare 2

Dacă doriți să țintiți pagina "Cursuri" în mod specific, utilizați is_page() cu slug-ul paginii 'courses', sau titlul paginii 'Cursuri':

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Cursuri' ) ) {
        return 'Titlu Personalizat';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Cu toate acestea, aș recomanda schimbarea page-courses.php într-un Șablon de Pagină Personalizat, ceea ce ar face întregul proces mult mai robust.

29 ian. 2013 17:09:43
Comentarii

Asta nu a funcționat deocamdată. Dar am rafinat întrebarea mea, pentru că poate nu a fost suficient de specifică. Poate problema se află altundeva.

Gchtr Gchtr
30 ian. 2013 15:46:35

Ce înțelegi prin "asta nu a funcționat deocamdată"? Ce exact ai încercat? Ce te așteptai să se întâmple, dar nu s-a întâmplat, sau ce s-a întâmplat neașteptat?

Chip Bennett Chip Bennett
30 ian. 2013 16:05:09

Vezi răspunsul actualizat, care ar trebui să rezolve problemele cu titlurile elementelor din meniul de navigare.

Chip Bennett Chip Bennett
30 ian. 2013 16:31:43

Am spus asta pentru că cred că răspunsul tău ar putea fi cel corect (îndreptând în direcția bună), dar poate nu mi-am pus întrebarea suficient de clar. get_post_meta( $id, '_wp_page_template', true ) returnează default și nu știu ce să fac cu asta. Când setez 'page-courses.php' la 'default', toate linkurile din navigație se schimbă, cu excepția când conectez filtrul the_title la loop_start, atunci doar linkurile din footer se schimbă. Am verificat ce fișier de template este folosit, și este 'page-courses.php' și nu 'page.php' (pe care credeam că ar putea fi cel implicit).

Gchtr Gchtr
30 ian. 2013 17:46:42

Deci, "Courses" este numele paginii tale statice?

Chip Bennett Chip Bennett
30 ian. 2013 18:24:30

Da, acesta este numele paginii statice.

Gchtr Gchtr
30 ian. 2013 18:37:57

Vezi răspunsul actualizat. Poți direcționa o pagină după titlul sau slug-ul ei, folosind is_page().

Chip Bennett Chip Bennett
30 ian. 2013 18:51:07

Am reușit să fac să funcționeze acum. Vezi primul post cu întrebarea pentru a vedea ce am făcut. Fișierul page-courses.php a fost întotdeauna un Șablon de Pagină Personalizat. Presupun că nu a funcționat înainte pentru că numele paginii statice și numele fișierului Șablonului de Postare Personalizat erau la fel. Mulțumesc pentru eforturile tale!

Gchtr Gchtr
30 ian. 2013 19:11:27

Pentru referință viitoare: recomand să nu denumești șabloanele de pagini personalizate ca page-foobar.php, tocmai din acest motiv. Eu folosesc template-foobar.php în schimb.

Chip Bennett Chip Bennett
30 ian. 2013 19:16:58
Arată celelalte 4 comentarii
3

În timp ce funcția is_page_template() va funcționa, prefer să pun acest tip de cod în template-ul paginii în sine pentru a avea tot codul care generează acest tip de pagină într-un singur fișier.

29 ian. 2013 18:58:58
Comentarii

Cum ar funcționa asta, plecând de la ipoteza că codul în cauză folosește the_title()? Exemple de cod?

Chip Bennett Chip Bennett
29 ian. 2013 19:54:19

@ChipBennett, nu înțeleg întrebarea. Dacă are nevoie ca filtrul să se aplice doar pentru pagina cu un anumit template, atunci poate plasa același cod în template înainte de apelul la get_header().

Mark Kaplun Mark Kaplun
29 ian. 2013 21:25:09

Da, de fapt cred și eu că asta ar funcționa. Totuși, cred că ar trebui să fac un ocol prin setarea unei variabile în plugin care să fie disponibilă în query_vars? Deci pentru mine, filtrul the_title este o soluție mai elegantă.

Gchtr Gchtr
30 ian. 2013 19:19:45
0

Dacă dorești să editezi doar titlul paginii curente, folosește condiția in_the_loop(), ca în exemplul următor:

add_filter( 'the_title', 'modify_onpage_title', 10, 2);

function modity_onpage_title( $title , $id = null ) {

    if(!in_the_loop()){
        // întoarce rezultatul imediat dacă nu este relevant (ca în cazul meniurilor personalizate)
        return $title;
    }

    // Modifică titlul după preferințe
    $title = "Yolo! ". $title;
    return $title;
}
8 nov. 2016 14:08:32
0

Încearcă să folosești etichete condiționale pentru a te asigura că the_title() este modificat doar pe paginile dorite.

29 ian. 2013 16:50:06