Autor Zpráva
martin6541
Profil
Dobrý den. Mám vytvořený modul v joomla a potřebuji v něm vypsat hodnotu vlastního meta tagu. Pokoušíms e to nějak udělat pomocí php příručky a pokusu omylu,a le nedaří se.

Mám kod:
<h1><?php  echo $tags['filtr-title'] ?></h1>
Ale nic se nezobrazí.

V kodu stránky to vypadá následovně:
<meta name="filtr-title" content="xxx" />

Mám to špatně? Nebo mi něco chybí?
Děkuji za radu
lionel messi
Profil
martin6541:

Kód modulu by sa nenašiel?

Syntakticky je to v poriadku.
anonym_
Profil *
martin6541:
Ty dva útržky kódu k sobě nepatří, nebo nedávají smysl.

Nahoře vypisuješ něco do nadpisu (H1), dole máš vypsaný meta tag, který do H1 určitě nepatří (a ten H1 v okolí ani není).
martin6541
Profil
anonym:
Ty dva útržky kódu k sobě nepatří, nebo nedávají smysl.
Vysvětlím. Tento redakční systém má velmi omezené možnosti, co se týče SEO ve filtrování. Umím si pomoci tak, že v sef komponentě mohu k dané url dopsat nespočet meta tagů. Napadlo mě tedy, že pro důležité kombinace filtrů (z pohledu analýzy klíčových slov) vytvořím vlastní meta tag ve stylu "titulek filtru" a ten pak nechám vypsat na dané url jako nadpis stránk v h1.
Proto se snažím zachránit aspoň takhle "ručně" ty nejdůležitější filtry. U malého eshopu je to reálné.


lionel messi:
Kód modulu by sa nenašiel?
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_breadcrumbs
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

$app        = JFactory::getApplication();
$menuitem   = $app->getMenu()->getActive(); // get the active item
//$m_params   = $menuitem->params; // get the params Menu
//$page_title = $m_params->get('page_title','');
$arr_list = (array) $list;
$end_list = end($arr_list);
?>
<div class="navigace">
    <h1 class="navigace-title"><?php  echo $tags['filtrace-title'] ?></h1>
    <ul itemscope itemtype="https://schema.org/BreadcrumbList" class="navigace<?php echo $moduleclass_sfx; ?>">
        <?php if ($params->get('showHere', 1)) : ?>
            <li>
                <?php echo JText::_('MOD_BREADCRUMBS_HERE'); ?> 
            </li>
        <?php else : ?>
            <li class="active">
                <span class="divider icon-location"></span>
            </li>
        <?php endif; ?>

        <?php
        // Get rid of duplicated entries on trail including home page when using multilanguage
        for ($i = 0; $i < $count; $i++)
        {
            if ($i == 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link == $list[$i - 1]->link)
            {
                unset($list[$i]);
            }
        }

        // Find last and penultimate items in breadcrumbs list
        end($list);
        $last_item_key   = key($list);
        prev($list);
        $penult_item_key = key($list);

        // Make a link if not the last item in the breadcrumbs
        $show_last = $params->get('showLast', 1);

        // Generate the trail
        foreach ($list as $key => $item) :
            if ($key != $last_item_key) :
                // Render all but last item - along with separator ?>
                <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
                    <?php if (!empty($item->link)) : ?>
                        <a itemprop="item" href="<?php echo $item->link; ?>" class="pathway"><span itemprop="name"><?php echo $item->name; ?></span></a>
                    <?php else : ?>
                        <span itemprop="name">
                        <?php echo $item->name; ?>
                    </span>
                    <?php endif; ?>

                    <?php if (($key != $penult_item_key) || $show_last) : ?>
                        <i class="fa fa-angle-right"></i>
                    <?php endif; ?>
                    <meta itemprop="position" content="<?php echo $key + 1; ?>">
                </li>
            <?php elseif ($show_last) :
                // Render last item if reqd. ?>
                <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" class="active">
                <span itemprop="name">
                    <?php echo $item->name; ?>
                </span>
                    <meta itemprop="position" content="<?php echo $key + 1; ?>">
                </li>
            <?php endif;
        endforeach; ?>
    </ul>
