किसी पृष्ठ के the_title () को गतिशील रूप से बदलें


9

मैं एक प्लगइन विकसित कर रहा हूं जो एक कस्टम पोस्ट प्रकार का उपयोग नहीं करता है, लेकिन अलग-अलग डेटाबेस टेबल। यह एक प्लगइन है जो लिंक के साथ पाठ्यक्रमों की एक सूची प्रदर्शित करता है जो अलग-अलग पाठ्यक्रम के विवरण पृष्ठों की ओर जाता है, जहां उपयोगकर्ता तब एक कोर्स के लिए सदस्यता ले सकते हैं।

वर्तमान स्थिति में, मैं कस्टम पेज टेम्प्लेट (पृष्ठ- courses.php) के साथ पृष्ठ में प्लग इन डेटा प्राप्त करने के लिए एक शोर्ट का उपयोग कर रहा हूं।

अब मैं the_title()गतिशील रूप से उस पृष्ठ के अनुसार बदलना चाहता हूं , जो प्लगइन दिखाता है (पाठ्यक्रमों की सूची, प्रपत्रों के साथ पाठ्यक्रम विवरण पृष्ठ, फॉर्म जमा सफलता पृष्ठ)। लेकिन जब भी मैं निम्नलिखित फ़िल्टर के साथ करता हूं, पाद लेख के अन्य पृष्ठों के लिंक भी बदल जाते हैं:

<?php

add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Custom Title';
}

संपादित करें

Footer.php में मेरे पास एक फ़ंक्शन है जिसमें पाद लिंक शामिल हैं wp_nav_menu()ताकि मैं उन्हें उपस्थिति> मेनू में परिभाषित कर सकूं। लेकिन ऊपर दिए गए फिल्टर के साथ, पाद लेख के सभी लिंक भी 'कस्टम शीर्षक' में बदल जाते हैं। लेकिन मैं केवल पृष्ठ के शीर्षक को बदलना चाहता हूं, पाद लेख में मेनू लिंक को प्रभावित नहीं कर रहा हूं।

सशर्त टैग जोड़ने की कोशिश कर रहा है in_the_loop()पाद लेख लिंक अभी भी प्रभावित हैं, हालांकि वे लूप में नहीं हैं।

<?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 'Custom Title';
}

यह इस प्रश्न के समान है: नौसेना में the_title समस्या को फ़िल्टर करें , बस प्रभावित लिंक पाद लेख में हैं और in_the_loop()काम नहीं करता है।

the_title()केवल पाद लेख के लिंक को प्रभावित नहीं करते हुए वर्तमान पृष्ठ के शीर्षक को प्रभावित करते हुए मैं कैसे बदल सकता हूं ?

2 संपादित करें - समाधान

इसलिए मैंने आखिरकार इसे काम कर लिया:

<?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 'Custom Title';
    }
    return $title;
}

फ़ाइल पृष्ठ-listcourses.php एक कस्टम पोस्ट टेम्प्लेट है जिसे मैंने 'पाठ्यक्रम' नाम के स्थिर पृष्ठ को सौंपा है।

मुझे लगता है कि इससे पहले यह काम नहीं किया था क्योंकि कस्टम पेज का नाम और कस्टम पोस्ट टेम्पलेट का नाम एक ही था।


1
आप अपने स्वयं के डेटाबेस तालिकाओं को क्यों रोल कर रहे हैं? यदि आप अपनी कस्टम सामग्री को कस्टम पोस्ट प्रकार के रूप में लागू करते हैं तो आपका जीवन बहुत सरल हो जाएगा ।
चिप बेनेट

मैंने वास्तव में सोचा था कि यह प्रश्न आएगा। मैं वर्डप्रेस को जानने के लिए इस प्लगइन को विकसित करता हूं, इसलिए मैंने पहले कस्टम पोस्ट प्रकारों के बारे में नहीं जाना। मेरे पास दो डेटाबेस टेबल हैं, एक पाठ्यक्रम के लिए और एक पाठ्यक्रम श्रेणियों के लिए। एक श्रेणी में कई पाठ्यक्रम हो सकते हैं, इसलिए दो तालिकाएं जुड़ी हुई हैं। मुझे नहीं लगता कि कस्टम पोस्ट प्रकारों के साथ इसे पूरा करना आसान है। निश्चित रूप से मैं पाठ्यक्रमों के लिए कस्टम टैक्सोनॉमीज़ का उपयोग कर सकता हूं, लेकिन मुझे अधिक फ़ील्ड जोड़ना होगा, क्योंकि एक कोर्स श्रेणी में सिर्फ नाम नहीं है। अभी के लिए यह कस्टम डेटाबेस तालिकाओं के साथ करना बहुत आसान है।
गच्छत्र

1
आपका उपयोग का मामला कस्टम पोस्ट प्रकार और कस्टम वर्गीकरण के लिए सटीक, इच्छित उपयोग का मामला है । आप CPT और कस्टम टैक्सोनॉमी की लालित्य, लचीलेपन और शक्ति को गलत समझ सकते हैं ।
चिप बेनेट

यह वास्तव में संभव है कि मैं करूँ। मुझे शायद बस कोशिश करनी चाहिए। सलाह के लिए धन्यवाद।
गच्छत्र

