Skip to content

Commit

Permalink
MetaComponents instead of MetaTags, handle VirtualPages
Browse files Browse the repository at this point in the history
  • Loading branch information
lerni committed Mar 19, 2024
1 parent 36495ca commit 4257c06
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 20 deletions.
3 changes: 2 additions & 1 deletion lang/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ de:
DorsetDigital\SilverStripeCanonical\SiteTreeCanonicalExtension:
LinkOverride: 'Canonical URL übersteuern'
LinkOverrideDesc: 'Nur verwenden, wenn eine andere URL als "Original" gekennzeichnet werden soll.'
LinkOverrideVirtualDesc: 'Die verlinkte Seite wird verwendet.'
LinkFieldPlaceholder: 'Canonical-URLs benötigt eine Canoinical-Domain in <a href="/admin/settings">SiteConfig</a>'
LinkFieldRightTitle: 'Wird verwendet um die Originalresource (URL) auszuweisen und "Duplicate Content" zu verhindern.'
LinkFieldRightTitle: 'Wird verwendet um die Originalresource (URL) auszuweisen und "Duplicate Content" zu verhindern.'
37 changes: 18 additions & 19 deletions src/SiteTreeCanonicalExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use SilverStripe\Forms\LiteralField;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\CMS\Model\SiteTreeExtension;
use SilverStripe\CMS\Model\VirtualPage;

class SiteTreeCanonicalExtension extends SiteTreeExtension
{
Expand All @@ -23,6 +24,11 @@ public function updateCMSFields(FieldList $fields)
$MetaCanonical
->setAttribute('placeholder', $this->getorsetCanonicalURL())
->setDescription(_t(__CLASS__ . '.LinkOverrideDesc', 'Only set this if another URL should count as the original (e.g. of reposting a blog post from another source).'));
if ($this->owner->ClassName == VirtualPage::class) {
$MetaCanonical
->setReadonly(true)
->setDescription(_t(__CLASS__ . '.LinkOverrideVirtualDesc', 'Linked page will be used.'));
}
} else {
$MetaToggle->push($MetaCanonical = LiteralField::create("CanonicalURL", '<p class="form__field-label">' . _t(__CLASS__ . '.LinkFieldPlaceholder', 'Canonical-URLs needs a Canoinical-Domain in <a href="/admin/settings">SiteConfig</a>') . '</p>'));
}
Expand All @@ -46,6 +52,11 @@ function getorsetCanonicalURL()
$link = $this->owner->CanonicalURL;
}

// use CopyContentFrom()->Link() for VirtualPage
if ($this->owner->ClassName == VirtualPage::class) {
$link = $this->owner->CopyContentFrom()->Link();
}

// add canonicalBase if relative URL
if (isset($link)) {
$urlArray = parse_url($link);
Expand All @@ -61,28 +72,16 @@ function getorsetCanonicalURL()
}
}

public function MetaTags(&$tags)
public function MetaComponents(array &$tags)
{
if ($canonLink = $this->getorsetCanonicalURL()) {
$atts = [
'rel' => 'canonical',
'href' => $canonLink
$tags['canonical'] = [
'tag' => 'link',
'attributes' => [
'rel' => 'canonical',
'href' => $canonLink
]
];
$canonTag = HTML::createTag('link', $atts);

$tagsArray = explode(PHP_EOL, $tags);
$tagPattern = 'rel="canonical"';

$tagSearch = function ($val) use ($tagPattern) {
return (stripos($val ?? '', $tagPattern) !== false ? true : false);
};

$currentTags = array_filter($tagsArray, $tagSearch);
$cleanedTags = array_diff($tagsArray, $currentTags);

$cleanedTags[] = $canonTag;

$tags = implode(PHP_EOL, $cleanedTags);
}
}
}

0 comments on commit 4257c06

Please sign in to comment.