Search code examples
phpjoomlaseo

Use the Joomla Language override to create custom <title> tags


I have this piece of code that already runs on the pages I need this done. (The entire Joomla 3.9 site is a Frankenstein of custom code, components, etc. )

   $placeholder_country = JText::_('COM_ACME_PLACEHOLDER_COUNTRY_'.strtoupper(str_replace('-','_',$var['country'])));
    if($placeholder_country === 'COM_ACME_PLACEHOLDER_COUNTRY_'.strtoupper(str_replace('-','_',$var['country'])) || !$placeholder_country) $placeholder_country = '';

    $article->text = JString::str_ireplace("{%placeholder_country%}", $placeholder_country, $article->text);

I tried adding the following to see if I can get this to set the title the same way.

     $placeholder_country = JText::_('titlenick_'.strtoupper(str_replace('-','_',$var['country'])));
    if($placeholder_country === 'titlenick_'.strtoupper(str_replace('-','_',$var['country'])) || !$placeholder_country) $placeholder_country = '';

    $document->setTitle = JString::str_ireplace("{%placeholder_country%}", $placeholder_country, $article->text);

Meaning, I go into the Joomla Language overrides section, add the Language Constant, for example, "TITLENICK_PERU"

In the "text" Id enter the page title I want. "Cheap Peru vacations" for example.

EDIT:

Attempting to solve using the below answer from Anibal:

After said insight was given, progress was made.

I've confirmed this works

  $placeholder_nicktitle = JText::_('titlenick_'.strtoupper(str_replace('-','_',$var['country'])));
if($placeholder_nicktitle === 'titlenick_'.strtoupper(str_replace('-','_',$var['country'])) || !$placeholder_nicktitle) $placeholder_nicktitle = '';

$article->text = JString::str_ireplace("{%placeholder_nicktitle%}", $placeholder_nicktitle, $article->text);

Placing {%placeholder_nicktitle%} in the Joomla article caused the override to trigger and displays the text I typed in the override.

Now the question is how do I get this to work so that whatever text I type in the override "text" field will end up being the page title?

I imagine this needs to change

$article->text = JString::str_ireplace("{%placeholder_nicktitle%}", $placeholder_nicktitle, $article->text);

It was a long shot, but I tried replacing the above line with this ( and it threw a 500 error)

$document =& JFactory::getDocument();
$document->setTitle("JString::str_ireplace(". 
{%placeholder_nicktitle%}", $placeholder_nicktitle, $article- 
 >text);");

Side note: Right now the page gets it's title from the Joomla article title itself "{%country_name%} cheap vacations" is what we have in there for example. Custom coded I believe. I tried adding {%placeholder_nicktitle%} in the Joomla article title and that didn't work for some reason


Solution

  • There are several points to observe in your piece of code. So, this is more a code review than an answer to a question.

    The first part of the code generates a LABEL, and then the second part uses the Joomla Language system to generate the translated text.

    First, I would confirm if the PHP code generates the expected label: COM_ACME_PLACEHOLDER_COUNTRY_PERU or TITLENICK_PERU.

    Then, the easy part, confirm that if you write: JString::str_ireplace("{%placeholder_country%}", $placeholder_country, $article->text); when the label is correctly generated; it gets replaced as you define in the Language Overrides section.

    In case of doubt, the Joomla function JString::str_ireplace is just a wrapper of the PHP function so that you can check the original documentation here: https://www.php.net/str_ireplace

    To sum up, the problem seems to be caused by the added complexity of the two parts. If you divide them, you can solve each part separately.