-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTaxonomyTrait.php
More file actions
131 lines (112 loc) · 3.4 KB
/
TaxonomyTrait.php
File metadata and controls
131 lines (112 loc) · 3.4 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
/**
* Taxonomy Trait
*
* @author Whizark <devaloka@whizark.com>
* @see http://whizark.com
* @copyright Copyright (C) 2015 Whizark.
* @license MIT
* @license GPL-2.0
* @license GPL-3.0
*/
namespace Devaloka\Component\Taxonomy;
use Devaloka\Component\PostType\PostTypeInterface;
use RuntimeException;
/**
* Trait TaxonomyTrait
*
* @package Devaloka\Taxonomy
*/
trait TaxonomyTrait
{
/**
* @var PostTypeInterface|string[] The object types that have the relation with the Taxonomy.
*/
protected $objectTypes = [];
/**
* Gets the Taxonomy key.
*
* @return string $taxonomy The Taxonomy key (must not exceed 32 characters).
*/
abstract public function getName();
/**
* Gets the Taxonomy options.
*
* @return mixed[] The options.
*/
public function getOptions()
{
return [];
}
/**
* Adds an object type to the Taxonomy.
*
* @param PostTypeInterface|string $objectType The object type.
*/
public function addObjectType($objectType)
{
/** @var string $objectTypeName */
$objectTypeName = ($objectType instanceof PostTypeInterface) ? $objectType->getName() : $objectType;
$taxonomyName = $this->getName();
if (taxonomy_exists($taxonomyName)) {
register_taxonomy_for_object_type($taxonomyName, $objectTypeName);
}
$this->objectTypes[$objectTypeName] = $objectType;
}
/**
* Removes an object type from the Taxonomy.
*
* @param PostTypeInterface|string $objectType The object type.
*/
public function removeObjectType($objectType)
{
/** @var string $objectTypeName */
$objectTypeName = ($objectType instanceof PostTypeInterface) ? $objectType->getName() : $objectType;
$taxonomyName = $this->getName();
if (taxonomy_exists($taxonomyName)) {
unregister_taxonomy_for_object_type($taxonomyName, $objectTypeName);
}
unset($this->objectTypes[$objectTypeName]);
}
/**
* Gets object types that have the relation with the Taxonomy.
*
* @return PostTypeInterface|string[] The object types.
*/
public function getObjectTypes()
{
$taxonomy = get_taxonomy($this->getName());
$objectTypes = ($taxonomy !== false) ? $taxonomy->object_type : [];
$objectTypes = array_combine($objectTypes, $objectTypes);
$objectTypes = array_merge($objectTypes, $this->objectTypes);
return $objectTypes;
}
/**
* Registers the Taxonomy.
*
* @throws RuntimeException If the Taxonomy cannot be registered.
*/
public function register()
{
$objectTypes = array_keys($this->objectTypes);
if (is_wp_error(register_taxonomy($this->getName(), $objectTypes, $this->getOptions()))) {
throw new RuntimeException('Cannot register the Taxonomy.');
}
}
/**
* Unregisters the Taxonomy.
*
* @throws \RuntimeException If the Taxonomy cannot be unregistered.
*/
public function unregister()
{
if (count($this->objectTypes) < 1) {
return;
}
foreach ($this->objectTypes as $objectTypeName => $value) {
if (!unregister_taxonomy_for_object_type($this->getName(), $objectTypeName)) {
throw new RuntimeException('Cannot unregister the Taxonomy.');
}
}
}
}