Skip to content

Commit

Permalink
Merge branch 'true-plugin'
Browse files Browse the repository at this point in the history
  • Loading branch information
MaximeCulea committed Mar 12, 2018
2 parents 9a77bee + 557b0b2 commit 023f6fe
Show file tree
Hide file tree
Showing 7 changed files with 393 additions and 33 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 1.1.0 - Mar 2018
* True (complet) plugin.
* Add check for ACF 5.6.

## 1.0.2 - 23 Dec 2017
* Refactor and reformat.
* Handle all options page and custom post_id.
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ This plugin is storing a value for each language into database. <b>That means at
# Requirements

- [WordPress](https://wordpress.org/) 4.7+
- Tested up to 4.9.1
- Tested up to 4.9.4
- PHP 5.6
- [Advanced Custom Fields](https://www.advancedcustomfields.com/pro)
- [Advanced Custom Fields](https://www.advancedcustomfields.com/pro) 5.6.0+
- [Polylang](https://polylang.pro/)

# Installation
Expand Down
195 changes: 195 additions & 0 deletions autoload.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
<?php namespace BEA\ACF_Options_For_Polylang;

/**
* An example of a general-purpose implementation that includes the optional
* functionality of allowing multiple base directories for a single namespace
* prefix.
*
* Given a foo-bar package of classes in the file system at the following
* paths ...
*
* /path/to/packages/foo-bar/
* src/
* Baz.php # Foo\Bar\Baz
* Qux/
* Quux.php # Foo\Bar\Qux\Quux
* tests/
* BazTest.php # Foo\Bar\BazTest
* Qux/
* QuuxTest.php # Foo\Bar\Qux\QuuxTest
*
* ... add the path to the class files for the \Foo\Bar\ namespace prefix
* as follows:
*
* <?php
* // instantiate the loader
* $loader = new \Example\Psr4AutoloaderClass;
*
* // register the autoloader
* $loader->register();
*
* // register the base directories for the namespace prefix
* $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
* $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');
*
* The following line would cause the autoloader to attempt to load the
* \Foo\Bar\Qux\Quux class from /path/to/packages/foo-bar/src/Qux/Quux.php:
*
* <?php
* new \Foo\Bar\Qux\Quux;
*
* The following line would cause the autoloader to attempt to load the
* \Foo\Bar\Qux\QuuxTest class from /path/to/packages/foo-bar/tests/Qux/QuuxTest.php:
*
* <?php
* new \Foo\Bar\Qux\QuuxTest;
*/
class Autoloader {
/**
* An associative array where the key is a namespace prefix and the value
* is an array of base directories for classes in that namespace.
*
* @var array
*/
protected $prefixes = array();

/**
* Register loader with SPL autoloader stack.
*
* @return void
*/
public function register() {
spl_autoload_register( array( $this, 'loadClass' ) );
}

/**
* Adds a base directory for a namespace prefix.
*
* @param string $prefix The namespace prefix.
* @param string $base_dir A base directory for class files in the
* namespace.
* @param bool $prepend If true, prepend the base directory to the stack
* instead of appending it; this causes it to be searched first rather
* than last.
*
* @return void
*/
public function addNamespace( $prefix, $base_dir, $prepend = false ) {
// normalize namespace prefix
$prefix = trim( $prefix, '\\' ) . '\\';

// normalize the base directory with a trailing separator
$base_dir = rtrim( $base_dir, DIRECTORY_SEPARATOR ) . '/';

// initialize the namespace prefix array
if ( isset( $this->prefixes[ $prefix ] ) === false ) {
$this->prefixes[ $prefix ] = array();
}

// retain the base directory for the namespace prefix
if ( $prepend ) {
array_unshift( $this->prefixes[ $prefix ], $base_dir );
} else {
array_push( $this->prefixes[ $prefix ], $base_dir );
}
}

/**
* Loads the class file for a given class name.
*
* @param string $class The fully-qualified class name.
*
* @return mixed The mapped file name on success, or boolean false on
* failure.
*/
public function loadClass( $class ) {
// the current namespace prefix
$prefix = $class;

// work backwards through the namespace names of the fully-qualified
// class name to find a mapped file name
while ( false !== $pos = strrpos( $prefix, '\\' ) ) {

// retain the trailing namespace separator in the prefix
$prefix = substr( $class, 0, $pos + 1 );

// the rest is the relative class name
$relative_class = substr( $class, $pos + 1 );

// try to load a mapped file for the prefix and relative class
$mapped_file = $this->loadMappedFile( $prefix, $relative_class );
if ( $mapped_file ) {
return $mapped_file;
}

// remove the trailing namespace separator for the next iteration
// of strrpos()
$prefix = rtrim( $prefix, '\\' );
}

// never found a mapped file
return false;
}

/**
* Load the mapped file for a namespace prefix and relative class.
*
* @param string $prefix The namespace prefix.
* @param string $relative_class The relative class name.
*
* @return mixed Boolean false if no mapped file can be loaded, or the
* name of the mapped file that was loaded.
*/
protected function loadMappedFile( $prefix, $relative_class ) {
// are there any base directories for this namespace prefix?
if ( isset( $this->prefixes[ $prefix ] ) === false ) {
return false;
}

// look through base directories for this namespace prefix
foreach ( $this->prefixes[ $prefix ] as $base_dir ) {

// replace the namespace prefix with the base directory,
// replace namespace separators with directory separators
// in the relative class name, append with .php
$file = $base_dir
. strtolower( str_replace( array( '\\', '_' ), array( '/', '-' ), $relative_class ) )
. '.php';

// if the mapped file exists, require it
if ( $this->requireFile( $file ) ) {
// yes, we're done
return $file;
}
}

// never found it
return false;
}

/**
* If a file exists, require it from the file system.
*
* @param string $file The file to require.
*
* @return bool True if the file exists, false if not.
*/
protected function requireFile( $file ) {
if ( file_exists( $file ) ) {
require $file;

return true;
}

return false;
}
}

// instantiate the loader
$loader = new \BEA\ACF_Options_For_Polylang\Autoloader;

// register the autoloader
$loader->register();

// register the base directories for the namespace prefix
$loader->addNamespace( 'BEA\ACF_Options_For_Polylang', BEA_ACF_OPTIONS_FOR_POLYLANG_DIR . 'classes' );
53 changes: 53 additions & 0 deletions bea-acf-options-for-polylang.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

/*
Plugin Name: BEA - ACF Options for Polylang
Version: 1.1.0
Plugin URI: https://github.com/BeAPI/acf-options-for-polylang
Description: Add ACF options page support for Polylang.
Author: Be API Technical team
Author URI: https://beapi.fr
Contributors: Maxime Culea
----
Copyright 2018 Be API Technical team ([email protected])
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/


// don't load directly
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}

// Plugin constants
define( 'BEA_ACF_OPTIONS_FOR_POLYLANG_VERSION', '1.1.0' );
define( 'BEA_ACF_OPTIONS_FOR_POLYLANG_MIN_PHP_VERSION', '5.6' );

// Plugin URL and PATH
define( 'BEA_ACF_OPTIONS_FOR_POLYLANG_URL', plugin_dir_url( __FILE__ ) );
define( 'BEA_ACF_OPTIONS_FOR_POLYLANG_DIR', plugin_dir_path( __FILE__ ) );
define( 'BEA_ACF_OPTIONS_MAIN_FILE_DIR', __FILE__ );
define( 'BEA_ACF_OPTIONS_FOR_POLYLANG_PLUGIN_DIRNAME', basename( rtrim( dirname( __FILE__ ), '/' ) ) );

/** Autoload all the things \o/ */
require_once BEA_ACF_OPTIONS_FOR_POLYLANG_DIR . 'autoload.php';

\BEA\ACF_Options_For_Polylang\Requirements::get_instance();

add_action( 'bea_acf_options_for_polylang_load', function () {
\BEA\ACF_Options_For_Polylang\Main::get_instance();
} );
55 changes: 24 additions & 31 deletions acf-options-for-polylang.php → classes/main.php
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
<?php

/*
Plugin Name: BEA - ACF Options for Polylang
Version: 1.0.2
Plugin URI: https://github.com/BeAPI/acf-options-for-polylang
Description: Add ACF options page support for Polylang.
Author: Be API Technical team
Author URI: https://beapi.fr
Contributors: Maxime Culea
----
Copyright 2017 Be API Technical team ([email protected])
*/

class BEA_ACF_For_Polylang {

function __construct() {
<?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 );

Expand All @@ -23,6 +15,8 @@ function __construct() {

// Get default Polylang's option page value
add_filter( 'acf/load_value', [ $this, 'get_default_value' ], 10, 3 );

add_action( 'init', [ $this, 'init_translations' ] );
}

/**
Expand Down Expand Up @@ -124,13 +118,17 @@ public function get_default_value( $value, $post_id, $field ) {
* @return array
*/
function get_option_page_ids() {
$rule = [
if ( ! function_exists( 'acf_get_valid_location_rule' ) ) {
return [];
}
$rule = [
'param' => 'options_page',
'operator' => '==',
'value' => 'acf-options',
'id' => 'rule_0',
'group' => 'group_0',
];

$rule = acf_get_valid_location_rule( $rule );
$options_pages = acf_get_location_rule_values( $rule );

Expand Down Expand Up @@ -186,17 +184,12 @@ function set_options_id_lang( $future_post_id, $original_post_id ) {

return $future_post_id;
}
}

/**
* Load at plugins loaded to ensure ACF and Polylang are used
*
* @since 1.0.2
* @author Maxime CULEA
*/
add_action( 'plugins_loaded', function () {
if ( ! function_exists( 'get_field' ) || ! function_exists( 'pll_current_language' ) ) {
return;

/**
* Load the plugin translation
*/
public function init_translations() {
// Load translations
load_plugin_textdomain( 'bea-acf-options-for-polylang', false, BEA_CPT_AGENT_PLUGIN_DIRNAME . '/languages' );
}
new BEA_ACF_For_Polylang();
} );
}
Loading

0 comments on commit 023f6fe

Please sign in to comment.