PluginProbe
Polylang / 2.3.8
Polylang v2.3.8
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 2.3.8, at include/mo.php

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