Polylangのための5つの便利なスニペット

Publicado: 05/02/2025 : 18:29 | Actualizado: 05/02/2025 : 19:09 |

コメントはありません

 

Polylangのための5つの便利なスニペット 0
2025年2月5日のキャプチャ

多言語ブログを作成するのに最適なプラグインについては様々な意見があり、どのプラグインも最初のバージョンから多くの進化を遂げ、作業を簡素化、容易化していますが、最も使われているプラグインの1つがPolylangです。

現在までに70万台以上が使用されており、最も軽量で効果的な選択肢のひとつとなっている。

以下はいつか役に立つかもしれない関数やフィルタを含むスニペットの 小さなリストです。これらはすべてPolylangのフリー版で動作し、ここでテストされたり使われたりしています。

無料版のPolylangを使用して、元の投稿からコンテンツをコピーする。

WordPressのPolylangプラグインの無料版を使っている方は、翻訳のために生成される新しいページや投稿が元のコンテンツをコピーしないことをすでにご存知でしょう。これは有料版の機能の一つで、無料版ではコンテンツを手で貼り付ける必要があります。

これを解決し、プロセスをスピードアップするには、テンプレートの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' );

*Thissnippetは2020年12月のノートで見つかりました。まだ動作していますが、時間や今後の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');

ここで直面する問題の一つは、このブログのように、サイトに多くの異なる言語の記事がある場合、データベースクエリの影響が読み込み速度を低下させる可能性があることです。このコードではこの点を考慮し、投稿オブジェクト全体を読み込まないことでメモリのオーバーヘッドを減らすために、フィールド => 'ids'の WP_Queryを使用してクエリを最適化しています。

投稿数はset_transientを使用して保存され、反復的なデータベースクエリを回避します。この例では、キャッシュは秒単位で12時間ごとに更新されます (この時間は必要に応じて調整できます)。

クエリを最適化するために、found_postsにアクセスするためにget_postsの代わりにWP_Queryが使用されます。

fields => 'ids'パラメータは、投稿IDのみを取得することでメモリ負荷を軽減します。

手動でキャッシュをクリアする必要がある場合(新しい投稿を公開した後など)、古いデータを表示しないようにすることができます:

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には、ショートコードの動作例があります。

任意のページや投稿にネイティブのポリランバナーを追加する

Polylangには249個の 16x11のフラグが.pngで含まれているので、HTMLやCSSを書かなくても、リストを飾ったり、表や 段落に追加したりすることができます。

この機能により、プラグインが使用するネイティブバナーの画像をショートコードで追加することができます。

これらを利用可能にするには、子テーマの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のページや投稿で、対応する国番号のショートコードを使用することができます

[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]

//Original size
[polylang_flag code="de"]

旗の大きさを変えるには、ショートコードのsize属性の値を変更するだけです。

あなた自身のバナーを作成し、使用したい場合、または異なるデザインの別のコレクションを持っている、ちょうど別の名前で新しいフォルダに新しいもの(.pngで)ホストし(そうでなければ、プラグインが更新されたときに変更を失うことになる)、コードに新しいパスを追加します。例えば

$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');

言語セレクタの横にSVGアイコンを追加する

このスニペットは、Polylangの母国語セレクタの左に "Translate "シンボルのSVGアイコンを追加し、より視覚的にアピールし、訪問者の注意を引くようにします。 この例では、アイコンは私がこのブログで使っているものです。一番気に入ったものを探して置き換えることができます。いくつかご紹介しましょう

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を使うと、次のようになる。

薄い黄色の背景に14pxの黒文字、青いリンク。

他の言語の翻訳に告知を追加したい場合は、pll_get_post($post_id, 'en');の言語コードを'fr', 'de', 'it'などに変更するだけです。複数の投稿を使用する必要がある場合は、各言語ごとに異なるスニペットを追加できます。1つのスニペットですべてを追加することもできますが、私は1つだけ必要でした。


Suscríbete por email para recibir las viñetas y los artículos completos y sin publicidad

関連記事

コメントする

Este blog se aloja en LucusHost

Lucushot, el mejor hosting

電子メールによる購読

広告なしの記事全文を、公開と同時に無料で受信できます。 フィードの全コンテンツは、外部サービスを通じて広告なしで送信されます。