menulevel set by class

Discussions and requests related to new CMSimple features, plugins, templates etc. and how to develop.
Please don't ask for support at this forums!
svasti
Posts: 1659
Joined: Wed Dec 17, 2008 5:08 pm

menulevel set by class

Post by svasti » Tue Aug 05, 2014 9:55 pm

Don't shout and scream... just try it out for yourself. I think it works and it is compatible with existing plugins.
Take a fresh 1.6.2, (mini1 + tinymce, doesn't work with ckeditor nor pagemanager yet)
Add on top of the template stylesheet

Code: Select all

.level1{}
.level2{}
.level3{}
.level4{}
.level5{}
.level6{}
 
Add ",set by class" to metaconfig.php $mcf['menu']['levels']

Code: Select all

$mcf['menu']['levels']="enum:1,2,3,4,5,6,set by class"; 
Change functions.php line 903-913 to

Code: Select all

    $content = $cf['menu']['levels'] == 'set by class'
        ? preg_split('/(?=<h[1-6] class="level[1-6])/i', $content)
        : preg_split('/(?=<h[1-' . $stop . '])/i', $content);
    $content[] = preg_replace('/(.*?)<\/body>.*/isu', '$1', array_pop($content));
    $contentHead = array_shift($content);

    $temp_h = array();
    foreach ($content as $page) {
        $c[] = $page;
        if($cf['menu']['levels'] == 'set by class') {
            preg_match('~<h[1-6] class="level([1-6]).*>(.*)</h~isU', $page, $temp);
        } else {
            preg_match('~<h([1-' . $stop . ']).*>(.*)</h~isU', $page, $temp);
        } 
        $l[] = $temp[1];
        $temp_h[] = trim(xh_rmws(strip_tags($temp[2])));
    }
 
Now go into edit mode, first page, select the whole of the first headline, go to Styles and select "level1". Save.
Do this with all pages. However it is easier to do a search and replace with an editor in content.htm:
Change all <h1 to <h1 class="level1", <h2 to <h2 class="level2", <h3 to <h3 class="level3"

Now seemingly nothing has changed, the site looks the same as before. Now go to the backend->CMS and set levels to "set by class" and save. Site still looks the same.

Now go to the first page, to the headline and make the headline a h5, select the whole headline and give it in Styles "level1". Save.
The page now starts with a h5, but is still on level 1.
Now you can play around. You can start any page wih any headline from h1 to h6, and give it any menu level via the style.
Be careful, Tinymce needs a completely marked headline to give the headline a class, otherwise it will insert a <span> with a class, which will have no effect.

This is just a first test. However with this little change one is free to use all hx on every page.

Note:If for instance you select "set by class" without having given any level classes to your pages, ALL PAGES WILL BE DELETED, because XH will no be able to find any page any more. So this is quite dangerous at the moment.
One could maybe inplement the "set by class" as function, which will check if level classes are there and if absent, will generate them everywhere to prevent this. Also pagemanager needs some adjustment and for ckeditor we'll have to see what to do.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: menulevel set by class

Post by cmb » Wed Aug 06, 2014 11:28 am

svasti wrote:menulevel set by class
An interesting idea. :)
svasti wrote:I think it works and it is compatible with existing plugins.
Take a fresh 1.6.2, (mini1 + tinymce, doesn't work with ckeditor nor pagemanager yet)
Seems a bit like a contradiction. And there are more plugins affected, for instance, acDIVs and GenizLatestNews.
svasti wrote:Change functions.php line 903-913 to
I presume that at least the saving of the contents would have to be changed (XH_saveContents in adminfuncs.php); this checks for headings up to menu_levels to detect pages, and if multiple pages or no pages detected, it could break the pagedata. And there may be other parts of the core that would have to be adjusted (basically every occurance where the headings are checked would have to be inspected).

An alternative might be do to this the other way round: leave the headings as they are, and set a class according to the desired level in view mode. Then the output could be dynamically adjusted, similar as it's done by the Page Titles as <h1> trick.

Yet another alternative might be to offer a setting "alternative level" in page_params (or another plugin), that would work similar to "alternative heading".

However, all these solutions seem to be clumsy workarounds. Presumably, most users won't use them, so I tend to keep them out of the core.
Christoph M. Becker – Plugins for CMSimple_XH

svasti
Posts: 1659
Joined: Wed Dec 17, 2008 5:08 pm

Re: menulevel set by class

Post by svasti » Wed Aug 06, 2014 1:32 pm

cmb wrote:An interesting idea. :)
doesn't look like you tried it :(