</div>



lionel messi:
Syntakticky je to v poriadku.
Snažil sme se to nějak logicky pochopit zde: www.php.net/manual/en/function.get-meta-tags.php
Ale pro mě je to jaksi nesrozumitelná řeč :)

Jinak ten modul je vlastně mnou vypocená drobečková navigace, kdy jako titulek stránky zobrazuje poslední položku z navigace a funguje skvěle. Jen u te filtrace to potřebuju vytunit.
<h1 class="navigace-title"><?php  echo $end_list->name; ?></h1>

Pokud bych si měl úplně vymýšlet, tak by bylo skvělé, kdyby to načítalo ten metatag a v případě že neexistuje, tak zobrazí tu end_list name. Myslím pomocí toho "if" a "else" ale už vůbec neumím napsat.
martin6541
Profil
Ahoj. Prozatím se mi nepodařilo problém vyřešit. Ale trošku jsem jej aktualizoval, takže to zhrnu.

Modul, ve kterém mám kod, zobrazující jako nadpis stránky poslední položku drobečkové navigace
<h1><?php  echo $end_list->name; ?></h1>

Potřebuji na jendom typu stránky udělat změnu. Jedná se o filtraci produktů.
Přidám tedy do kodu stránky vlastní meta tag:
<meta name="vlastni-h1" content="xxx" />

A chtěl bych upravit modul tak, aby v případě, že detekuje na stránce tento vlastní meta tag jej zobrazil, něco jako:
<h1><?php  echo $tags['vlastni-h1'] ?></h1>

a pokud vlastní meta tag nenajde, zobrazí původní
<h1><?php  echo $end_list->name; ?></h1>

Momentálně se mi nedaří vymyslet to podmínečné zobrazení, ale ani pohé zobrazení meta tagu jako nadpisu stránky :(
Keeehi
Profil
martin6541:
Metatag nemá s PHP nic společného. PHP ho tady nemůže detekovat. Takže ho vůbec nepoužívej. Na jeho místě můžeš zkusit dát <?php $someVariable = "xxx"; ?>

A tam kde máš h1 pak budeš mít
 <?php  echo isset($someVariable) ? $someVariable : $end_list->name; ?>

Pak budeš muset doufat, že:
1) Ten kód pro nadpis se vyhodnocuje až po kódu kde jsi definoval ten vlastní obsah.
2) Je to ve stejném kontextu, aby ta proměnná byla viditelná
3) Nepřepíšeš si tím nějakou jinou proměnnou

Ono jako všechno jde řešit, ale je potřeba alespoň trochu rozumět.

Ono by bylo mnohem lepší, než si t informaci tahat z jiné části stránky si to rozhodnout přímo na místě. Určitě to půjde z něčeho poznat, na jakém typu stránky jsi a podle toho zvolit, co do nadpisu vypsat.

