PluginProbe
Polylang / 3.0.2
Polylang v3.0.2
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
polylang / include / mo.php

mo.php in Polylang 3.0.2, at include/mo.php

127 lines 3.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package Polylang
4 */
5
6 /**
7 * Manages strings translations storage
8 *
9 * @since 1.2
10 * @since 2.1 Stores the strings in a post meta instead of post content to avoid unserialize issues (See #63)
11 */
12 class PLL_MO extends MO {
13
14 /**
15 * Registers the polylang_mo custom post type, only at first object creation
16 *
17 * @since 1.2
18 */
19 public function __construct() {
20 if ( ! post_type_exists( 'polylang_mo' ) ) {
21 $labels = array( 'name' => __( 'Strings translations', 'polylang' ) );
22 register_post_type( 'polylang_mo', array( 'labels' => $labels, 'rewrite' => false, 'query_var' => false, '_pll' => true ) );
23
24 add_action( 'pll_add_language', array( $this, 'clean_cache' ) );
25 }
26 }
27
28 /**
29 * Writes a PLL_MO object into a custom post meta.
30 *
31 * @since 1.2
32 *
33 * @param PLL_Language $lang The language in which we want to export strings.
34 * @return void
35 */
36 public function export_to_db( $lang ) {
37 $this->add_entry( $this->make_entry( '', '' ) ); // Empty string translation, just in case
38
39 /*
40 * It would be convenient to store the whole object but it would take a huge space in DB.
41 * So let's keep only the strings in an array.
42 * The strings are slashed to avoid breaking slashed strings in update_post_meta.
43 * @see https://codex.wordpress.org/Function_Reference/update_post_meta#Character_Escaping.
44 */
45 $strings = array();
46 foreach ( $this->entries as $entry ) {
47 $strings[] = wp_slash( array( $entry->singular, $this->translate( $entry->singular ) ) );
48 }
49
50 if ( empty( $lang->mo_id ) ) {
51 $post = array(
52 'post_title' => 'polylang_mo_' . $lang->term_id,
53 'post_status' => 'private', // To avoid a conflict with WP Super Cache. See https://wordpress.org/support/topic/polylang_mo-and-404s-take-2
54 'post_type' => 'polylang_mo',
55 );
56 $mo_id = wp_insert_post( $post );
57 update_post_meta( $mo_id, '_pll_strings_translations', $strings );
58 } else {
59 update_post_meta( $lang->mo_id, '_pll_strings_translations', $strings );
60 }
61 }
62
63 /**
64 * Reads a PLL_MO object from a custom post meta.
65 *
66 * @since 1.2
67 *
68 * @param PLL_Language $lang The language in which we want to get strings.
69 * @return void
70 */
71 public function import_from_db( $lang ) {
72 if ( ! empty( $lang->mo_id ) ) {
73 $strings = get_post_meta( $lang->mo_id, '_pll_strings_translations', true );
74 if ( is_array( $strings ) ) {
75 foreach ( $strings as $msg ) {
76 $this->add_entry( $this->make_entry( $msg[0], $msg[1] ) );
77 }
78 }
79 }
80 }
81
82 /**
83 * Returns the post id of the post storing the strings translations.
84 *
85 * @since 1.4
86 *
87 * @param PLL_Language $lang The language object.
88 * @return int
89 */
90 public static function get_id( $lang ) {
91 global $wpdb;
92
93 $ids = wp_cache_get( 'polylang_mo_ids' );
94
95 if ( empty( $ids ) ) {
96 $ids = $wpdb->get_results( "SELECT post_title, ID FROM $wpdb->posts WHERE post_type='polylang_mo'", OBJECT_K );
97 wp_cache_add( 'polylang_mo_ids', $ids );
98 }
99
100 // The mo id for a language can be transiently empty
101 return isset( $ids[ 'polylang_mo_' . $lang->term_id ] ) ? $ids[ 'polylang_mo_' . $lang->term_id ]->ID : null;
102 }
103
104 /**
105 * Invalidate the cache when adding a new language
106 *
107 * @since 2.0.5
108 *
109 * @return void
110 */
111 public function clean_cache() {
112 wp_cache_delete( 'polylang_mo_ids' );
113 }
114
115 /**
116 * Deletes a string
117 *
118 * @since 2.9
119 *
120 * @param string $string The source string to remove from the translations.
121 * @return void
122 */
123 public function delete_entry( $string ) {
124 unset( $this->entries[ $string ] );
125 }
126 }
127