website/wp-content/plugins/acf-options-for-polylang/classes/main.php

185 lines
4.8 KiB
PHP

<?php
namespace BEA\ACF_Options_For_Polylang;
class Main {
/**
* Use the trait
*/
use Singleton;
protected function init() {
// Set the setting's lang
add_filter( 'acf/validate_post_id', [ $this, 'set_options_id_lang' ], 10, 2 );
// Set Polylang current lang
add_filter( 'acf/settings/current_language', [ $this, 'set_current_site_lang' ] );
// Get default Polylang's option page value
add_filter( 'acf/load_value', [ $this, 'get_default_value' ], 10, 3 );
// Help loading right field for repeaters
add_filter( 'acf/load_reference', [ $this, 'get_default_reference' ], 10, 3 );
// Plugin's own translations
add_action( 'init', [ $this, 'init_translations' ] );
}
/**
* Get the current Polylang's locale or the wp's one
*
* @return bool|string
* @author Maxime CULEA
*
*/
public function set_current_site_lang() {
return pll_current_language( 'locale' );
}
/**
* Load the correct reference for field key in have_rows loops
*
* @param $reference
* @param $field_name
* @param $post_id
*
* @return string
* @since 1.1.2
*
* @author Jukra, Maxime CULEA
*
*/
public function get_default_reference( $reference, $field_name, $post_id ) {
if ( ! empty( $reference ) ) {
return $reference;
}
/**
* Dynamically get the options page ID
* @see : https://regex101.com/r/58uhKg/2/
*/
$_post_id = preg_replace( '/(_[a-z]{2}_[A-Z]{2})/', '', $post_id );
remove_filter( 'acf/load_reference', [ $this, 'get_default_reference' ] );
$reference = acf_get_reference( $field_name, $_post_id );
add_filter( 'acf/load_reference', [ $this, 'get_default_reference' ], 10, 3 );
return $reference;
}
/**
* Load default value (all languages) in front if none found for an acf option
*
* @param $value
* @param $post_id
* @param $field
*
* @return mixed|string|void
* @author Maxime CULEA
*
*/
public function get_default_value( $value, $post_id, $field ) {
if ( is_admin() || ! Helpers::is_option_page( $post_id ) ) {
return $value;
}
$original_post_id = Helpers::original_option_id( $post_id );
/**
* Activate or deactivate the default value (all languages) for the given post id
*
* @param bool $show_default : whatever to show default for the given post id
* @param string $original_post_id : the original post id without lang attributes
*
* @since 1.0.4
*/
if ( ! apply_filters( 'bea.aofp.get_default', true, $original_post_id ) ) {
return $value;
}
/**
* According to his type, check the value to be not an empty string.
* While false or 0 could be returned, so "empty" method could not be here useful.
*
* @see https://github.com/atomicorange : Thx to atomicorange for the issue
*
* @since 1.0.1
*/
if ( ! is_null( $value ) ) {
if ( is_array( $value ) ) {
// Get from array all the not empty strings
$is_empty = array_filter( $value, function ( $value_c ) {
return '' !== $value_c;
} );
if ( ! empty( $is_empty ) ) { // Not an array of empty values
return $value;
}
} elseif ( 'repeater' !== $field['type'] ) {
if ( '' !== $value ) { // Not an empty string
return $value;
}
}
}
/**
* Delete filters for loading "default" Polylang saved value
* and for avoiding infinite looping on current filter
*/
remove_filter( 'acf/settings/current_language', [ $this, 'set_current_site_lang' ] );
remove_filter( 'acf/load_value', [ $this, 'get_default_value' ] );
// Get the "All language" value
$value = acf_get_value( $original_post_id, $field );
/**
* Re-add deleted filters
*/
add_filter( 'acf/settings/current_language', [ $this, 'set_current_site_lang' ] );
add_filter( 'acf/load_value', [ $this, 'get_default_value' ], 10, 3 );
return $value;
}
/**
* Manage to change the post_id with the current lang to save option against
*
* @param string $future_post_id
* @param string $original_post_id
*
* @return string
* @author Maxime CULEA
*
* @since 1.0.2
*/
public function set_options_id_lang( $future_post_id, $original_post_id ) {
// Only on custom post id option page
if ( ! Helpers::is_option_page( $original_post_id ) ) {
return $future_post_id;
}
if ( Helpers::already_localized( $future_post_id ) ) {
return $future_post_id;
}
// If no custom acf key, no need while already impacted by Polylang locale
if ( 'options' !== Helpers::original_option_id( $future_post_id ) ) {
$dl = acf_get_setting( 'default_language' );
$cl = acf_get_setting( 'current_language' );
if ( $cl && $cl !== $dl ) {
$future_post_id .= '_' . $cl;
}
}
return $future_post_id;
}
/**
* Load the plugin translation
*/
public function init_translations() {
// Load translations
load_plugin_textdomain( 'bea-acf-options-for-polylang', false, BEA_ACF_OPTIONS_FOR_POLYLANG_PLUGIN_DIRNAME . '/languages' );
}
}