<?php
namespace Koselig\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Koselig\Exceptions\UnsatisfiedDependencyException;
use Koselig\Support\Action;
use Koselig\Support\Wordpress;
use Watson\Rememberable\Rememberable;
class Meta extends Model
{
use Rememberable;
public $timestamps = false;
public static $cache = [];
protected $rememberFor;
protected $primaryKey = 'meta_id';
protected $table = DB_PREFIX . 'postmeta';
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
if (Wordpress::multisite() && (Wordpress::getSiteId() !== 0 && Wordpress::getSiteId() !== 1)) {
$this->setTable(DB_PREFIX . Wordpress::getSiteId() . '_postmeta');
}
if (config('wordpress.caching')) {
$this->rememberFor = config('wordpress.caching');
} else {
unset($this->rememberFor);
}
}
public static function get($page = null, $name = null)
{
if (is_object($page) && (is_subclass_of($page, Post::class) || $page instanceof Post)) {
$page = $page->ID;
}
if (!ctype_digit((string) $page) && $name === null) {
$name = $page;
$page = null;
}
if ($page === null) {
$page = Wordpress::id();
}
if (!isset(static::$cache[$page])) {
static::$cache[$page] = static::where('post_id', $page)->get();
}
if ($name === null) {
return static::$cache[$page]->mapWithKeys(function ($item) {
return [$item->meta_key => $item->meta_value];
})->all();
}
$value = static::$cache[$page]->where('meta_key', $name)->first();
return empty($value) ? null : $value->meta_value;
}
public static function acf($page = null, $name = null, $format = true)
{
if (!function_exists('acf_format_value')) {
throw new UnsatisfiedDependencyException('Advanced Custom Fields must be installed to use field');
}
if (is_object($page) && (is_subclass_of($page, Post::class) || $page instanceof Post)) {
$page = $page->ID;
}
if (!ctype_digit((string) $page) && $name === null) {
$name = $page;
$page = null;
}
if ($page === null) {
$page = Wordpress::id();
}
$value = static::get($page, $name);
if (is_serialized($value)) {
$value = @unserialize($value);
}
$field = static::get($page, '_' . $name);
if (!acf_is_field_key($field)) {
return;
}
$field = get_field_object($field, $name, false, false);
$value = Action::filter('acf/load_value', $value, $page, $field);
$value = Action::filter('acf/load_value/type=' . $field['type'], $value, $page, $field);
$value = Action::filter('acf/load_value/name=' . $field['_name'], $value, $page, $field);
$value = Action::filter('acf/load_value/key=' . $field['key'], $value, $page, $field);
if ($format) {
$value = acf_format_value($value, $page, $field);
}
return $value;
}
public function post()
{
return $this->belongsTo(Post::class);
}
}