it-swarm.com.de

Sprache pro Beitrag einstellen

Ich habe einen zweisprachigen Blog mit Englisch als Hauptsprache und Arabisch. Derzeit verwende ich das Feld "Benutzerdefiniert", um anzuzeigen, dass der Beitrag arabisch ist, und verwende dieses Feld in meinem untergeordneten Thema, um die Richtung in RTL und die Textübersetzung in Arabisch zu ändern. Dies geschieht jedoch manuell, was bedeutet, dass ich das Thema vollständig anpasse Wählen Sie anhand des benutzerdefinierten Feldwerts die richtige aus und legen Sie die Richtung für die HTML-Tags für den Titel, den Text und die Kommentare des Beitrags fest. Es funktioniert, aber wenn ich das Thema später ändere, muss ich alles wiederholen. Ich versuche auch, ein Kommentar-Plugin "wpDiscuz" zu verwenden, aber es gibt keine einfache Möglichkeit, die Sprache zu steuern, außer das Plugin selbst zu bearbeiten, was ich nicht tun möchte, da ich es einfach aktualisieren und nicht wiederholen möchte ändert sich nach jedem Update.

Da WP bereits die arabische Sprache unterstützt und die Übersetzungen als .mo-Dateien mit dem korrekten rtl css hat, unterstützt auch das neue Plugin .mo-Übersetzungen. Ich dachte, ich werde das nutzen und nur für bestimmte Posts eine Möglichkeit finden, die WordPress-Sprache auf Arabisch umzustellen. Ich bin jedoch immer noch nicht dazu in der Lage.

Ich habe ein Plugin mit einer Datei functions.php erstellt und dies ist der Inhalt:

function my_reset_locale($locale) {
    $locale = 'ar';
    return $locale;
}
add_filter('locale','my_reset_locale',10);

Dieser ändert es für alles (Titelseite und alle einzelnen Beiträge), ich habe versucht, die Beitrags-ID zu lesen

global $post;
$postId = isset($post) ? $post->ID : '';

Aber die ersten 4 Aufrufe meiner Funktion erfolgen, bevor $ post-> ID gesetzt wird. Wenn ich warte, bis es gesetzt ist, wird es zu spät, da die Sprache bereits geladen wurde und das Gebietsschema von $ locale danach nichts mehr tut.

Was kann ich tun, um frühzeitig und vor dem Lesen der Sprache Informationen über den Post zu erhalten? (Ich denke, es wird "load_textdomain" aufgerufen, um die Übersetzung basierend auf dem Gebietsschema auszuwählen.)

4
Fahad Alduraibi

Ich konnte keine Antwort finden und lieferte die Lösung.

Es war nicht einfach, da ich kein Experte für WordPress oder PHP bin, aber die WordPress-Dokumentation ist großartig. Hier ist die Lösung:

// 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');

Speichern Sie beim Bearbeiten des Beitrags oder der Seite den Sprachcode (z. B. en_US oder ar) im Beitrag meta. Dieser Teil ist einfach, aber das Problem ist, wenn Sie die Seite anzeigen, wann Sie den Code ausführen, der die Sprache überprüft? Wenn Sie es zu früh ausführen, haben Sie die Beitrags-ID nicht, da es noch nicht von WordPress geladen wurde. Wenn Sie warten und den Code zu spät ausführen, ist es zu spät, da WordPress die Standardsprache lädt. Der Sweet Spot, den ich gefunden habe, ist bei action setup_theme, da in diesem Schritt die Übersetzungen noch nicht geladen sind und wir url_to_postid aufrufen können, um die Post-ID zu erhalten, mit der wir die Post-Meta abrufen.

Nachdem ich das getan hatte, überlegte ich, warum ich nicht ein WordPress-Plugin erstellen sollte, von dem andere profitieren können, und hier ist es:

https://wordpress.org/plugins/per-post-language/

2
Fahad Alduraibi