"स्लग" (कस्टम पोस्ट प्रकार, वर्गीकरण) के थीम स्थानीयकरण


17

अपने विषय में मैं कस्टम पोस्ट प्रकारों और कस्टम टैक्सोनोमी की एक श्रृंखला को परिभाषित करना चाहता हूं, हर एक का अपना स्वनिर्धारित स्लग है; मेरे विषय की आधार भाषा अंग्रेजी है, इसलिए स्लग अंग्रेजी भाषा में होगा

उदाहरण के लिए, कस्टम पोस्ट प्रकार "उत्पाद" के स्लग को परिभाषित करते समय:

'rewrite' => array( 'slug' => 'product' ),

वहाँ किसी भी तरह से "स्लग" का अनुवाद करने के लिए है po / मो फ़ाइलों के माध्यम से? क्या मैं इसे नीचे रख सकता हूं:

'rewrite' => array( 'slug' => __('product', 'mytextdomain') )

या यह काम नहीं करेगा? स्लग को स्थानीय बनाने के लिए वर्तमान अभ्यास क्या है?


मुझे नहीं पता कि हम एक ही समस्या से निपट रहे हैं लेकिन ऐसा लगता है। बेहतर यह समझने के लिए यहाँ एक मूल के लिए एक लिंक है सूचकांक एक कस्टम पोस्ट प्रकार के लिए कहा जाता है पेज prensaके लिए एक स्लग सेट के साथ prensaWPML के अनुवादित पृष्ठ स्लग का उपयोग करना जैसा pressकि यह prensaफिर से नहीं हो सकता है : / en / press / जो कुछ भी प्रदर्शित नहीं करता है (ध्यान दें कि अब ES लिंक पर क्लिक करने से आप / prensa / पर वापस नहीं आते हैं)। लेकिन, अगर आप / en / prensa पर जाएँ / यह काम करता है ...
Naoise Golden

मैंने पृष्ठों को / en / press से / en / prensa पर पुनर्निर्देशित करने का निर्णय लिया है, इसलिए संभवतः लिंक किसी भी अधिक के रूप में काम नहीं करेगा। बहुत बुरा मैं स्थानीय स्लग का उपयोग नहीं कर सकता था, लेकिन काम पर समय बेहतर
थल लोकल

मेरा उत्तर नावे देखें, मुझे लगता है कि यह आपको एक काम करने वाला समाधान देगा।
क्रिसगिटेरग्यूई

मुझे यह समस्या घंटों से थी। मुझे आखिरकार एक हैक मिला: github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/… सादर।
सिल्वेन टीच

जवाबों:


19

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

अपने स्लग को बचाने के load-options-permalink.phpलिए $_POSTडेटा को पकड़ने के लिए हुक और कुछ चीजें सेट करें। पृष्ठ पर एक सेटिंग फ़ील्ड भी जोड़ें।

<?php
add_action( 'load-options-permalink.php', 'wpse30021_load_permalinks' );
function wpse30021_load_permalinks()
{
    if( isset( $_POST['wpse30021_cpt_base'] ) )
    {
        update_option( 'wpse30021_cpt_base', sanitize_title_with_dashes( $_POST['wpse30021_cpt_base'] ) );
    }

    // Add a settings field to the permalink page
    add_settings_field( 'wpse30021_cpt_base', __( 'CPT Base' ), 'wpse30021_field_callback', 'permalink', 'optional' );
}

फिर सेटिंग फ़ील्ड के लिए कॉल बैक फ़ंक्शन:

<?php
function wpse30021_field_callback()
{
    $value = get_option( 'wpse30021_cpt_base' );    
    echo '<input type="text" value="' . esc_attr( $value ) . '" name="wpse30021_cpt_base" id="wpse30021_cpt_base" class="regular-text" />';
}

फिर जब आप अपने पोस्ट प्रकार को पंजीकृत करते हैं, तो स्लग को पकड़ लें get_option। यदि यह नहीं है, तो अपने डिफ़ॉल्ट का उपयोग करें।

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    if( ! $slug ) $slug = 'your-default-slug';

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

यहाँ सेटिंग्स फ़ील्ड भाग को एक प्लगइन https://gist.github.com/1275867 के रूप में दिया गया है

EDIT: एक अन्य विकल्प

आप WPLANGनिरंतर में परिभाषित किए गए आधार पर स्लग को भी बदल सकते हैं ।