If you try it out, it is fun: Saving and creating pages the old fashioned way through new headlines works. Of course it would need a bit of refinement to work properly, however to me it seems to point in the direction of a simple and natural evolution...
  • using all hx as originally intended
  • change to the new method no big thing
  • page creating method similar to the old method
  • users can keep old page creating method
cmb wrote:An alternative might be do to this the other way round:
possible, but that really sounds like a work"around". Ok, one could have a template which changes h1, h2, h3 -> h1, h4->h2 and h4-h3 in view mode, however for keeping the Wysiwyg view or some tricky css would have to be added.

I guess it's better to have something in the core which is a straight method, keeping the direct page creating method while getting back the original intention of hx.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: menulevel set by class

Post by cmb » Wed Aug 06, 2014 2:16 pm

svasti wrote:
cmb wrote:An interesting idea. :)
doesn't look like you tried it :(
Indeed, I had not. Now I have quickly tried it.
svasti wrote:Now go to the first page, to the headline and make the headline a h5, select the whole headline and give it in Styles "level1". Save.
Um, changing the heading didn't work in TinyMCE, because of a JavaScript error. So I have changed it in the HTML view. After saving, I got a new entry in content.htm:

Code: Select all

<h1>MISSING HEADING</h1>
<?php
$page_data[]=array(
'url'=>'MISSING_HEADING',
'last_edit'=>'1407334046'
);
?>
svasti wrote:If you try it out, it is fun: Saving and creating pages the old fashioned way through new headlines works.
At the end of the first page I've added:

Code: Select all

<h1 class="level1">Test</h1>
After saving the pagedata were out of sync.

Maybe I made a mistake when following your instructions--I'll try it again later.
Christoph M. Becker – Plugins for CMSimple_XH

svasti
Posts: 1659
Joined: Wed Dec 17, 2008 5:08 pm

Re: menulevel set by class

Post by svasti » Wed Aug 06, 2014 9:56 pm

Yes, I just tested it again and the pagedata got out of sync. What I wanted to say was that I was astonished how far it actually works.
It's just trying to preserve the way we create new pages, while at the same time getting back the h1-hx. The point is, if we find an easy way to do it, it would be great.

snafu
Posts: 352
Joined: Sun Dec 26, 2010 5:18 pm

Re: menulevel set by class

Post by snafu » Thu Aug 07, 2014 5:53 am

pardon me, auch wenn ich z.Z. cmsimple selbst nicht mehr einsetze, ich lese immer noch mit und gebe gegebenenfalls auch meinen Senf dazu ab ;-}

So richtig kapieren tue ich den Sinn nicht, aber vielleicht verstehe ich auch dank meiner englischkenntnisse gar nicht um was es eigentlich geht

Im Normalfall reichen 3 Menülevel aus, genauso wie 3 Abstufungen für die Überschrift H1 bis H3 auch ausreichen, wobei es ab 4 verschiedenen Schrift auf einer Seite jeden Schriftsetzer sowieso schon gruselt und für die sind schon bold und italic des gleichen Fonts unterschiedliche Schriften.
Gut lesbar bedeutet nicht, daß man H1, H2 und vielleicht noch H3 auf einer Seite haben muss in der vielleicht auch noch overkillmäßig bold und italic vorkommen und spätestens wenn dann Blockqoute auch noch eigenständig formatiert ist (was es eigentlich auch sein sollte) ... kann man die Seite wieder als Beispiel für schlechtes Design hinsichtlich der Textpräsentation verwenden

Wenn der Endanwender also auf jeder Seite, egal ob nun H1 oder H2 oder H3 eine H1 Überschrift haben möchte, dann kann er sich ziemlich problemlos im CSS H3 bis H6 mit den entsprechenden Fonts/Größen von H1 bis H3 belegen. So habe ich das schon gehandhabt, funktioniert problemlos, ohne rumgefudel mit php im Core, ohne ungeahnte side effects bei content, pagedata und Plugins, für deren Lösung man php Kenntnisse haben muss.
Ist euch irgendwie langweilig oder wieso geht ihr an ein Problem, von dem ich Anwenderseitig noch nie was gehört habe, daß da ein echter Lösungsbedarf besteht?
Wenn man dann auch noch beim Erstellen eines Tremplates (künftig) auf sowas Rücksicht nehmen muß, erspar ich mir das umhäkeln von Gonzo-h, das von mir benutzte 1kb Grid ist ja leider tot, auf das responsive Poketgrid


