<?php
|
namespace JVBase\registrar\config\seo;
|
|
use JVBase\registrar\Registrar;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
class Meta {
|
protected string $slug;
|
|
protected string $title;
|
protected array $titleConfig = [
|
'maxLength' => 60,
|
'alts' => []
|
];
|
protected string $description;
|
protected array $descriptionConfig = [
|
'maxLength' => 120,
|
'alts' => []
|
];
|
protected int $image;
|
protected int $twitterImage;
|
|
|
public function __construct(string $slug) {
|
$this->slug = $slug;
|
|
$this->titleConfig['alts'] = apply_filters(BASE.jvbNoBase($slug).'TitleAlts', []);
|
add_action('init', [$this, 'init']);
|
}
|
|
public function init():void {
|
if (!function_exists('tsf')){
|
return;
|
}
|
|
if ($this->hasTitle()){
|
add_filter('the_seo_framework_title_from_generation', [$this, 'filterTitle'], 10, 2);
|
}
|
if ($this->hasDescription()){
|
add_filter('the_seo_framework_generated_description', [$this, 'filterDescription'], 10, 3);
|
}
|
if ($this->hasImage()){
|
add_filter('the_seo_framework_image_generation_params', [$this, 'filterImage'], 10, 3);
|
}
|
}
|
|
public function setAlts(array $alts, string $type = 'title'):void
|
{
|
foreach (array_values($alts) as $i => $alt) {
|
if (!is_string($alt)) {
|
error_log('[Registrar.config.Meta]:setAlts invalid string attempted: '.print_r($alt, true));
|
unset($alts[$i]);
|
}
|
}
|
switch ($type) {
|
case 'title':
|
$this->titleConfig['alts'] = $alts;
|
break;
|
case 'description':
|
$this->descriptionConfig['alts'] = $alts;
|
break;
|
default:
|
error_log('[Registrar.config.Meta]:setAlts invalid type attempted: '.print_r($type, true));
|
|
}
|
}
|
|
public function hasTitle():bool
|
{
|
return !empty($this->title);
|
}
|
public function hasDescription():bool
|
{
|
return !empty($this->description);
|
}
|
public function hasImage():bool
|
{
|
return !empty($this->image);
|
}
|
public function hasTwitterImage():bool
|
{
|
return !empty($this->twitterImage);
|
}
|
|
public function testLength(int $ID, string $result, string $type):string
|
{
|
$maxLength = match($type) {
|
'title' => $this->titleConfig['maxLength'],
|
'description' => $this->descriptionConfig['alts'],
|
default => false
|
};
|
if (!$maxLength) {
|
error_log('[Registrar.config.Meta]:testLength invalid type: '.$type);
|
return $result;
|
}
|
$alts = match($type) {
|
'title' => $this->titleConfig['alts'],
|
'description' => $this->descriptionConfig['alts'],
|
};
|
|
|
usort($alts, fn($a, $b) => mb_strlen($b) <=> mb_strlen($a));
|
|
|
$meta = new \JVBase\meta\Meta($ID, Registrar::getInstance($this->slug)->getType());
|
foreach ($alts as $alt) {
|
$alt = Resolver::resolve($alt, $meta);
|
$r = $result.' '.trim($alt);
|
if (mb_strlen($r) <= $maxLength) {
|
return $r;
|
}
|
}
|
return rtrim($result, $maxLength - 3).'...';
|
}
|
|
public function filterTitle(string $title, ?array $args): string
|
{
|
error_log('Filtering title...');
|
if (jvbTSFDoIt($this->slug, $args)){
|
return $title;
|
}
|
$ID = jvbTSFGetID($args);
|
|
|
$meta = new \JVBase\meta\Meta($ID, Registrar::getInstance($this->slug)->getType());
|
$resolved = Resolver::resolve($this->title, $meta);
|
$resolved = $this->testLength($ID, $resolved, 'title');
|
return $resolved;
|
}
|
|
public function filterDescription(string $description, ?array $args): string
|
{
|
if (jvbTSFDoIt($this->slug, $args)){
|
return $description;
|
}
|
$ID = jvbTSFGetID($args);
|
|
$meta = new \JVBase\meta\Meta($ID, Registrar::getInstance($this->slug)->getType());
|
return Resolver::resolve($this->title, $meta);
|
}
|
public function filterImage(string $image, ?array $args): string
|
{
|
if (jvbTSFDoIt($this->slug, $args)){
|
return $image;
|
}
|
$ID = jvbTSFGetID($args);
|
|
$meta = new \JVBase\meta\Meta($ID, Registrar::getInstance($this->slug)->getType());
|
return Resolver::resolve($this->title, $meta);
|
}
|
}
|