बस एक त्वरित फ़ंक्शन लिखें जो डेटा रखता है ...

<?php
function wpse30021_get_slug()
{
    // return a default slug
    if( ! defined( 'WPLANG' ) || ! WPLANG || 'en_US' == WPLANG ) return 'press';

    // array of slug data
    $slugs = array( 
        'fr_FR' => 'presse',
        'es_ES' => 'prensa'
        // etc.
    );

    return $slugs[WPLANG];
}

फिर स्लग प्राप्त करें जहां आप अपने कस्टम पोस्ट प्रकार को पंजीकृत करते हैं।

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

सबसे अच्छा विकल्प, IMO, दोनों ही उपयोगकर्ता को एक विकल्प देने और ठोस चूक प्रदान करने के लिए होगा:

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    // They didn't set up an option, get the default
    if( ! $slug ) $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

2
Gist पर प्लगइन और अच्छी तरह से प्रलेखित कोड के लिए +1। मेरे मामले में, हालांकि, यह उस उद्देश्य को हरा देता है, जो उपयोगकर्ता को शक्ति नहीं देने के लिए है, लेकिन कस्टम-पोस्ट प्रकारों के
आग्रह करने के लिए

1
मुझे यकीन नहीं है कि मैं समझता हूं कि आप अपने उपयोगकर्ता से एक विकल्प क्यों निकालना चाहते हैं। अधिक से अधिक, अनुवाद फ़िल्टर के माध्यम से स्लग चलाने से उन्हें एक ही विकल्प मिलता है: स्लग को बदलने के लिए। भरने के लिए एक सुंदर फॉर्म फील्ड के साथ नहीं।
क्रिसगिटेरिटग्यु

1
सिर्फ जिज्ञासा के लिए, क्यों wpse30021?
नौसे गोल्डन ऑक्ट

ऐसा लगता है जैसे यह विकल्प WPLANG- आधारित स्थानीयकरण के लिए है। लेकिन क्या होगा अगर आप एक बहु-भाषा साइट के साथ काम कर रहे हैं? (उदाहरण के लिए WPML प्लगइन)। सवाल ग्राहक के स्थानीयकरण के आधार पर एक अलग स्लग को प्रदर्शित करने के बारे में है , जो सर्वर के विकल्पों से कस्टम पोस्ट प्रकार स्लग को सेट करने में सक्षम है।
नौसे गोल्डन ऑक्ट

wpse = वर्डप्रेस स्टैक एक्सचेंज। 30021 URL से नंबर है। आपकी परीक्षा के साथ अच्छी किस्मत; मैंने अपना जवाब दे दिया है। मूल प्रश्न के अतिरिक्त परिवर्तन को आप जोड़ रहे हैं, और मूल प्रश्न का पूर्ण परिवर्तन - मूल रूप से CPT स्लग के बारे में, केवल अंतिम उपयोगकर्ता को अपना स्लग चुनने की अनुमति देने के लिए मामला बनाता है।

2

अगर वह काम नहीं करता है तो आप साधारण काम क्यों नहीं करते हैं:

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );

यह मेरे लिए काम नहीं किया
Naoise Golden

यह मूल रूप से एक और शैली में एक ही कोड है
Naoise गोल्डन

क्या आपने उचित टेक्स्ट डोमेन जोड़ा है? <? php load_theme_textdomain (my_text_domain)?>?
चिफ्लिआई

यह अब तक का सबसे अच्छा उपाय है।
अल रोजादो

2

मैं वास्तव में यही कर रहा हूं कि एक विषय में हम विकास कर रहे हैं। यह 5 अलग-अलग भाषाओं में उपलब्ध है, और प्रत्येक भाषा में अनुवादित श्रेणियों का एक समूह है। देश में भाषा प्रारूप में किस भाषा का उपयोग किया जाता है, यह निर्धारित करने के लिए विषय में URL का पहला घटक पार्स किया गया है:

/uk-en
/fr-fr
/it-it

और फिर अनुवादित श्रेणियों को URL के आगे के घटकों के रूप में पार्स किया जाता है।

URL parse_requestचरण में पार्स किया गया है :

function my_parse_request( $wp ) {
    $path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

    $components = preg_split('|/|', $path, null, PREG_SPLIT_NO_EMPTY );

    // Determine language from $components[0]
    $language = array_shift( $components );
    ...

    // Load translations file...
    $mofile = get_stylesheet_directory()."/$language.mo";

    load_textdomain( 'mydomain', $mofile );

    ...

    // Determine category from $components[0]
    if( __( 'some-category', 'mydomain' ) == $components[0] )
      $wp->query_vars['category'] = 'some-category';

    ...
}
add_action( 'parse_request', 'my_parse_request' );