lg.
winni
lg.
winni

Durch einen Sucher betrachtet wird alles zu einem Motiv.
meine Galerie; mein Blog, mein CMSimple Template Tutorial

svasti
Posts: 1659
Joined: Wed Dec 17, 2008 5:08 pm

Re: menulevel set by class

Post by svasti » Thu Aug 07, 2014 3:40 pm

Hallo winni, schön dich hier wieder zu treffen,

worum es geht ist die logische Strukturierung der Seite, nicht das typographische Aussehen.
Google & Co erwarten scheinbar, dass das Thema der Seite in einer h1 steht. Es soll auch möglichst nur eine h1 pro Seite geben. Untergliederungen des Themas werden in einer oder mehreren h2s erwartet.

meltemi hat uns hier bezüglich Googles Vorlieben ein bisschen auf die Sprünge geholfen, und in meinen anschließenden Experimenten war ich schon erstaunt, wie stark bei Google die Vorliebe für h1 und h2 bezüglich Suchbegriffen ist.

Das heißt, wenn man gefunden werden möchte, sollte man seine Seiten und deren Überschriften genau planen, und keine Gemeinplätze wie "Hallo", "Willkommen" in eine h1 setzen.

Für diese Planung ist CMSimple_XH leider nicht so gut gerüstet. Angenommen man setzt den Titel der Website in h1, weil er das SEO-relevante Thema der Website beinhaltet. Wenn jetzt die Seiten des höchsten Levels auch h1 haben, ist das nicht so gut, da es nur eine h1 geben sollte. Die sollten dann besser h2 sein. Aber auch die Seiten von Level 3 könnten gerne mit h2 beginnen.
Die weitere semantische Unterteilung des Textes sollte entsprechend der Suchmaschinenrelevanz entweder als h2 oder als h3 kommen.

Wenn man im Browser mal css ganz ausschaltet, sieht man in etwa, wie Google die Seite sieht. Und da sind die CMSimple_XH Überschriften h4-h6 winzig, also die werden wohl auch bei Google als an vierter bis sechster Stelle stehend gewertet, d.h. als das Hinterletzte.

Für mich wurde das Thema akut, weil ich einen Kunden habe, der eine optisch ansprechende Website hatte, die aber nicht bei Google gefunden wurde. Mein Auftrag ist, neben einigen Textänderungen, sie auf die erste Ergebnisseite zu bringen. Habe das ganze Ding in CMSimple_XH nachgebaut (was nicht ohne war), und optimiere gerade die Googelei.

svasti

snafu
Posts: 352
Joined: Sun Dec 26, 2010 5:18 pm

Re: menulevel set by class

Post by snafu » Thu Aug 07, 2014 5:27 pm

Hallo svasti, ich bin nicht aus der Welt nur inaktiv, mehr oder weniger ;-}
svasti wrote: Das heißt, wenn man gefunden werden möchte, sollte man seine Seiten und deren Überschriften genau planen, und keine Gemeinplätze wie "Hallo", "Willkommen" in eine h1 setzen.
genau das hatte ich mit cmsimple gemacht, aussagekräftige Titel mit dem Ergebniss, daß ich mit meinen Erfahrungsberichten für einige Objektive auf der ersten google suchseite für diese Objektive war. Interessanterweise dauert das mit meiner WP Installation länger (und WP ist ziemlich SEO orientiert), als es mit CMSimple dauerte.

Wobei, es geht hier um SEO, dazu gibt es dermassen viele Diskussionen im Web (Sinn und Unsinn), die müssen wir hier jetzt nicht auch nicht führen. Ich persönlich halte nichts davon MEINE Seite in dieser Hinsicht zu optimieren, guter Content findet seine Leser, das hat mir meine CMSimple Installation gezeigt.
svasti wrote: Für mich wurde das Thema akut, weil ich einen Kunden habe, der eine optisch ansprechende Website hatte, die aber nicht bei Google gefunden wurde. Mein Auftrag ist, neben einigen Textänderungen, sie auf die erste Ergebnisseite zu bringen. Habe das ganze Ding in CMSimple_XH nachgebaut (was nicht ohne war), und optimiere gerade die Googelei.
Dann pass es für ihn an, aber für mich ist ein Problem eines gewerblichen Kunden jetzt kein zwingender Trigger um ein ganzes open source Projekt umzustricken, besonders dann, wenn die nachteiligen Effekte nicht abzusehen sind ... und der Aufwand, für das gesamte Projekt, sie in den Griff zu bekommen.
Mach ein SEO Plugin daraus, bei WP gibt es dutzende, und ich finde das dann auch gut.

