- Αντιγράψτε περιεχόμενο από την αρχική ανάρτηση χρησιμοποιώντας την δωρεάν έκδοση της Polylang
- Εμφάνιση του συνολικού αριθμού των αναρτήσεων που έχουν μεταφραστεί με την Polylang σε κάθε γλώσσα
- Προσθέστε εγγενή banners της Polylang σε οποιαδήποτε σελίδα ή ανάρτηση
- Προσθήκη ενός εικονιδίου SVG δίπλα στον επιλογέα γλώσσας
- Εμφάνιση παραμετροποιήσιμης προειδοποίησης για την ύπαρξη ξενόγλωσσης έκδοσης

Αν και υπάρχουν διαφορετικές απόψεις σχετικά με το ποιο είναι το καλύτερο πρόσθετο για τη δημιουργία ενός πολύγλωσσου ιστολογίου, και όλα έχουν εξελιχθεί πολύ από τις πρώτες τους εκδόσεις απλοποιώντας και διευκολύνοντας το έργο, ένα από τα πιο συχνά χρησιμοποιούμενα είναι το Polylang.
Με περισσότερες από 700.000 ενεργές εγκαταστάσεις μέχρι σήμερα, παραμένει μία από τις ελαφρύτερες και πιο αποτελεσματικές επιλογές.
Ακολουθεί μια μικρή λίστα με αποσπάσματα με λειτουργίες και φίλτρα που μπορεί να σας φανούν χρήσιμα κάποια στιγμή. Όλα αυτά λειτουργούν για την δωρεάν έκδοση της Polylang και έχουν δοκιμαστεί ή/και χρησιμοποιηθεί εδώ.
Αντιγράψτε περιεχόμενο από την αρχική ανάρτηση χρησιμοποιώντας την δωρεάν έκδοση της Polylang
Εάν χρησιμοποιείτε τη δωρεάν έκδοση του πρόσθετου Polylang για το WordPress, γνωρίζετε ήδη ότι η νέα σελίδα ή ανάρτηση που δημιουργεί για μετάφραση δεν αντιγράφει το αρχικό περιεχόμενο. Αυτό είναι ένα από τα χαρακτηριστικά της επί πληρωμή έκδοσής του και στη δωρεάν έκδοση πρέπει να επικολλήσετε το περιεχόμενο με το χέρι.
Για να το λύσετε αυτό και να επιταχύνετε τη διαδικασία, προσθέστε αυτές τις συναρτήσεις στο αρχείο functions.php του προτύπου σας. Τώρα, όταν προσθέτετε μια νέα μετάφραση θα ανοίγει με το αρχικό περιεχόμενο που αντιγράφηκε (τίτλος και περιεχόμενο).
// Copying content when creating a translation with Polylang
function jb_editor_content( $content ) {
// Polylang sets the 'from_post' parameter
if ( isset( $_GET['from_post'] ) ) {
$my_post = get_post( $_GET['from_post'] );
if ( $my_post )
return $my_post->post_content;
}
return $content;
}
add_filter( 'default_content', 'jb_editor_content' );
// Copy title when creating a translation with Polylang
function jb_editor_title( $title ) {
// Polylang sets the 'from_post' parameter
if ( isset( $_GET['from_post'] ) ) {
$my_post = get_post( $_GET['from_post'] );
if ( $my_post )
return $my_post->post_title;
}
return $title;
}
add_filter( 'default_title', 'jb_editor_title' );
*Το απόσπασμαβρέθηκε σε ένα σημείωμα από τον Δεκέμβριο του 2020. Αν και εξακολουθεί να λειτουργεί, δεν θα ήταν κακό να το παρακολουθείτε σε περίπτωση που, με την πάροδο του χρόνου και τις μελλοντικές ενημερώσεις της Polylang, αποτύχει.
Εμφάνιση του συνολικού αριθμού των αναρτήσεων που έχουν μεταφραστεί με την Polylang σε κάθε γλώσσα
Αυτή η λειτουργία σας επιτρέπει να προσθέσετε έναν σύντομο κωδικό για κάθε γλώσσα που θα εμφανίζει τον συνολικό αριθμό των δημοσιεύσεων που δημοσιεύονται σε μια γλώσσα στην οποία υπάρχουν μεταφράσεις που έχουν προστεθεί με το πρόσθετο Polylang.
Αυτή η λειτουργία είναι περισσότερο από δοκιμασμένη και λειτουργεί σωστά στη σελίδα στατιστικών μου και είναι χρήσιμη για τη διατήρηση μιας λίστας μετρητών που ενημερώνονται αυτόματα.
Το απόσπασμα προστίθεται στο functions.php του προτύπου :
// Function to display number of published posts by language for Polylang
function polylang_post_count_by_language($atts) {
// Atributos del shortcode
$atts = shortcode_atts(array(
'lang' => '', // Código de idioma (ej: 'es', 'en', etc.)
), $atts, 'post_count_by_lang');
// Check if Polylang is active
if (!function_exists('pll_languages_list')) {
return 'Polylang plugin is not active.';
}
// Get the language code
$lang = $atts['lang'];
if (empty($lang)) {
return 'Language code is required.';
}
// Single key for transient
$transient_key = 'post_count_by_lang_' . $lang;
// Trying to get the count from the cache
$post_count = get_transient($transient_key);
// If there is no cache, perform the query
if (false === $post_count) {
// Configure the query to count posts by language
$args = array(
'lang' => $lang,
'post_type' => 'post', // Type of post (you can change it if necessary)
'post_status' => 'publish', // Only published posts
'fields' => 'ids', // Only obtain IDs to reduce the burden
'numberposts' => -1, // All posts
);
// Make an enquiry
$query = new WP_Query($args);
// Get the total number of posts
$post_count = $query->found_posts;
// Cache for 12 hours (43200 seconds)
set_transient($transient_key, $post_count, 43200);
}
// Return the number of posts
return $post_count;
}
add_shortcode('post_count_by_lang', 'polylang_post_count_by_language');
Ένα από τα προβλήματα που αντιμετωπίζουμε εδώ είναι ότι αν έχετε πολλές αναρτήσεις σε πολλές διαφορετικές γλώσσες στον ιστότοπό σας, όπως συμβαίνει με αυτό το ιστολόγιο, ο αντίκτυπος του ερωτήματος στη βάση δεδομένων θα μπορούσε να επιβραδύνει την ταχύτητα φόρτωσης. Ο κώδικας το λαμβάνει αυτό υπόψη και το ερώτημα βελτιστοποιείται χρησιμοποιώντας το WP_Query με πεδία => 'ids ' για να μειωθεί η επιβάρυνση της μνήμης με τη μη φόρτωση ολόκληρων αντικειμένων αναρτήσεων.
Ο αριθμός των δημοσιεύσεων αποθηκεύεται με τη χρήση set_transient και αποφεύγονται τα επαναλαμβανόμενα ερωτήματα στη βάση δεδομένων. Στο παράδειγμα, η κρυφή μνήμη ενημερώνεται κάθε 12 ώρες, εκφρασμένη σε δευτερόλεπτα (μπορείτε να προσαρμόσετε αυτόν τον χρόνο ανάλογα με τις ανάγκες σας).
Για να βελτιστοποιηθεί το ερώτημα, χρησιμοποιείται το WP_Query αντί του get_posts για την πρόσβαση στο found_posts, το οποίο επιστρέφει τον συνολικό αριθμό των αναρτήσεων χωρίς να χρειάζεται να φορτωθούν όλα τα αντικείμενα.
Η παράμετρος fields => 'ids ' μειώνει το φορτίο μνήμης ανακτώντας μόνο τα IDs των αναρτήσεων.
Αν κάποια στιγμή χρειαστεί να καθαρίσετε την προσωρινή μνήμη αποθήκευσης χειροκίνητα (π.χ. μετά τη δημοσίευση μιας νέας δημοσίευσης), ώστε να μην εμφανίζονται ληγμένα δεδομένα, μπορείτε να χρησιμοποιήσετε:
delete_transient('post_count_by_lang_' . $lang);
Αν προτιμάτε να αυτοματοποιήσετε αυτή τη διαδικασία, η ακόλουθη λειτουργία θα διαγράφει το μεταβατικό κάθε φορά που δημοσιεύεται, ενημερώνεται ή διαγράφεται μια δημοσίευση. Αν την προσθέσετε στο functions.php του προτύπου σας, το άγκιστρο θα ενεργοποιείται για όλες αυτές τις ενέργειες:
//Deleting the transient when publishing, updating or deleting a post
function clear_post_count_transient($post_id) {
// Check if the post is of type 'post' (or the type you are counting).
if (get_post_type($post_id) === 'post') {
// Get the language of the post using Polylang
if (function_exists('pll_get_post_language')) {
$lang = pll_get_post_language($post_id);
// If the language is obtained, delete the corresponding transient.
if ($lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
}
}
add_action('save_post', 'clear_post_count_transient'); // When publishing or updating
add_action('delete_post', 'clear_post_count_transient'); // By deleting
Και αυτό καθαρίζει την προσωρινή μνήμη αυτόματα σύμφωνα με μια σειρά από διαφορετικά πιθανά σενάρια(συμπεριλαμβανομένου του παραπάνω):
// Function to delete the transient when necessary
function clear_post_count_transient($post_id) {
if (get_post_type($post_id) === 'post') {
if (function_exists('pll_get_post_language')) {
$lang = pll_get_post_language($post_id);
if ($lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
}
}
add_action('save_post', 'clear_post_count_transient');
add_action('delete_post', 'clear_post_count_transient');
//Function to delete transient when changing the language of a post
function clear_post_count_transient_on_language_change($post_id, $lang) {
$old_lang = pll_get_post_language($post_id);
if ($old_lang) {
delete_transient('post_count_by_lang_' . $old_lang);
}
if ($lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
add_action('pll_save_post', 'clear_post_count_transient_on_language_change', 10, 2);
// Function to delete all transients when uninstalling or deactivating Polylang
function clear_all_post_count_transients() {
if (function_exists('pll_languages_list')) {
$languages = pll_languages_list();
foreach ($languages as $lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
}
register_deactivation_hook(__FILE__, 'clear_all_post_count_transients');
register_uninstall_hook(__FILE__, 'clear_all_post_count_transients');
Οι αριθμοί εμφανίζονται χρησιμοποιώντας τον σύντομο κωδικό για κάθε γλώσσα με τον αντίστοιχο κωδικό, όπου θέλετε να εμφανίζεται ο αριθμός. Φαίνεται ως εξής:
For Spanish: [post_count_by_lang lang="es"]
For English: [post_count_by_lang lang="en"]
For German: [post_count_by_lang lang="de"]
For French: [post_count_by_lang lang="fr"]
etc.
Μπορείτε να τροποποιήσετε το'post_type' στον κώδικα, αν θέλετε να μετρήσετε άλλους τύπους περιεχομένου (σελίδες, προσαρμοσμένους τύπους αναρτήσεων κ.λπ.).
Σε αυτή τη διεύθυνση URL έχετε ένα παράδειγμα της λειτουργίας των συντομευμένων κωδικών.
Προσθέστε εγγενή banners της Polylang σε οποιαδήποτε σελίδα ή ανάρτηση
Δεδομένου ότι η Polylang περιλαμβάνει μια συλλογή από 249 σημαίες 16x11 σε μορφή .png, μπορούμε να τις χρησιμοποιήσουμε για να διακοσμήσουμε λίστες, να τις προσθέσουμε σε πίνακες, παραγράφους κ.λπ. χωρίς να χρειάζεται να γράψουμε HTML ή CSS.
Αυτή η λειτουργία σας επιτρέπει να προσθέσετε την εικόνα οποιουδήποτε εγγενούς banner που χρησιμοποιείται από το πρόσθετο μέσω ενός σύντομου κώδικα.
Για να τα καταστήσετε διαθέσιμα, προσθέτετε το απόσπασμα στο functions.php του παιδικού σας θέματος, σε ένα προσαρμοσμένο πρόσθετο ή με το Code Snippet, αν το χρησιμοποιείτε.
function polylang_flag_shortcode($atts) {
// Shortcode attributes
$atts = shortcode_atts(array(
'code' => '', // Flag code (e.g. 'es', 'en', 'fr')
'size' => '16', // Flag size (width in pixels)
), $atts, 'polylang_flag');
// Check if a flag code was provided
if (empty($atts['code'])) {
return 'Flag code not provided.';
}
// Polylang flag base route
$flag_path = plugins_url('polylang/flags/' . $atts['code'] . '.png');
// Create the HTML of the flag image
$flag_html = '<img src="' . esc_url($flag_path) . '" alt="' . esc_attr($atts['code']) . '" width="' . esc_attr($atts['size']) . '" height="auto" />';
return $flag_html;
}
add_shortcode('polylang_flag', 'polylang_flag_shortcode');
Μόλις προσθέσετε τον κώδικα, μπορείτε να χρησιμοποιήσετε τον σύντομο κωδικό με τον αντίστοιχο κωδικό χώρας σε οποιαδήποτε σελίδα ή ανάρτηση του WordPress , φροντίζοντας να ταιριάζει ακριβώς με τα ονόματα των αρχείων σημαίας στο φάκελο /wp-content/plugins/polylang/flags/.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Για να αλλάξετε το μέγεθος των σημαιών, απλά αλλάξτε την τιμή του χαρακτηριστικού size στον σύντομο κώδικα.
Αν θέλετε να δημιουργήσετε και να χρησιμοποιήσετε τα δικά σας banners ή να έχετε μια άλλη συλλογή με διαφορετικό σχεδιασμό, απλά φιλοξενήστε τα νέα (σε .png) σε ένα νέο φάκελο με διαφορετικό όνομα (διαφορετικά θα χάσετε τις αλλαγές όταν ενημερωθεί το plugin) και προσθέστε τη νέα διαδρομή στον κώδικα. Για παράδειγμα:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Προσθήκη ενός εικονιδίου SVG δίπλα στον επιλογέα γλώσσας
Αυτό το απόσπασμα προσθέτει ένα εικονίδιο SVG με το σύμβολο "Μετάφραση" στα αριστερά του επιλογέα μητρικής γλώσσας της Polylang για να το κάνει πιο ελκυστικό οπτικά και να τραβήξει την προσοχή του επισκέπτη. Στο παράδειγμα, το εικονίδιο είναι αυτό που χρησιμοποιώ σε αυτό το ιστολόγιο. Μπορείτε να αναζητήσετε αυτό που σας αρέσει περισσότερο και να το αντικαταστήσετε. Ακολουθούν μερικά από αυτά.
function polylang_add_translate_icon($output) {
//SVG icon for "translate".
$translate_icon = '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align: middle; margin-right: 5px;"><path d="M24 24h-2.784l-1.07-3h-4.875l-1.077 3h-2.697l4.941-13h2.604l4.958 13zm-4.573-5.069l-1.705-4.903-1.712 4.903h3.417zm-9.252-12.804c.126-.486.201-.852.271-1.212l-2.199-.428c-.036.185-.102.533-.22 1-.742-.109-1.532-.122-2.332-.041.019-.537.052-1.063.098-1.569h2.456v-2.083h-2.161c.106-.531.198-.849.288-1.149l-2.147-.645c-.158.526-.29 1.042-.422 1.794h-2.451v2.083h2.184c-.058.673-.093 1.371-.103 2.077-2.413.886-3.437 2.575-3.437 4.107 0 1.809 1.427 3.399 3.684 3.194 2.802-.255 4.673-2.371 5.77-4.974 1.134.654 1.608 1.753 1.181 2.771-.396.941-1.561 1.838-3.785 1.792v2.242c2.469.038 4.898-.899 5.85-3.166.93-2.214-.132-4.635-2.525-5.793zm-2.892 1.531c-.349.774-.809 1.544-1.395 2.15-.09-.646-.151-1.353-.184-2.108.533-.07 1.072-.083 1.579-.042zm-3.788.724c.062.947.169 1.818.317 2.596-1.996.365-2.076-1.603-.317-2.596zm11.236-1.745l-2.075-5.533 5.414-1.104-.976 1.868c2.999 2.418 4.116 5.645 4.532 8.132-1.736-2.913-3.826-4.478-5.885-5.321l-1.01 1.958zm-7.895 10.781l1.985 5.566-5.43 1.016 1.006-1.852c-2.96-2.465-4.021-5.654-4.397-8.148 1.689 2.94 3.749 4.483 5.794 5.36l1.042-1.942zm10.795-6.029"/></svg>';
// Add the icon before the selector
return $translate_icon . '<span style="margin-left: 5px;">' . $output . '</span>';
}
add_filter('pll_the_languages', 'polylang_add_translate_icon');
Εμφάνιση παραμετροποιήσιμης προειδοποίησης για την ύπαρξη ξενόγλωσσης έκδοσης
Αυτή η συνάρτηση δημιουργεί έναν σύντομο κωδικό για την εμφάνιση μιας προειδοποίησης με κίτρινο φόντο που μπορεί να προστεθεί οπουδήποτε σε μια δημοσίευση ή σελίδα. Αυτό το μήνυμα προειδοποιεί ότι το άρθρο έχει αγγλική μετάφραση με Polylang και παρέχει έναν σύνδεσμο προς την αγγλική έκδοση.
Επέλεξα αυτό το παράδειγμα επειδή το έχω χρησιμοποιήσει όταν ένα άρθρο, σε οποιαδήποτε γλώσσα, είχε μεγαλύτερη επισκεψιμότητα από αγγλόφωνες χώρες και από αγγλόφωνους φυλλομετρητές (το οποίο επίσης δεν εγγυάται ότι το άτομο που βρισκόταν πίσω από αυτό έψαχνε για την αγγλική έκδοση). Παρόλα αυτά, είναι ένας τρόπος για να εξασφαλιστεί η διατήρηση των επισκεπτών σε ορισμένες περιπτώσεις.
Κώδικας για να προσθέσετε στο functions.php
// English version notice
function polylang_translation_notice_shortcode() {
// Verifica si el plugin Polylang está activo
if (!function_exists('pll_the_languages')) {
return '';
}
// Get the ID of the current post
$post_id = get_the_ID();
// Get the English translation of the current post
$english_post_id = pll_get_post($post_id, 'en'); // 'en' es el código del idioma inglés
// Si no hay una traducción en inglés, no mostrará nada
if (!$english_post_id) {
return '';
}
// Get the link to the English version
$english_post_url = get_permalink($english_post_id);
// Crear el contenido del aviso
$ticker_content = sprintf(
'<div style="background-color: #ffffcc; padding: 10px; border-radius: 5px; margin-bottom: 20px; font-size: 14px;">
This article has an English version. <a href="%s" style="color: #0073e6; text-decoration: none; font-weight: bold;">Read</a>
</div>',
esc_url($english_post_url)
);
return $ticker_content;
}
add_shortcode('polylang_translation_notice', 'polylang_translation_notice_shortcode');
Στο στυλ μπορείτε να τροποποιήσετε το μήνυμα, το μέγεθος του κειμένου, τα χρώματα του κειμένου, το φόντο και τον σύνδεσμο σύμφωνα με τις προτιμήσεις σας.
Για να προσθέσετε το μήνυμα όπου θέλετε, απλά χρησιμοποιήστε αυτόν τον σύντομο κώδικα:
[polylang_translation_notice]
Με το CSS του παραδείγματος φαίνεται ως εξής.

Αν θέλετε να προσθέσετε μια ειδοποίηση στη μετάφραση σε άλλη γλώσσα, απλώς αλλάξτε τον κωδικό γλώσσας στο pll_get_post($post_id, 'en'); σε 'fr', 'de', 'it', κ.λπ. Εάν πρέπει να χρησιμοποιήσετε πολλές αναρτήσεις, μπορείτε να προσθέσετε διαφορετικά αποσπάσματα, ένα για κάθε γλώσσα. Θα μπορούσατε να τα προσθέσετε όλα σε ένα απόσπασμα, αλλά εγώ χρειαζόμουν μόνο ένα.