wpml-st-translations-file-components-find-plugin.php
2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
class WPML_ST_Translations_File_Components_Find_Plugin implements WPML_ST_Translations_File_Components_Find {
/** @var WPML_Debug_BackTrace */
private $debug_backtrace;
/** @var string */
private $plugin_dir;
/** @var array */
private $plugin_ids;
/**
* @param WPML_Debug_BackTrace $debug_backtrace
*/
public function __construct( WPML_Debug_BackTrace $debug_backtrace ) {
$this->debug_backtrace = $debug_backtrace;
$this->plugin_dir = realpath( WPML_PLUGINS_DIR );
}
public function find_id( $file ) {
$directory = $this->find_plugin_directory( $file );
if ( ! $directory ) {
return null;
}
return $this->get_plugin_id_by_directory( $directory );
}
private function find_plugin_directory( $file ) {
if ( false !== strpos( $file, $this->plugin_dir ) ) {
return $this->extract_plugin_directory( $file );
}
return $this->find_plugin_directory_in_backtrace();
}
private function find_plugin_directory_in_backtrace() {
$file = $this->find_file_in_backtrace();
if ( ! $file ) {
return null;
}
return $this->extract_plugin_directory( $file );
}
private function find_file_in_backtrace() {
$stack = $this->debug_backtrace->get_backtrace();
foreach ( $stack as $call ) {
if ( isset( $call['function'] ) && 'load_plugin_textdomain' === $call['function'] ) {
return $call['file'];
}
}
return null;
}
/**
* @param string $file_path
*
* @return string
*/
private function extract_plugin_directory( $file_path ) {
$dir = ltrim( str_replace( $this->plugin_dir, '', $file_path ), DIRECTORY_SEPARATOR );
$dir = explode( DIRECTORY_SEPARATOR, $dir );
return trim( $dir[0], DIRECTORY_SEPARATOR );
}
/**
* @param string $directory
*
* @return string|null
*/
private function get_plugin_id_by_directory( $directory ) {
foreach ( $this->get_plugin_ids() as $plugin_id ) {
if ( 0 === strpos( $plugin_id, $directory . '/' ) ) {
return $plugin_id;
}
}
return null;
}
/**
* @return string[]
*/
private function get_plugin_ids() {
if ( null === $this->plugin_ids ) {
$this->plugin_ids = array_keys( get_plugins() );
}
return $this->plugin_ids;
}
}