rechtstexte für onlineshop
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: MODUL: Themenwelten

    awids

    • Experte
    • Beiträge: 3.789
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #210 am: 18. April 2021, 17:11:55
    [...]
    Wenn man in Contents oder Kategorien keine explizite Meta-Description angibt wird diese ja von der Shop-Software aus dem Text-Inhalt des Contents oder der Kategorie generiert.
    Werden nun Platzhalter eingesetzt werden diese für die Meta-Description nicht aufgelöst, womit sie evtl. in der Meta-Description des Contents auftauchen. Lediglich "evtl." desshalb, weil die automatisch aus dem Text generierte Meta-Description in der Zeichenanzahl limitiert ist. Wenn ein Platzhalter also nicht innerhalb dieser Zeichenanzahl auftaucht ist er auch nicht in der Meta-Description zu sehen.
    [...]

    Zur Verdeutlichung, was noRiddle meint, hier mal ein Screenshot:

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Vergibt man für Kategorien/Contentseiten keine eigene Metabeschreibung, wird automatisch eine aus dem Content generiert und dann kann es passieren, dass die Platzhalter [products products_model='1001,1002,1003'] mit in die Metabeschreibung aufgenommen werden.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.729
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #211 am: 18. April 2021, 18:26:55
    Danke dir für's bildliche Erläutern.

    Die beste Variante das Problem zu beheben erwähnte ich bereits:
    ...
    Die absolut cleane Variante wäre den Inhalt des Smarty-Modifiers als Funktion auszulagern im Modifier dann einzubinden und ebenfalls auf die Meta-Tags anzuwenden mittels einer PHP-Datei in /includes/extra/modules/metatags_data/.
    ...

    Gruß,
    noRiddle

    p3e

    • Experte
    • Beiträge: 2.395
    Re: MODUL: Themenwelten
    Antwort #212 am: 18. April 2021, 19:17:49
    Da ich das Modul früher als Smarty-Modifier umgebaut habe, gebe ich mal meinen Senf dazu. Es ist übrigens nicht ein Problem des Smarty-Modifiers. Bevor ich es so und damit updatesicher umgeschrieben hatte, gab es das Problem prinzipiell auch bereits. Es war nur noch keinem aufgefallen. Mir schon deshalb nicht, weil ich die Meta-Tags selber fülle.

    Ich finde noRiddles Vorschlag sehr gut. Als alternative Lösung kann man auch die Platzhalter bei der Generierung der Meta-Tags rausfiltern:

    Code: PHP  [Auswählen]
    preg_replace('/\[.*=\'.*\']/', '', $text);

    Zur Erklärung für die Regex-Hater: Alles was folgendem Schema entspricht wird damit rausgefiltert:
    [Irgendwas='irgendwas']

    p3e

    • Experte
    • Beiträge: 2.395
    Re: MODUL: Themenwelten
    Antwort #213 am: 19. April 2021, 00:05:18
    Ich habe das nochmal erweitert, so dass nun auch eventuell vorhandene Leerzeichen berücksichtigt werden:

    Code: PHP  [Auswählen]
    preg_replace('/\s*\[.*=\s*\'.*\'\s*]\s*/', ' ', $text);

    awids

    • Experte
    • Beiträge: 3.789
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #214 am: 19. April 2021, 01:14:27
    Die Lösung via preg_replace() ist zwar ganz interessant und funktioniert auch bei der Metadescription, allerdings werden dadurch noch nicht die Metakeywords vollständig bereinigt. Im obigen Screenshot kann man nachsehen, was ich damit meine.

    p3e

    • Experte
    • Beiträge: 2.395
    Re: MODUL: Themenwelten
    Antwort #215 am: 19. April 2021, 07:49:44
    Doch, wenn das preg_replace() ausgeführt wird, bevor die Meta-Tags generiert werden,. Davon war ich eigentlich ausgegangen.

    Ich finde noRiddles Lösung eleganter aber ich weiß nicht, wie oft das Problem wirklich auftritt, da das vor noRiddle noch niemand gemeldet hat. Die meisten füllen die Meta-Tags vermutlich selber aus und der Platzhalter wird vermutlich in den meisten Fällen nicht so früh am Anfang stehen.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.729
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #216 am: 19. April 2021, 13:23:46
    Du hast sicher Recht damit, daß die Platzhalter meist nicht so früh am Anfang des Content-Inhaltes stehen werden.
    Ich würde allerdings trotzdem von einer hohen Dunkelziffer ausgehen weil die Meisten selten bis nie in den Seitenquelltext schauen und auch SERPs nicht so oft prüfen.

    Die folgende Methode um das Problem zu beheben ist erst ab Shop-Version 2.0.5.0 möglich, da vorher kein Hook für die Meta-tags in der /includes/modules/metatags.php vorhanden war.
    Das Auslagern der Funktion in /inc/ und das Ersetzen des Codes im Smarty-Modifier ist immer möglich.
    In Shop-Versionen vor 2.0.5.0 muß man die Meta-tags dann wahrscheinlich im genannten File selbst mittels der Inc-Funktion "säubern". Habe mir das nicht genauer angeschaut.

    Man generiere eine Datei namens contentenhancer.inc.php in /inc/ mit diesem Inhalt:
    Code: PHP  [Auswählen]
    <?php
    /*********************************************************************
    * file: contentenhancer.inc.php
    * path: /inc/
    * use: functions for module "Themenwelten"
    *
    * © copyright MK, p3e
    * outsourced function to use also on meta tags, noRiddle, 04-2021
    *********************************************************************/


    function contentenhancer_inc($html) {
        if(preg_match_all('/(\[products [^\]]+\])/', $html, $matches)) {
            foreach($matches[1] AS $snippet){
                $products_models = null;
                $categories_ids = null;
                $keywords = null;
               
                if(preg_match('/products_models\=\'([^\']+)\'/', $snippet, $model_matches)){
                    $t_models = explode(',', $model_matches[1]);
                    $products_models = array();
                    foreach($t_models AS $model){
                        $products_models[] = xtc_db_input(trim($model));
                    }
                }
               
                if(preg_match('/categories_ids\=\'([^\']+)\'/', $snippet, $categories_ids_matches)){
                    $t_categories_ids = explode(',', $categories_ids_matches[1]);
                    $categories_ids = array();
                    foreach($t_categories_ids AS $categories_id){
                        $categories_ids[] = (int)$categories_id;
                    }
                }
               
                if(preg_match('/keywords\=\'([^\']+)\'/', $snippet, $keyword_matches)){
                    $t_keywords = explode(',', $keyword_matches[1]);
                    $keywords = array();
                    foreach($t_keywords AS $keyword){
                        $keywords[] = xtc_db_input(trim($keyword));
                    }
                }
               
                $html = str_replace($snippet, parseProducts($products_models, $categories_ids, $keywords), $html);
               
            }
        }
           
            if(preg_match_all('/(\[categories [^\]]+\])/', $html, $matches)) {
             foreach($matches[1] AS $snippet){
                  if(preg_match('/categories_ids\=\'([^\']+)\'/', $snippet, $categories_ids_matches)){
                    $t_categories_ids = explode(',', $categories_ids_matches[1]);
                    $categories_ids = array();
                    foreach($t_categories_ids AS $categories_id){
                        $categories_ids[] = (int)$categories_id;
               
                    }

                }
       
                $html = str_replace($snippet, parseCategories($categories_ids), $html);
             }
        }
           
        return $html;
    }

    function parseCategories($categories_ids = NULL) {
        if(is_array($categories_ids)) {
            $group_check = '';
            if (GROUP_CHECK == 'true') {
                $group_check = "c.group_permission_".$_SESSION['customers_status']['customers_status_id']."=1 AND";
            }
           
            $q = "SELECT
                    c.categories_id,
                    c.categories_image,
                    cd.categories_name
                FROM categories AS c
                LEFT JOIN categories_description as cd
                ON c.categories_id = cd.categories_id
                WHERE c.categories_id IN ('"
    .implode("', '", $categories_ids)."')
                AND "
    .$group_check." c.categories_status = '1'
                AND cd.language_id = '"
    .(int) $_SESSION['languages_id'] ."'
                order by FIND_IN_SET(c.categories_id,'"
    .implode(",", $categories_ids)."')";
        //  echo $q;
                $categories_query = xtDBquery($q);
               
              while($categories = xtc_db_fetch_array($categories_query, true)) {
                $category_link =xtc_category_link($categories['categories_id'],$categories['categories_name']);
                $module_content[] = array ('CATEGORY_NAME'        => $categories['categories_name'],
                                 'CATEGORY_IMAGE_TRUE'  => $categories['categories_image'],        
                                 'CATEGORY_IMAGE'       => DIR_WS_IMAGES .'categories/' . $categories['categories_image'],
                                 'CATEGORY_LINK'        => xtc_href_link(FILENAME_DEFAULT,  xtc_get_all_get_params(array('cat','page','filter_id','manufacturers_id')) . $category_link)
                                 );
               
               
            }      
            //echo "<pre>";
            //var_dump($module_content);
            //echo "</pre>";
            $smarty = new Smarty;
            $smarty->assign('categories', $module_content);
            $smarty->assign('language', $_SESSION["language"]);
            $html = $smarty->fetch(CURRENT_TEMPLATE.'/module/modules/content_enhancer/listing_cats.html');         

            return $html;
        }
    }
       
    function parseProducts($products_models = null, $categories_ids = null, $keywords = null){
        if(is_array($products_models) || is_array($categories_ids) || is_array($keywords)){
            $group_check = '';
            $fsk_lock = '';
           
            if ($_SESSION['customers_status']['customers_fsk18_display'] == '0') {
                $fsk_lock = ' AND p.products_fsk18!=1';
            }
           
            if (GROUP_CHECK == 'true') {
                $group_check = " AND p.group_permission_".$_SESSION['customers_status']['customers_status_id']."=1 ";
            }
           
            $q = "SELECT * FROM
                            "
    .TABLE_PRODUCTS." p
                            JOIN "
    .TABLE_PRODUCTS_DESCRIPTION." pd ON (p.products_id = pd.products_id AND pd.language_id = ".(int)$_SESSION["languages_id"].")
                  WHERE
                        p.products_status = 1 "
    .$fsk_lock.$group_check;
           
            if(is_array($products_models)){
                $q .= " AND p.products_model IN ('".implode("', '", $products_models)."') ";
            }
           
            if(is_array($categories_ids)){
                $q .= " AND p.products_id IN (SELECT p2c.products_id FROM ".TABLE_PRODUCTS_TO_CATEGORIES." p2c WHERE p2c.categories_id IN (".implode(',', $categories_ids).")) ";
            }
           
            if(is_array($keywords)){
                $q .= " AND (1!=1";
                foreach($keywords AS $keyword){
                    $q .= " OR
                              ( pd.products_keywords LIKE ('%"
    .$keyword."%')
                                    OR
                                pd.products_name LIKE ('%"
    .$keyword."%')
                                    OR
                                pd.products_description LIKE ('%"
    .$keyword."%')
                               )
                            "
    ;
                }
                $q .= ")";
            }

            global $product;
            $module_content = array();
            $listing_query = xtDBquery($q);
            while ($listing = xtc_db_fetch_array($listing_query, true)) {
                $module_content[] =  $product->buildDataArray($listing);
            }
           
            $smarty = new Smarty;
            $smarty->assign('products', $module_content);
            $smarty->assign('language', $_SESSION["language"]);
            $html = $smarty->fetch(CURRENT_TEMPLATE.'/module/modules/content_enhancer/listing.html');
            return $html;
           
        }
       
        return '';
    }
    ?>

    Man ersetze den Code in /template/YOUR_TEMPLATE/smarty/modifier.contentenhancer.php mit diesem Code:
    Code: PHP  [Auswählen]
    <?php
    /************************************************************
    * file: modifier.contentenhancer.php
    * path: /templates/YOUR_TEMPLATE/smarty/
    * use: smarty modifier fo module "Themenwelten"
    *
    * © copyright p3e, MK
    *
    * adapted to work also on meta tags
    * and therefore outsourced functions, noRiddle, 04-2021
    ***********************************************************/


    if(!function_exists('contentenhancer_inc')) {
        require_once(DIR_FS_INC.'contentenhancer.inc.php');
    }

    function smarty_modifier_contentenhancer ($html) {    
        $html = contentenhancer_inc($html);

        return $html;
    }
    ?>

    Man generiere eine neue Datei namens contentenhancer_meta.php in /includes/extra/modules/metatags_data/ mit folgendem Inhalt:
    Code: PHP  [Auswählen]
    <?php
    /*************************************************************************************
    * file: contentenhancer_meta.php
    * path: /includes/extra/modules/metatags_data/
    * use: convert placeholders for module "Themenwelten" in meta tags
    *
    * © copyright for module Themenwelten: MK, p3e
    * new file to clean meta tags, 04-2021, noRiddle
    *************************************************************************************/


    if(!function_exists('contentenhancer_inc')) {
        require_once(DIR_FS_INC.'contentenhancer.inc.php');
    }

    $metadata_array['title'] = contentenhancer_inc($metadata_array['title']);
    $metadata_array['description'] = contentenhancer_inc($metadata_array['description']);
    $metadata_array['keywords'] = contentenhancer_inc($metadata_array['keywords']);
    ?>

    Gruß,
    noRiddle

    p3e

    • Experte
    • Beiträge: 2.395
    Re: MODUL: Themenwelten
    Antwort #217 am: 19. April 2021, 15:02:28
    Oh wow! Dann hast Du ja doch die perfekte Lösung gewählt! Danke für die Arbeit noRiddle!

    awids

    • Experte
    • Beiträge: 3.789
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #218 am: 19. April 2021, 19:22:55
    Ich habe noch die Berücksichtung des alternativen Kategorie-Bildes für das Listing mit eingebaut und aus noRiddles Vorschlag ein neues Paket in der Version 1.5 ab Shopversion 2.0.6.0 (mit Lazyload) erstellt.

    Für tpl_modified und tpl_modified_responsive habe ich außerdem eigene Template-Dateien eingefügt, welche auf die bereits im Template vorhandenen Klassen für Kategorie- und Produktlisting zurückgreifen, sodass keine Einbindung einer zusätzlichen CSS-Datei notwendig ist.

    Fremd-/Drittanbietertemplates können sich am beigefügten Template-Ordner your_template bedienen, da liegen die Originaldateien inkl. CSS-Datei aus den letzten Paketen drinnen.

    [EDIT Tomcraft 20.04.2021: Modul in Beitrag 1 ergänzt.]

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.729
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #219 am: 20. April 2021, 17:05:20
    Klasse, danke dir.

    Gruß,
    noRiddle

    awids

    • Experte
    • Beiträge: 3.789
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #220 am: 20. April 2021, 18:23:17
    Hatte in den neuen Template-Dateien leider noch eine Passage von der CSS Produkt- und Attribut-Lagerampel mit drin, weswegen es mit den Dateien zu Fehlern kommt, wenn man den Modifier nicht im Smarty-Ordner liegen hat.

    Anbei also eine bereinigte Version.

    [EDIT Tomcraft 21.04.2021: Modul in Beitrag 1 aktualisiert.]

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.178
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #221 am: 21. April 2021, 21:12:58
    Danke dir. :thx:
    Sei doch so lieb und benutze bei neuen Modulversionen den Link "Moderator informieren" beim entsprechenden Beitrag, damit wir neue Versionen auf dem Schirm haben. noRiddle hatte das hier für dich übernommen und mich über die neue Version informiert.

    Grüße

    Torsten

    awids

    • Experte
    • Beiträge: 3.789
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #222 am: 21. April 2021, 23:24:10
    Mach ich normalerweise auch. Da ich das in den vergangen Tagen aber schon öfter gemacht habe, wollte ich eure Geduld nicht über Gebühr strapazieren.  :flee-mrgreen:

    Marcus Kreusch

    • Fördermitglied
    • Beiträge: 328
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #223 am: 11. Juni 2021, 13:13:10
    Hallo Zusammen,

    an der Stelle einmal herzlichen Dank, dass ihr "mein" Modul ueber einen so langen Zeitraum weiterentwickelt und verbessert habt. Ihr seid wirklich die beste Community. :thumbs:

    Viele Gruesse
    Marcus

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.851
    • Geschlecht:
    Re: MODUL: Themenwelten
    Antwort #224 am: 11. Juni 2021, 14:34:16
    Deswegen schaust ja auch - nach fast 2 Jahren Abstinenz - mal wieder hier vorbei!

    Das nenne ich auch Community Denken  :thumbs:

    Grüße
    Dominik
    5 Antworten
    3471 Aufrufe
    12. September 2010, 21:03:02 von Haina
    9 Antworten
    3102 Aufrufe
    04. Januar 2019, 17:14:15 von Shorty
    106 Antworten
    51960 Aufrufe
    06. März 2021, 19:27:04 von awids
               
    anything