我正在制作一个类,以向Metapress.io的扩展功能的Wordpress添加元框。
现在,您通常会拥有具有相同属性的元框(例如,相同的帖子类型)。我想对它们进行分组,因此您不必重复这些属性。
我有一个add()
仅添加一个metabox的函数。
现在,我希望该group()
方法执行以下操作:
$manager->group([
'post_types' =>'page',
], function() use ($manager) {
$manager->add('metaboxfromgroup', [
'title' => __( 'Metabox added from group!', 'textdomain' ),
'context' => 'normal',
'fields' => [
[
'name' => __( 'Here is a field', 'textdomain' ),
'id' => 'fname',
'type' => 'text',
],
]
]);
});
因此,我的group()
方法接受一个属性数组,该属性数组需要添加到add()
Closure中每个单个属性的数组中。
Laravel使用Routes确实做到了这一点,看起来像这样:
Route::group(['middleware' => 'auth'], function () {
Route::get('/', function () {
// Uses Auth Middleware
});
Route::get('user/profile', function () {
// Uses Auth Middleware
});
});
实现此目标的最佳方法是什么?
编辑:
这是我的Metabox管理器课程
namespace Vendor\Lib;
use Vendor\App\Config as Config;
final class Metabox {
/** @var string */
protected $prefix;
/** @var array */
static private $metaboxes = [];
public static function getInstance()
{
static $inst = null;
if ($inst === null) {
$inst = new Metabox();
}
return $inst;
}
/**
* Metabox constructor.
*
* @param string $prefix
*/
private function __construct() {
$this->prefix = Config::get('metabox.prefix');
}
/**
* Add a new metabox.
*
* @param string $id
* @param array $attributes
*/
public function add( $id, array $attributes ) {
$attributes['id'] = $id;
array_walk_recursive( $attributes, function ( &$value, $key ) {
if (
$key === 'id'
&& substr( $value, 0, strlen( $this->prefix ) ) !== $this->prefix
) {
$value = $this->prefix . $value; // auto prefix
}
} );
self::$metaboxes[] = $attributes;
}
public function group( $attributes, $function) {
// here comes group method
}
/**
* Register the metaboxes.
*/
public function register() {
add_filter( 'rwmb_meta_boxes', function () {
return self::$metaboxes;
} );
}
}
这是一个建议。调用该group
方法时,您可以将可共享信息存储在您的类中,以后再在您的add
方法中使用它。
final class Metabox {
private $group = [];
...
}
public function group( $attributes, $function) {
$this->group = $attributes;
$function(); // Invoke the closure, I don't remember if this is the right way.
$this->group = []; // Clean up the group.
}
现在,对于add
方法。
/**
* Add a new metabox.
*
* @param string $id
* @param array $attributes
*/
public function add( $id, array $attributes ) {
if(!empty($this->group))
$attributes = array_merge($group, $attributes);
$attributes['id'] = $id;
array_walk_recursive( $attributes, function ( &$value, $key ) {
if (
$key === 'id'
&& substr( $value, 0, strlen( $this->prefix ) ) !== $this->prefix
) {
$value = $this->prefix . $value; // auto prefix
}
} );
self::$metaboxes[] = $attributes;
}
旁注:通过将array_merge$attributes
用作第二个参数,您可以覆盖仅用于特定添加的组值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句