in_the_loop()trueजब भी the_post()निकाल दिया जाता है तब सेट किया जाता है। बहुत गहराई से खोदने के बिना, और यह जानते हुए कि नौसेना मेनू स्वयं लूप हैं , मैं अनुमान लगा रहा हूं कि रास्ते में कहीं भी, wp_nav_menu()एक लूप को इंस्टेंट करता है, जिससे in_the_loop()वापसी होती है true
चिप बेनेट

जवाबों:


5

मैं is_page_template()सशर्त का उपयोग करूंगा :

if ( is_page_template( 'page-courses.php' ) ) {
    // The current page uses your
    // custom page template;
    // do something
}

संपादित करें

आप अपने फ़िल्टर कॉलबैक के अंदर इस सशर्त का उपयोग करेंगे :

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

अब, पृष्ठ जो कि आपके पेज टेम्पलेट का उपयोग के केवल शीर्षक को अलग करने के लिए, आप अन्य पैरामीटर को पास किए जाने का लाभ ले सकते the_title: $id। चूँकि आपको पता है कि जिस पद के लिए शीर्षक फ़िल्टर्ड किया जा रहा है, उसका आईडी पता है, आप _wp_page_templateपोस्ट मेटा को क्वेरी कर सकते हैं , और यह सुनिश्चित कर सकते हैं कि यह आपके पेज टेम्पलेट के बराबर है:

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

संपादित करें २

यदि आप "पाठ्यक्रम" पृष्ठ को विशेष रूप से लक्षित करना चाहते हैं, is_page()तो पृष्ठ स्लग 'courses'या पेज शीर्षक के साथ उपयोग करें 'Courses':

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Courses' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

हालांकि, मैं page-courses.phpएक कस्टम पेज टेम्प्लेट में बदलने की सलाह दूंगा , जो इस पूरी प्रक्रिया को और अधिक मजबूत बनाएगा।


यह अब के लिए काम नहीं किया। लेकिन मैंने अपने प्रश्न को परिष्कृत किया, क्योंकि यह पर्याप्त विशिष्ट नहीं हो सकता था। हो सकता है कि समस्या कहीं और हो।
गचत्र

" अब के लिए काम नहीं किया " से आपका क्या मतलब है ? आपने वास्तव में क्या प्रयास किया? आपको क्या होने की उम्मीद थी, जो नहीं हुआ, या अप्रत्याशित रूप से क्या हुआ?
चिप बेनेट

अपडेट किया गया उत्तर देखें, जो नौसेना मेनू आइटम शीर्षक को संबोधित करना चाहिए।
चिप बेनेट

मैंने कहा कि क्योंकि मुझे लगता है कि आपका उत्तर सही हो सकता है (सही दिशा में धक्का देना), लेकिन यह कि मैंने अपने प्रश्न को पर्याप्त रूप से स्पष्ट नहीं कहा। get_post_meta( $id, '_wp_page_template', true )रिटर्न defaultऔर मुझे नहीं पता कि इसके साथ क्या करना है। जब मैं 'पेज-कोर्सेज' को 'डिफॉल्ट' पर सेट करता हूं , तो जब मैं the_titleफिल्टर को हुक करता हूं loop_start, तब केवल फुटर लिंक बदल जाता है , इसके अलावा सभी नेवी लिंक बदल जाते हैं। मैंने जाँच की कि कौन सी टेम्प्लेट फ़ाइल का उपयोग किया गया है, और यह 'पेज-कोर्सेस.php' है, न कि 'page.php' (जो मुझे लगा कि यह डिफ़ॉल्ट हो सकता है)।
Ghatr

तो, "पाठ्यक्रम" आपके स्थैतिक पृष्ठ का नाम है?
चिप बेनेट

1

यदि आप केवल वर्तमान पृष्ठ शीर्षक संपादित करना चाहते in_the_loop()हैं, तो सशर्त का उपयोग करें , जैसे:

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

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

    if(!in_the_loop()){
        // returns early if not relevant (as in custom menu loops)
        return $title;
    }

    // Tweak your title
    $title = "Yolo! ". $title;
    return $title;
}

0

यह सुनिश्चित करने के लिए सशर्त टैग का उपयोग करने का प्रयास करें the_title()कि आप केवल उन पृष्ठों पर संशोधित किए जा रहे हैं जो आप चाहते हैं।


0

जबकि is_page_template()इच्छा काम करते हैं, मैं सभी कोड है कि एक फ़ाइल में पेज के इस प्रकार उत्पन्न करता है करने के लिए पृष्ठ टेम्पलेट अपने आप में कोड के इस प्रकार डाल करने के लिए पसंद करते हैं।


1
यह कैसे काम करेगा, इस धारणा के तहत कि प्रश्न में कोड का उपयोग करता है the_title()? कोड उदाहरण?
चिप बेनेट

@ ChipBennett, मैं सवाल नहीं समझता। यदि उसे किसी विशिष्ट टेम्प्लेट वाले पृष्ठ के लिए केवल फ़िल्टर लागू करने की आवश्यकता है तो वह कॉल करने से पहले उसी कोड को टेम्प्लेट में रख सकता है get_header()
मार्क कप्लून

हां, वास्तव में मुझे भी लगता है कि यह काम करेगा। हालाँकि, मुझे लगता है कि मुझे उस प्लगइन में एक चर सेट करने के लिए चक्कर लेना होगा जो query_vars में उपलब्ध होगा? तो मेरे लिए, फ़िल्टरिंग the_titleएक अच्छा समाधान है।
गचत्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.