Definir título e meta título diferentes para uma página

7

Estou criando uma página simples na minha instância do Magento 2.
no controlador dessa página, estou tentando definir um título para a página e um meta título que devem ser diferentes.
Mas eu não sou capaz de fazer isso.
Meu arquivo de layout para a ação está quase vazio:

<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
    </body>

</page>

e minha ação do controlador fica assim:

namespace [Namespace]\[Module]\Controller\[Entity];

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

class Index extends Action
{
    protected $resultPageFactory;
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    ) {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }
    public function execute()
    {
        $resultPage = $this->resultPageFactory->create();
        $resultPage->getConfig()->getTitle()->set('Something');
    }
}

O resultado é este:

Mas o meta título é o mesmo que o título ( Something).
Alterando a linha no controlador:

$resultPage->getConfig()->getTitle()->set('Something');

para

$resultPage->getConfig()->getTitle()->set('Something else');  

resulta no título (tag H1) e no meta título mudando para something else.

Como definir um meta título diferente e um título (tag h1) para uma página

Marius
fonte

Respostas:

13

Foi assim que consegui obter títulos meta e títulos de página diferentes. Eu tenho o código abaixo na minha classe de bloco:

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Framework\View\Page\Config $pageConfig,
    $data = array()
) {
    $this->_scopeConfig = $scopeConfig; 
    $this->_pageConfig = $pageConfig;   

    parent::__construct($context, $data);
}

 /**
 * Prepare global layout
 *
 * @return $this
 */
protected function _prepareLayout()
{
    $this->_pageConfig->addBodyClass('advance-sitemap');

    if($this->getSeoTitle())
        $this->_pageConfig->getTitle()->set('Meta Title');

    if($this->getMetaKeywords())        
        $this->_pageConfig->setKeywords('Meta Keywords');

    if($this->getMetaDescription())         
        $this->_pageConfig->setDescription('Meta Description');

    $pageMainTitle = $this->getLayout()->getBlock('page.main.title');
    if ($pageMainTitle) {
        $pageMainTitle->setPageTitle('Page Heading Title');
    }

    return parent::_prepareLayout();
}

[EDIT by OP]
Você também pode definir o título da página do controlador, assim:

$resultPage = $this->resultPageFactory->create();
$pageMainTitle = $resultPage->getLayout()->getBlock('page.main.title');
if ($pageMainTitle && $pageMainTitle instanceof \Magento\Theme\Block\Html\Title) {
    $pageMainTitle->setPageTitle('Page title here');
}
//rest of the code here.
Pankaj Pareek
fonte
1
Não sei se definir o título da página a partir de um bloco de conteúdo é a melhor ideia, mas sua resposta me levou na direção certa. A configuração do título da página no page.main.titlebloco também funciona nos controladores. Obrigado.
Marius
Olá, obrigado por compartilhar isso. Você gostaria de compartilhar o código inteiro em sua resposta (é Main.php ?; ..layout.xml; template.phtml) que você usou para isso? De alguma forma, não consigo reproduzir / não vejo nenhum resultado no meu caso. Isso seria super incrível!
eskaliert
0

Que tal usar:

$resultPage->getConfig()->getMetadata()->setMetadata('title', 'Something else');

para o título meta.

belfort1
fonte
isso não funciona. ->getMetadata()retorna uma matriz para que eu não possa chamar setMetadatao resultado. E remover getMetadatada linha resulta apenas em um erro Object of class Magento\Framework\View\Page\Title could not be converted to string.
Marius
usando setMetadata (), você pode definir propriedades meta personalizadas como $ resultPage-> getConfig () -> getMetadata () -> setMetadata ('meta_title', 'Algo mais');
Jaimin Parikh
@JaiminParikh. Você não pode encadear as 2 chamadas getMetadata()->setMetadataporque getMetadataretorna uma matriz e não pode chamar um método a partir de uma matriz. Eu expliquei isso no comentário acima. Mas eu tentei com $resultPage->getConfig()->setMetadata('meta_title', 'Something else');e não há mudanças. Eu acho que isso não funciona, porque não há <meta name="title"...processado na página. o título é processado como<title>...</title>
Marius
@ Marius sim, eu estou errado nisso. mas usando $ resultPage-> getConfig () -> setMetadata ('meta_title', 'Algo mais'); , t criará uma nova metatag com o nome "meta_title" e não será útil.
Jaimin Parikh
0

Apenas tentei uma nova extensão personalizada, funciona para mim:

public function execute() {
    $resultPage = $this->resultPageFactory->create();
    // Handling page title
    $resultPage->getLayout()->getBlock('page.main.title')->setPageTitle('Page title here');
    // Handling meta_title, meta_description and meta_keywords
    $resultPage->getConfig()->getTitle()->set("Title");
    $resultPage->getConfig()->setDescription("Description");
    $resultPage->getConfig()->setKeywords("Key Words");
    return $resultPage;
}

Deve fazer o trabalho!

rou6e
fonte
onde você adicionou isso?
Jibin george #
No método execute () do meu Action Controller
rou6e