webentwicklung-frage-antwort-db.com.de

Gebietsschemawechsel mit einer "Sprach" -Taxonomie

Ich weiß, dass es möglich ist, das Gebietsschema WP mithilfe der hier beschriebenen URL-Parameter zu ändern , aber ich versuche zu erstellen Eine Methode, die vollständig auf einer benutzerdefinierten "Sprache" -Taxonomie beruht.

Was ich derzeit habe, ist ein einfaches Plugin, das die Sprachtaxonomie registriert und einen Gebietsschemaschalter implementiert, wenn die Taxonomie vorhanden ist:

<?php
add_action( 'plugins_loaded', 'wpsx_register_taxonomies' );
function wpsx_register_taxonomies() {
register_taxonomy('wpsx_language', array (
                  0 => 'post',
                  1 => 'page',
                ), array( 
                    'hierarchical' => true, 
                    'label' => 'Languages',
                    'singular_label' => 'Language',
                    'show_ui' => true,
                    'rewrite' => false,
                    ) 
                );
}
function wpsx_redefine_locale($locale) {
    global $post;
      if ( taxonomy_exists( 'wpsx_language' )) {
        $locale = 'de_DE'; // this does work !!
        if ( has_term( 'fr', 'wpsx_language' )) {
            $locale = 'fr_FR'; // this does not work yet :(
        }   
     }
     return $locale;
}
add_filter('locale','wpsx_redefine_locale',10);
?>

Der kleine Teil, der nicht funktioniert, ist der has_term()-Test. Mein Eindruck ist, dass der Gebietsschemafilter zu einem frühen Zeitpunkt in der Ladesequenz ausgeführt wird, wenn der Inhalt des Posts noch nicht abgerufen wurde. Daher geben bedingte Tests wie is_single() oder has_term() nichts zurück.

Kann ich das Laden des Beitragsinhalts früher erzwingen? Kann ich den Gebietsschemafilter verzögern?

Ich kann keine Lösung dafür finden. Auf der Mailingliste von wp-hackers war ein Vorschlag, global $post; auszuführen, aber das half nicht.


Update: Auf Vorschlag von david.binda habe ich eine Problemumgehung gefunden, die Taxonomie gelöscht und den Post-Slug als Auslöser verwendet:

function wpsx89972_redefine_locale($locale) {
    $wpsx_url = $_SERVER['REQUEST_URI'];
    $wpsx_url_lang = substr($wpsx_url, -4); // test for the last 4 chars:
    if ( $wpsx_url_lang == "-fr/") {
        $locale = 'fr_FR';
    } else if ( $wpsx_url_lang == "-en/") { 
        $locale = 'en_US';
    } else { // fallback to default
        $locale = 'de_DE'; 
    }
    return $locale;
}
add_filter('locale','wpsx89972_redefine_locale',10);

Dazu muss der Benutzer die Post-Slugs umschreiben, z. B. "my-post-title-fr" für Französisch, "my-post-title-en" für Englisch usw. Etwas weniger benutzerfreundlich als die Verwendung von Sprach-Tickboxen, aber Es hält den Code einfach und funktioniert einfach.

So, jetzt habe ich ein funktionierendes mehrsprachiges Plugin, in nur 13 Codezeilen :)

Trotzdem werde ich diese Frage ein paar Tage offen lassen, um zu sehen, ob jemand eine Lösung findet, die die Taxonomie nutzt ...

1
Manu

Möglicherweise interessieren Sie sich für die Funktion url_to_postid

Wird wie folgt aus Ihrer Funktion wpsx_redefine_locale verwendet:

$url = $_SERVER['REQUEST_URI'];
$postid = url_to_postid( $url );

Beachten Sie, dass dies nicht die Beitrags-ID für benutzerdefinierte Beitragstypen zurückgibt, sondern dass sich die Funktion in /wp-includes/rewrite.php befindet und bei Bedarf erweitert werden kann.

UPDATE: hier ist dein Beispiel:

function my_function(){
if ( ! wp_is_post_revision( $post_id ) ){

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'my_function');

    // update the post, which calls save_post again
    $my_post_args = array();
    $my_post_args['ID'] = post_id;
    $p = get_post( $post_id );
    $lang_tax = 'my_lang_tax_name';
    $language_terms = get_post_terms( $post_id, $lang_tax );
    $my_post_args['post_name'] = $p->name . '_' . $language_terms[0]->slug;
    wp_update_post( $my_post_args );

    // re-hook this function
    add_action('save_post', 'my_function');
}
add_action('save_posts', 'my_function');

Was noch zu tun ist, liegt bei Ihnen. Sie müssen die Situation bereinigen, in der der Benutzer den der Veröffentlichung zugewiesenen Begriff für die Sprachentaxonomie geändert hat, damit auf der Veröffentlichung nicht my-post_de_en statt my-post_en angezeigt wird, der zuvor in de enthalten war und my-post_de slug hatte. Dies würde einige reguläre Ausdrücke erfordern, aber das schaffst du;)

1
david.binda

Hier ist eine bessere Lösung, die nichts in Ihrem Beitrag ändert, sondern nur ein Meta hinzufügt

// Set the post language when loading up the page based on the store meta
function ppl_set_post_language() {
    $postID = url_to_postid( $_SERVER["REQUEST_URI"] );
    if ($postID > 0) {
        $postLanguage = esc_attr( get_post_meta( $postID, '_ppl_post_language', true ) );
        if ( ! empty( $postLanguage ) ) {
            global $locale;
            $locale = $postLanguage;
        }
    }
}
// Any call to 'url_to_postid' earlier then 'setup_theme' will generate a fatal error.
add_action('setup_theme', 'ppl_set_post_language');

Für weitere Details überprüfen Sie meine Antwort (auf meine eigene Frage) hier: Sprache per Post einstellen

Und ich habe ein Plugin, das alles für dich macht (Link steht auch in meiner Antwort)

0
Fahad Alduraibi