IT-Swarm.Net

Lokalizacija tema "poluga" (prilagođeni tipovi postova, taksonomije)

u mojoj temi želim definirati niz prilagođenih vrsta postova i prilagođenih taksonomija, od kojih svaka ima vlastiti prilagođeni slug; osnovni jezik moje teme je engleski, pa će puževi biti na engleskom jeziku

na primjer, pri određivanju zrna prilagođenih argumenata tipa oglasa "proizvod":

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

postoji li bilo koji način da se prevede "puževa" kroz po/mo datoteke? mogu li to staviti kao:

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

ili neće raditi? Koja je trenutna praksa lokaliziranja puževa?

15
unfulvio

Ne bih pokušao lokalizirati vaše puževe. Umjesto toga, zašto ne biste korisnicima dali mogućnost da ih promijene dodavanjem drugog polja na stranicu postavki trajne veze?

Zakačite u load-options-permalink.php i postavite neke stvari kako biste uhvatili $_POST podatke da biste spremili svoj metak. Također dodajte polje postavki na stranicu.

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

Tada funkcija povratnog poziva za polje postavki:

<?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" />';
}

Zatim, kada registrirate vrstu posta, uhvatite ga s get_option. Ako ga nema, upotrijebite zadani.

<?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 );
}

Evo dijela polja postavki kao dodatak https://Gist.github.com/1275867

EDIT: Druga opcija

Također možete promijeniti slug na temelju onoga što je definirano u konstanti WPLANG.

Samo napišite brzu funkciju koja sadrži podatke ...

<?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];
}

Zatim dohvatite zrno gdje ćete registrirati svoj prilagođeni tip pošte.

<?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 );
}

Najbolja opcija, IMO, bila bi da korisniku pruži mogućnost i osigura čvrste zadane postavke:

<?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 );
}
18
chrisguitarguy

Radim upravo to u temi koju razvijamo. Dostupan je na 5 različitih jezika, a svaki jezik ima prevedeni skup kategorija. Prva komponenta URL-a u temi raščlanjuje se kako bi se odredio koji se jezik koristi u formatu države-jezika:

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

Zatim se prevedene kategorije raščlanjuju kao daljnje komponente URL-a.

URL je analiziran u fazi 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' );

Ovaj primjer nema potrebnih provjera, ali je samo kao primjer.

Ovaj pristup, naravno, ima nedostatke, ali dopušta prirodne URL-ove na svim jezicima. Glavni nedostaci koje vidim su:

1) ne koristi permalink mehanizam. To bi se vjerojatno moglo proširiti tako da se generiraju odgovarajuća pravila za permalink za sve jezike i parse_request neće biti potrebno, ali to učiniti za sve jezike uključivalo bi učitavanje jedne MO datoteke za drugom u petlju, a ja ne znate koliko je to dobro podržano.

2) Ako prevoditelj promijeni zrno, veze se poništavaju.

2
Bendoh

To možete isprobati u vašem 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;
});
?>

kao što se vidi ovdje

0
Junior M