Děláš úpravy na eshopu a z tvých dotazů je vidět, že tomu až tak moc nerozumíš. Jsem si jistý, že netušíš, jaké má každá z těch změn možné bezpečnostní dopady. Pořádně zvaž, jestli tě nevyjde levněji si na to najmout někoho kdo tomu rozumí. Přeci jen je to eshop a ten z povahy věci nakládá jak s penězi, tak s citlivými údaji zákazníků. Určitě nechceš, aby ti někdo ten shop hacknul.
martin6541
Profil
Keeehi:
Metatag nemá s PHP nic společného.
Aha. Já to právě chápal, že je to možné: www.php.net/manual/en/function.get-meta-tags.php
Očividně sem to ale pochopil špatně :(

Jde o to, že v SEF komponentě mohu libovolně meta tagy tvořit. Když už pro tu filtraci budu vytvářet sef url, tak jsem chtěl vytvořit lákavý nadpis stránky. A chtěl sem to přes ony meta tagy zobrazit na stránce.


Keeehi:
Děláš úpravy na eshopu a z tvých dotazů je vidět, že tomu až tak moc nerozumíš. Jsem si jistý, že netušíš, jaké má každá z těch změn možné bezpečnostní dopady. Pořádně zvaž, jestli tě nevyjde levněji si na to najmout někoho kdo tomu rozumí. Přeci jen je to eshop a ten z povahy věci nakládá jak s penězi, tak s citlivými údaji zákazníků. Určitě nechceš, aby ti někdo ten shop hacknul.

Dělám to na Joomla a eshopovém řešení Virtuemart. Téměř vše už nekdo naprogramoval a nabízí. Já se poslední dobou hodně zaměřuji na SEO. A to je velká bolest Virtuemartu.
Keeehi
Profil
martin6541:
Očividně sem to ale pochopil špatně :(
Ta funkce se ale nedá požít na aktuálně generovaný dokument. Teda ona by teoreticky možná šla ale je to drbání se levou nohou za pravým uchem. Přitom určitě existuje přímočaré řešení. Já ti ho bohužel neporadím, jelikož Joomlou/Virtuemartem nepracuji, takže neznám jeho prostředí, jak funguje, jak získat tu potřebnou informaci. Ale jsem si jistý že to tam někde lehce přístupné je.

Dělám to na Joomla a eshopovém řešení Virtuemart. Téměř vše už nekdo naprogramoval a nabízí. Já se poslední dobou hodně zaměřuji na SEO. A to je velká bolest Virtuemartu.
Já to chápu. Problém je ale že vypsání čehokoli do stránky může být potencionálně nebezpečné. Takže by se mělo vždy adekvátně ošetřit. Například <?php echo $item->name; ?> je neošetřený výstup. Já vím, ono se spoléhá na to, že ve jméně drobečkové navigace nebude nikdy nic nebezpečného, ale teoreticky může. Stačí import produktů dodavatele který byl napaden a máš to tam.
martin6541
Profil
Keeehi:
Ale jsem si jistý že to tam někde lehce přístupné je.
Konkrétně u tohoto není.

Používám toho nejlepšího dodavatele filtrace pro VM. I ten je ale z pohledu SEO značně omezen. Prakticky umí jen generovat ne-sef url a pojem jako SEO je pro něj sprosté slovo :)
Proto musím používat SEF komponentu, pomocí které alespoň ručně vytvořím 301 přesměrování na důležité kombinace filtrů s pěknou url adresou. U toho mohu vyplnit i META tagy. Ale to mi nestačí. Chtěl bych umět do stránky dostat alespoň nadpis. Ideálně popis. Už jsem se zaradoval, že ten nadpis vyřeším pomocí meta tagů. No nevyřeším. Tak musím hledat dál.

Samozřejmě, že nejprve jsem kontaktoval výrobce filtrace. Poté Joomla a VM komunitu. No vypadá to, že SEO se tam moc lidí nevěnuje a vystačí si s málem.

Problém je taky ten, že eshop je malý, levný a nemohu si enchat platit programátory za statisíce. Jen se prostě snařžím ho vylepšit.
Keeehi
Profil
Konkrétně u tohoto není.
Ale je. Schválně si zkus do kódu dát
var_dump(JFactory::getApplication()); exit;
Objeví se ti obrovské množství informací které jsou "aktuálně dostupné". To že o tom nevíš ještě neznamená, že to tam není.

Problém je taky ten, že eshop je malý, levný a nemohu si enchat platit programátory za statisíce.
Jistě. Dá se ale taky sehnat student za pár stovek. Což je pořád ta lepší varianta. Navíc tím že to udělá někdo místo tebe, ty získáš čas, který můžeš věnovat něčemu jinému, co ti jde.
Dělej ale jak myslíš. Jen aby tě to pak nevyšlo dráž na pokutách od ÚOOÚ, pokud ti to někdo hackne.
martin6541
Profil
Keeehi:
Asi jsme si nerozuměli.
To není jsem měl na mysli, že neexistuje žádné hotové řešení, které by řešilo můj problém se SEo ve filtraci a mohl jsem ho koupit.
Jak jsem psal, oslovils em dostupná fora a nikdo se nenabídnul. Dnes jsou asi vytížení i studenti. Zkoušel jsem zoufale oslovit i napřímo, ale bez odpovědi.

Přiznávám, že ideální y bylo, kdyby to implementoval výtrobce filtrace. Ten ale nechce. V komunitě VM to nikdo neřeší, krom jednoho člověka, který se na to dotazoval před pár dny. Už jsem ho oslovil, že máme stejný problém, jestli nebudeme spolupracovat na řešení.

Ještě jednou díky, žes mi vysvětlil, že toto je slepá cesta. byť po mě by byla asi ideální.
martin6541
Profil
Dobré ráno.
Protože se mi za tři měsíce nepodařilo sehnat nikoho, kdo by mi to vyřešil, a já to umanutě stále zkouším, podělím se o výsledek.

$tags = get_meta_tags("https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
<h1"><?php  echo $tags['filtrace-title'] ?></h1>

Funguje to tak, jak jsem si prvně myslel. Na dané stránce mám v kodu vlastní meta tag s názvem 'filtrace-title' a nějakou hodnotou. A takto umím hodnotu toho tagu vypsat na stránce. Má to jednu podstatnou vadu na kráse, strašně to zpomalí načítání stránky. Jakože v řádu desítek vteřin.

Opravdu by se nenašel někdo, kdo by mi věnoval hodinku času, kterou mu zaplatím a zkusili by jsme něco vymyslet (bez urážky)?
Kajman
Profil
martin6541:
Jakože v řádu desítek vteřin.

Protože se to zacyklí. Při generaci stránky example.com/cesta si interně stáhnete tu stejnou stránku example.com/cesta, kde chcete hledat meta tagy, ale aby se ta stránka vygenerovala, musí se stáhnout example.com/cesta,... a tak stále dokola, než dojdou limity serveru.
martin6541
Profil
Kajman:
Protože se to zacyklí. Při generaci stránky example.com/cesta si interně stáhnete tu stejnou stránku example.com/cesta, kde chcete hledat meta tagy, ale aby se ta stránka vygenerovala, musí se stáhnout example.com/cesta,... a tak stále dokola, než dojdou limity serveru.
Existuje rychlá oprava? Nebo jednoduchá? Aby mi to někdo opravil. Protože pokud je to velký problém, tak budu shánět programátora do podzimnu :)
Kajman
Profil
Ukažte kód, který generuje ten meta tag, který pak chcete vyzobnout.
martin6541
Profil
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_breadcrumbs
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

$app        = JFactory::getApplication();
$menuitem   = $app->getMenu()->getActive(); // get the active item
//$m_params   = $menuitem->params; // get the params Menu
//$page_title = $m_params->get('page_title','');
$arr_list = (array) $list;
$end_list = end($arr_list);
// Assuming the above tags are at www.example.com
$tags = get_meta_tags("https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");

?>
<div class="navigace">
    <h1 class="navigace-title"><?php echo ( array_key_exists( 'filtrace-title', $tags ) ? $tags['filtrace-title'] : 'Filtrace'); ?></h1>
    <ul itemscope itemtype="https://schema.org/BreadcrumbList" class="navigace<?php echo $moduleclass_sfx; ?>">
        <?php if ($params->get('showHere', 1)) : ?>
            <li>
                <?php echo JText::_('MOD_BREADCRUMBS_HERE'); ?> 
            </li>
        <?php else : ?>
            <li class="active">
                <span class="divider icon-location"></span>
            </li>
        <?php endif; ?>

        <?php
        // Get rid of duplicated entries on trail including home page when using multilanguage
        for ($i = 0; $i < $count; $i++)
        {
            if ($i == 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link == $list[$i - 1]->link)
            {
                unset($list[$i]);
            }
        }

        // Find last and penultimate items in breadcrumbs list
        end($list);
        $last_item_key   = key($list);
        prev($list);
        $penult_item_key = key($list);

        // Make a link if not the last item in the breadcrumbs
        $show_last = $params->get('showLast', 1);

        // Generate the trail
        foreach ($list as $key => $item) :
            if ($key != $last_item_key) :
                // Render all but last item - along with separator ?>
                <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
                    <?php if (!empty($item->link)) : ?>
                        <a itemprop="item" href="<?php echo $item->link; ?>" class="pathway"><span itemprop="name"><?php echo $item->name; ?></span></a>
                    <?php else : ?>
                        <span itemprop="name">
                        <?php echo $item->name; ?>
                    </span>
                    <?php endif; ?>

                    <?php if (($key != $penult_item_key) || $show_last) : ?>
                        <i class="fa fa-angle-right"></i>
                    <?php endif; ?>
                    <meta itemprop="position" content="<?php echo $key + 1; ?>">
                </li>
            <?php elseif ($show_last) :
                // Render last item if reqd. ?>
                <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" class="active">
                <span itemprop="name">
                    <?php echo $item->name; ?>
                </span>
                    <meta itemprop="position" content="<?php echo $key + 1; ?>">
                </li>
            <?php endif;
        endforeach; ?>
    </ul>
</div>



Rádek 21 a 25. Zbytek je kvůli drobečkové navigaci.


filtrace-title je název toho tagu.
Kajman
Profil
Toto není kód, který vygeneruje meta tagy, které chcete vyzobnout. To je kód, který se je snaží vyzobnout.

Ukažte kód, který vygeneruje něco jako
<meta name="filtrace-title" content="...">
martin6541
Profil
<meta name="filtrace-title" content="..."> . . . to je přesně ono. Pro každou důležitou stránku filtrace sestavím vlastní content. Nedůležité tento kod vůbec nemají


no mám jenom ten soubor, který obsahuje kod, co jsem posílal nahoře. Řádek 21 vyzobává, řádek 25 ho vypíše.


sestavoval sem to podle www.php.net/manual/en/function.get-meta-tags.php
Kajman
Profil
S Vámi to je těžké. Potřetí a naposledy: ukažte kód, který sestavený content do stránky vypíše pomocí těch meta tagů. Bez toho se radit nedá.
martin6541
Profil
Omlouvám se, ale netuším, co po mě chcete. V redakčním systému mám vlastní modul, jehož obsah jsem zveřejnil nahoře.
V sef komponentě systému si sám přidám vlastní meta tag. Když je stránka výsledkem filtrace, načte se také ten modul, který je vyzobne a zobrazí ten jeden správný.
Keeehi
Profil
Kajman:
Kód nemá. V RS má plugin který mu do určitých stránek vkládá meta tagy. Tak se rozhodl že co se má zobrazovat v drobečkové se bude určovat podle hodnot z tohoto pluginu.
martin6541
Profil
Keeehi:
Asi to tak bude. Opravdu moc nemám potuchy, jak to v RS funguje.

Už jsem koketoval s myšlenkou, že si nechám napsat někým modul nový, který by uměl z url stránky vyčíst název kategorie a přidával slova podle toho, co se ve filtraci zaškrne. Ale netuším, jestli je to v tom RS reálné, jestli je to práce na hodinu nebo týden a hlavně . . . . programátorů, stolařů a pokrývačů je v republice málo na to, kolik mají práce :(
blanikknight
Profil *
ahoj, jestli to ještě řešíš, napiš mi na blanikknight [at] seznam cézet

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0