Wenn eine Website nicht gefunden wird, bedeutet das in der Regel, daß sie zwar gefunden wird, aber nicht auf den ersten Ergebnissseiten des Suchenden ist. Nun, je nach Thema und Eingabe des Fragenden, gibt es da ein paar 1000 Konkurrenten. Jeder will auf den ersten Seiten stehen. Da muß man schon deutlich mehr machen, inhaltlich, als eine SEO freundliche Struktur des Textes.
lg.
winni

Durch einen Sucher betrachtet wird alles zu einem Motiv.
meine Galerie; mein Blog, mein CMSimple Template Tutorial

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: menulevel set by class

Post by cmb » Thu Aug 07, 2014 5:34 pm

svasti wrote:Für diese Planung ist CMSimple_XH leider nicht so gut gerüstet. Angenommen man setzt den Titel der Website in h1, weil er das SEO-relevante Thema der Website beinhaltet. Wenn jetzt die Seiten des höchsten Levels auch h1 haben, ist das nicht so gut, da es nur eine h1 geben sollte. Die sollten dann besser h2 sein. Aber auch die Seiten von Level 3 könnten gerne mit h2 beginnen.
Die weitere semantische Unterteilung des Textes sollte entsprechend der Suchmaschinenrelevanz entweder als h2 oder als h3 kommen.
Zumindest in diesem Fall ist kann das aber gelöst werden, ohne dass man noch extra Klassen für die Überschriften definieren muss, und zwar mit einer Variante der Page Titles as h1, bei der durch <h2> ersetzt wird, und dann die seiteninternen Überschriften entsprechend hoch rutschen (ich dachte eigentlich, dass ich das bei dem Trick bereits berücksichtigt hatte :?).
svasti wrote:Wenn man im Browser mal css ganz ausschaltet, sieht man in etwa, wie Google die Seite sieht.
Ich bin noch immer der Meinung, dass man nicht versuchen sollte für Google oder andere Suchmaschinen zu optimieren, sondern eben für Menschen. Aber richtig: CSS (und auch JS) sollte man immer mal deaktivieren, um zu sehen, was wirklich da ist (CSS und JS sind eben nicht immer da; die kann der Anwender ohne weiteres beeinflussen; machen z.B. manche bei php.net, da sie das Menü auf der linken Seite haben wollen; und dann gibt es User mit einem Textbrowser bzw. Screenreader, User die JS grundsätzlich deaktivieren etc. etc.)
snafu wrote:Mach ein SEO Plugin daraus, bei WP gibt es dutzende, und ich finde das dann auch gut.
Sehe ich genauso. :)
Christoph M. Becker – Plugins for CMSimple_XH

svasti
Posts: 1659
Joined: Wed Dec 17, 2008 5:08 pm

Re: menulevel set by class

Post by svasti » Thu Aug 07, 2014 8:13 pm

cmb wrote:Ich bin noch immer der Meinung, dass man nicht versuchen sollte für Google oder andere Suchmaschinen zu optimieren, sondern eben für Menschen.
Bei meiner Beschäftigung mit Google merkte ich, dass die Googleoptimierung auch für Menschen besser ist. Das liegt daran, dass es ein Informationsüberangebot gibt. Google will daraus nur das passende finden, Menschen sind inzwischen aber in derselben Lage. Das hat mir zu denken gegeben: Menschen haben dasselbe Problem wie Google und möchten darum ebenfalls Überschriften mit relevanten Suchworten.

Die Einstellung, ich mache für es Menschen statt für Google, könnte die Haltung begünstigen, ich mache es wie bisher, d.h. als es noch keine derartige Informationsflut gab. Inzwischen denke ich, Google schärft den Blick dafür, wie man etwas für Menschen, die das Angebot suchen, leichter auffindbar machen kann.

Post Reply