यह उदाहरण अपेक्षित चेक से रहित है, लेकिन इसका मतलब केवल एक उदाहरण के रूप में है।

इस दृष्टिकोण में कमियां हैं, लेकिन यह सभी भाषाओं में प्राकृतिक URL की अनुमति देता है। मेरे द्वारा देखी जाने वाली मुख्य कमियां हैं:

1) यह पर्मलिंक तंत्र का उपयोग नहीं करता है। इसे संभवतः बढ़ाया जा सकता है ताकि सभी भाषाओं के लिए उचित पर्मलिंक नियम उत्पन्न हो और parse_request आवश्यक नहीं होगा, लेकिन सभी भाषाओं के लिए ऐसा करने के लिए एक लूप के बाद एक MO फाइल लोड करना शामिल होगा, और मैं नहीं पता है कि कितना अच्छा समर्थन किया है।

2) यदि कोई अनुवादक स्लग बदलता है, तो लिंक अमान्य हो जाते हैं।


0

आप अपने में यह कोशिश कर सकते हैं functions.php

<?php
add_filter('rewrite_slugs', function($translated_slugs) {
    // the possible translations for your slug 'product'
    $translated_slugs = array(
        'product' => array(
            'pt' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'produto'),
            ),
            'es' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'producto'),
            ),
        ),
    );
    return $translated_slugs;
});
?>

जैसा कि यहां देखा गया है


-1

मैं स्लग को अनुवाद योग्य नहीं बनाने की सलाह दूंगा

अनुवाद उपयोगकर्ता-सामना करने वाली साइट सामग्री के लिए है । स्लग आंतरिक रूप से उपयोग किए जाते हैं , और केवल URL रीराइट के माध्यम से "पब्लिक-फेसिंग" थोड़े ही होते हैं - और URL अनुवाद योग्य नहीं होने चाहिए , या तो।

इसलिए: अपने स्लग को अकेला छोड़ दें, क्योंकि आप उन्हें परिभाषित करते हैं। केवल अनुवाद योग्य तार बनाएं जो कि सार्वजनिक उपभोग के लिए हैं


11
अनुवादित स्लग, दोनों एक एसईओ और एक उपयोगकर्ता अनुभव के नजरिए से, बहुत समझ में आता है ...
नौसिखिए गोल्डन

मैं असहमत हूं कि स्लग उपयोगकर्ता के अनुभव को वैसे भी प्रभावित करता है । यदि किसी लिंक के हिस्से के रूप में एक स्लग का उपयोग किया जाता है, तो लिंक एंकर टेक्स्ट का अनुवाद किया जाएगा, इसलिए उपयोगकर्ता को अंतर नहीं पता चलेगा। और जब लोग "एसईओ" के आसपास उछलना शुरू करते हैं, तो मैं आमतौर पर सोचता हूं, " सांप का तेल "। मैं एक एसईओ विशेषज्ञ नहीं हूं, लेकिन मैं अनुवादित स्लग के संबंध में एसईओ प्रभाव नहीं खरीद रहा हूं।
चिप बेनेट

3
मैं अनुभव के आधार पर असहमत हूं। हमारे पास विदेशी सामग्री प्रबंधक हैं जो स्पष्ट हैं कि URL स्लग को स्थानीयकृत किया जाना चाहिए। यह विदेशी उपयोगकर्ता के लिए एक पूर्ण / गीत स्थानीय अनुभव बनाने की बात है। कुछ देशों के लिए, जापान की तरह, यह एक प्रामाणिक प्रकार का विश्वास स्थापित करने के लिए शाब्दिक रूप से आवश्यक है और इंगित करता है कि आप वास्तव में वहाँ व्यापार करने के बारे में गंभीर हैं।
इंटरनेट

urls बोलना चाहिए। यदि स्लग इकाई (या प्रायः) के नाम पर है, तो पुनर्लेखन को अनुवाद के साथ-साथ विवरणों को भी ध्यान में रखना चाहिए। यह एक विकल्प नहीं है, दोनों एसईओ के लिए और अंत उपयोगकर्ताओं के लिए बस अच्छा अभ्यास।
लुका रेगेलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.