Drupal and SEO Recipes for site optimization Chris Neglia, Lisa Forgan & Add-Your-Names-Notetakers Copyright 2009, Page 1 Solutions LLC.

Download Report

Transcript Drupal and SEO Recipes for site optimization Chris Neglia, Lisa Forgan & Add-Your-Names-Notetakers Copyright 2009, Page 1 Solutions LLC.

Drupal and SEO Recipes for site optimization

Chris Neglia, Lisa Forgan & Add-Your-Names-Notetakers Copyright 2009, Page 1 Solutions LLC

Drupal is best for SEO

• Our research concluded last August that Drupal was the best CMS for SEO. • We compared it against Wordpress, Joomla, Postnuke, Mambo and several other popular, open-source CMSes.

• Drupal is good for SEO because of it’s flexibility and extensibility (with respect to SEO); and mindfulness to clean, valid, proper code.

10 Reasons Drupal is the Best Platform for SEO

• • • • • • • • • • 1. Configurable 2. Flexible 3. Stays Optimized 4. Eliminates Duplicate Content 5. Clean Code 6. Easy to Intergrate with SEO Tools 7. Fights Spam 8. Landing Pages 9. Community Features 10. Thriving Ecosystem

Drupal SEO Secrets

• • • • • • • 1. There are No Secret Tips 2. Optimized for 1-2 keywords 3. Rule of the Upper Left Corner 4. If you can't see it, neither can Google.

5. Track Everything (all content and analytics) 6. Content is (still) king 7. Conversions are primary goal - (ie: user-generated content)

Modules

Drupal uses modules to enhance SEO.

Be aware that installing modules is NOT enough.

You still need a good convention of your titles, paths to content.

You still have to use the modules properly.

Volacci Fanboy?

• Um, no • Volacci-a drupal media company-created the SEO checklist module for Drupal. They attend Drupalcons and give talks about SEO.

• They have a lot more Drupal-SEO experience than many, so they are leaders in this area.

• That said, it is wise to hear second opinions. Or in the internet age, hear 100 second opinions. The truth is only what can be observed, measured and improved.

• Be an observant fence-sitter with Volacci’s guidance, according to PingVision, et al

I’m in Ur modules

• •

…Sez volacci-cat Icanhas SEO module zipfilez?

• •

“Yes. I has the modules in mah buckit” http://d6-7.voacci.com/seomodules.zip

SEO Checklist Search404 Menu Attributes WYSIWYG API Actions Addthis / Diggthis/ Sharethis

Best Modules for SEO

SEO Compliance Checker Pathauto Path Redirect Global GEOurl Html Purifier Meta Tags + Nodewords New XML Sitemap Site Map Token Global Redirect Page Title Nofollow List Captcha FCKEditor Triggers Advanced: Apache Solr Search (we cannot support yet) IMCE Notify Advanced: Open Calais –RDF metadata WS Mollum / Spam Scheduler GoogAnalytics Modules that directly affect SEO – Must haves for SEO Modules that indirectly affect SEO – Should have

Meta Tags + Nodewords

• These modules creates an interface to structure your meta information easily and on a page-by-page basis.

• When you create a piece of content, if you have permission to edit meta tags, you’ll see a ‘Meta tags’ fieldset. Expand it and fill with Description and Keywords.

• This will create those fields for that page of content.

• If you leave the description field empty, the node ‘teaser’ will be used for the description (max 255 chars)

Nofollow List

• Enable this module if you wish to alter your external links on the site with the rel=‘nofollow’ in the same way that wikipedia has it to discourage spam from those trying to use wikipedia to game their site’s pagerank.

• Note: you will not want to use this if you are trying to help out legitimate sponsored clients, friends of the site, or as an incentive for contributing content.

• Remember that content is king: • Content leads to > positive user experience, community participation and great design which lead to > interaction which leads to > chatter which leads to > linking from other sites; --authority and credibility snowball.

Global geoURL

• Geographically-identifiable metadata such as Earth coordinates (lat, long) to identify a location associated with a URL.

• Apparently, Google and others like it when a site has this. So use it.

• Anyone else want to talk about this??

• (crickets chirping)

Menu Attributes

• Allows granular control over navigational menu items such as: • • • • • • •

id (to use with jQuery) name target rel (ex: nofollow) class style accesskey

Mollom and Spam

• Mollum is a spam fighting service like Akismet is to Wordpress.

• Mollum is a commercial service so try to do without it if possible since providing it for client sites may (will) violate Mollom’s TOS.

• Spam is a module that allows you to (un)mark users, content, IPs as spam when they spam.

• Configure them following the help text.

• Use these on your sites.

HTML Purifier filter

• Input filters ensuring that the HTML markup from a user input textarea is ‘safe’ (has malicious code removed), ‘tidy’, well-formed, and standards compliant • HTML Purifier is an HTML input filter that further optimizes HTML markup for SEO • Navigate to Administer > Site Configuration > Input formats • Click ‘configure’ under Operations • You will see the option for ‘HTML Purifier’.

HTML Purifier filter

• If you know how to use input filters, then create a new input filter type, and enable the ‘HTML purifier’ filter and click ‘save configuration’.

• TEST that the filter works as expected with your WYSIWYG editor. •

Warning: This filter could be lead to unexpected (read: bad) results if you don’t know how to use it or combine it with other html filters.

SEO Checklist

• Install / enable the checklist. Navigate to the administration page for it.

• All the checklist does is make sure you’ve installed and configured SEO related modules.

• It is not enough to blindly install modules, and some of their recommendations may be incorrect according to threads on drupal.org.

• It may be better to rely on the knowledge of our SEO dept and work with them to find out how to get a drupal site to behave in the same SEO friendly manner as a static site via modules.

• The rest of this presentation will outline what we already know happens.

SEO Compliance Checker

• The core compliance checker doesn’t do anything.

• Enabled submodules will check content at the time of creation for SEO compliance.

• For example it provides some validation on HTML that helps SEO such as an ‘alt’ tag in images.

Page titles + Token

• Provides granular control over the element on a page • Uses a pattern for a global default (all pages) and patterns for each content-type.</p> <p>• Access it by /admin/content/page_title • Expand the ‘Available Tokens List’ to see what’s available.</p> <a id="p19"></a> <h3>Global Redirect</h3> <p>• • Go to /admin/settings/globalredirect Read the help beneath each section. If you don’t understand something, research it or leave it on the default setting.</p> <p>• • • • • • Turn ‘DeSlash’ to ‘On’ Turn ‘Non-clean to Clean’ to ‘On’ Turn ‘Remove Trailing Zero Argument’ to ‘Enabled for taxonomy term pages only’ or leave it ‘Disabled’ Leave ‘Menu Access Checking’ disabled Turn ‘Case Sensitive URL Checking’ to ‘Enabled’ Click the ‘Save configuration’ button.</p> <a id="p20"></a> <h3>Search404</h3> <p>• Instead of displaying a 404 page if the url is typed, this module splits up the URL into keywords and tries to redirect the user to a page if it finds one.</p> <p>• Go to /admin/settings/search404 • Tick the checkbox next to ‘Jump directly to the search result when there is only one result’ and ‘Jump directly to the search result when there are multiple results’ • Click ‘Save Settings’</p> <a id="p21"></a> <h3>Redirects and Aliases</h3> <p>• Use Redirection and Aliases to create clean, readable URLs that point to a definitive ‘best’ resource.</p> <p>• Redirects tell search engines that an alias is pointing to the the same piece of content.</p> <p>• In other words, an Alias alone would be worse than a redirect if it results in duplicated content.</p> <p>• You want to ensure that there is one (1) page and multiple ‘aliases’ will redirect the user to that one (1) page.</p> <a id="p22"></a> <h3>Managing Redirects</h3> <p>• For new sites, you don’t have to use add additional redirects this way unless you goof somewhere or change urls around a lot.</p> <p>• Under ‘Settings’ set ‘Discard Redirects’ to ‘Never’ or ‘1 yr’ (ensure that the new site is performing well with SEO before removing any redirects) • Set ‘Default Redirect Status’ to ‘301 Moved Permanently’. This is the SEO recommended code for a redirect.</p> <a id="p23"></a> <h3>Redirects: Migrating from other CMS</h3> <p>• • For existing sites you are recreating in a new Drupal site, you will have to • 1) spider the old site for a url list report of either static pages or patterns (if migrating from another CMS- can be messy >50k urls) and 2) replicate those patterns in drupal.</p> <p>• • • If you can spot a pattern among 100+ redirected urls, you will need to have programming write a script to generate this large volume of redirects. The script will require 1) the spider report and 2) the old database to be available beforehand.</p> <a id="p24"></a> <h3>Managing Redirects: Add redirect</h3> <p>• Go to /admin/build/path-redirect/add to add a redirect • You can only redirect within the same domain.</p> <p>• Type a path like /node/123 in the From • Type a path like /story/fallujah in the To field.</p> <p>• Click ‘Save’ • Test your redirect by going to the List view and clicking the link.</p> <a id="p25"></a> <h3>Pathauto, Path Redirect</h3> <p>• Beyond content, these are the two most important SEO modules to use in Drupal because they control path aliases and redirects.</p> <p>• Pathauto is <i>not </i>that easy to use.</p> <p>• Pathauto requires <i><b>site planning</b></i></p> <a id="p26"></a> <h3>CleanURLs + Pathauto</h3> <p>• <i>CleanUrls </i>gets rid of the ?q= in the URL • ‘Path Auto’ allows you to set automatic patterns for how the URL to a piece of content you are creating appears in the browser, based on the ‘content type’ of what content you are creating.</p> <p>• A clean url to content should look like this: http://www.domain.com/caffe-breve not the drupal default : http://www.domain.com/?q=node/432 • Best practice suggests that <i>you have some sample content before </i> <i>you build your site</i>, so that you can <i>proactively design </i>your content types and URL patterns.</p> <a id="p27"></a> <h3>Pathauto + Token</h3> <p>• The more content-pertinent, succinct the url, the better the SEO and the better the end-user-experience is.</p> <p>• A convention many drupal sites use is to identify the content type then the title of the page. Ex: http://domain.com/page/about-us http://domain.com/story/fallujah or • Wordpress calls these ‘friendly urls’. You could put dates or authors into the url as well. Ex: http://domain.com/about us/2009-7-1/author/chrisn</p> <a id="p28"></a> <h3>Pathauto + Token</h3> <p>• Go to ‘Administer’ > ‘Site Building’ > ‘Url aliases’ > ‘Automated alias settings’ – in the url it is -- /admin/build/path/pathauto • Token enables patterns on each path alias • Token doesn’t do anything by itself but expands the function of other modules.</p> <a id="p29"></a> <h3>Pathauto: General Settings</h3> <p>• For consistency’s sake, change the case of the urls to all lower case. • The separator needs to be a dash (by default) • Tick ‘verbose’ • Maximum number of objects to bulk update should be set to 50 - 250 • Leave all other settings alone unless you know what they do.</p> <p>• Click ‘Save configuration’</p> <a id="p30"></a> <h3>Pathauto: General Settings + Path Redirect</h3> <p>• If you have ‘Path Redirect’ installed, the PathAuto ‘General’ settings will have a new feature added to the list of the ‘Update Action’(s). • This new action is the last item on the list ‘<i>Create a new alias. </i> <i>Redirect from old alias</i>’.</p> <p>• When <i>creating a site from scratch </i>and ‘staging’ a drupal site, make the update action ‘<b>Create a new alias. Delete the old alias</b>’. This will keep the database clean of cruft / stale data.</p> <p>• After a site is launched and people are using it; <i>after search engines </i> <i>are indexing the site and it’s live</i>, then keep the update action on ‘<b>Create a new alias. Redirect from old alias</b>’.</p> <a id="p31"></a> <h3>Pathauto: Path Settings</h3> <p>• • • • • • • Expand the ‘<i>Node path’, ‘Blog path’, ‘Taxonomy term path’, ‘User path’ and </i> <i>‘Forum path settings</i>’ fieldsets as applicable. Notice the patterns in each path.</p> <p>Within each content path settings fieldset, there is a ‘<i>Replacement patterns</i>’ fieldset. Expand this fieldset to see what <i>tokens </i>are available to that particular content-type.</p> <p>Many of these have a default path that is ideal. Change/update the path as needed.</p> <p>If you find a text input that is blank for a path, it is likely that you added a new content type and now it is using the ‘default path pattern’ for that content type. Update as needed.</p> <p>Under each fieldset, tick ‘<i>Bulk generate aliases for nodes that are not aliased</i>’ Click ‘Save Configuration’ Run cron.php</p> <a id="p32"></a> <h3>Pathauto: Creating Content</h3> <p>• Expand the ‘URL path settings’ fieldset when creating a content.</p> <p>• Notice ‘automatic alias’ is checked. • To customize (‘override’) the automatic pathauto settings, <i>untick this box</i>.</p> <p>• Type in the path to this particular content.</p> <p>• Note: This is very useful for something like an ‘http://domain.com/about-me’ or ‘/site-map’ page</p> <a id="p33"></a> <h3>Drupal Camp 3</h3> <p>rd</p> <h3>party SEO tools</h3> <p>• • • • • • Google Analytics, Google Webmaster Tools, SEO-Browser.com, W3C Validators, Google Adwords Keyword Tool, Crazy Egg</p> <a id="p34"></a> <h3>New SEO Talking Points (from Drupal Camp Colorado)</h3> <p>• “Google is crawling javascript lines now” • “Page Rank Sculpting is Dead” • “Description Meta Tags are no longer being read by Google” • “Video is the New Text (Google is optimizing the text and code around the video)” • “Bing (Microsoft Search Engine - hopefully it's just a fad)” • “Semantic Web is akin to ‘robot food’ for search engines.”</p> <a id="p35"></a> <h3>Future-proofing Drupal for SEO</h3> <p>• The drupal community is aware of and proactively working on integrating ‘semantic web’ (‘web 3.0’?) technology into Drupal 7. • • • In a nutshell, semantic web (primarily as RDF and microformats) technology is a way to describe relationships among different types of data in a way that machines –Google/Yahoo- can understand easily, without having to do too much homework (like scanning through ‘dirty’ html) SEO forecasters believe this will greatly benefit SEO in the future.</p> <p>Talking points : What does google do with this now? What will they do with it later? Who knows how much RDF affects SEO? Blog software uses RDF and its dublin core namespace for rich metadata and mechanisms that use them such as trackback, pingback, syndication, foaf, etc (ie: web2.0 stuff). </p> <a id="p36"></a> <h3>Thanks</h3> <p>•</p> <h3>Best of luck optimizing your Drupal site for SEO.</h3> </div> </section> </div> </div> </div> </main> <footer> <div class="container mt-3"> <div class="row justify-content-between"> <div class="col"> <a href="/"> <img src="/theme/studyslide/static/logo-slideum.png" /> </a> </div> </div> <div class="row mt-3"> <ul class="col-sm-6 list-unstyled"> <li> <h6 class="mb-3">Company</h6> <li> <i class="fa fa-location-arrow"></i> Nicosia Constantinou Palaiologou 16, Palouriotissa, 1040 <li> <i class="fa fa-phone"></i> +357 64-733-402 <li> <i class="fa fa-envelope"></i> info@slideum.com </ul> <ul class="col-6 col-sm-3 list-unstyled"> <li> <h6 class="mb-3">Links</h6> <li> <a href="/about">About</a> <li> <a href="/contacts">Contact</a> <li> <a href="/faq">Help / FAQ</a> </ul> <ul class="col-6 col-sm-3 list-unstyled"> <li> <h6 class="mb-3">Legal</h6> <li> <a href="/terms">Terms of Service</a> <li> <a href="/privacy">Privacy policy</a> <li> <a href="/page.html?code=public.usefull.cookie">Cookie policy</a> <li> <a href="/page.html?code=public.usefull.disclaimer">Disclaimer</a> </ul> </div> <hr> <p>slideum.com © 2024, Inc. All rights reserved.</p> </div> </footer> <div class="modal directory" id="directory-modal"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Directory</h5> <button class="close" type="button" data-dismiss="modal">×</button> </div> <div class="modal-body"></div> </div> </div> </div> <script src="/theme/common/static/jquery@3.5.1/dist/jquery.min.js"></script> <script src="/theme/common/static/jquery_extra/dist/jquery-extra.js"></script> <script src="/theme/common/static/popper.js@1.16.1/dist/umd/popper.min.js"></script> <script src="/theme/common/static/bootstrap@4.6.0/dist/js/bootstrap.min.js"></script> <script> var __path_directory = [ ] !function __draw_directory(data, root, uuid) { var ul = $('<ul>', uuid && { id: 'category' + uuid, class: !__path_directory.includes(uuid) ? 'collapse' : null }); for (var item in data) { var li = $('<li>').appendTo(ul); if (item = data[item], item.children) { li.append('<a href=#category' + item.id + ' data-toggle=collapse>') __draw_directory(item.children, li, item.id); } else { li.append('<a href=' + item.url + '>'); } var a = $('> a', li).addClass('item').text(item.name) .append($('<a class="link fa fa-external-link" href=' + item.url + '>')); if (item.id === +__path_directory.slice(-1)) { a.addClass('active'); } /* if (item.id !== __path_directory[0]) { a.addClass('collapsed'); } */ } root.append(ul); } ([{"id":1,"name":"Food and cooking","url":"/catalog/Food+and+cooking","children":null},{"id":2,"name":"Education","url":"/catalog/Education","children":null},{"id":3,"name":"Healthcare","url":"/catalog/Healthcare","children":null},{"id":4,"name":"Real estate","url":"/catalog/Real+estate","children":null},{"id":5,"name":"Religion ","url":"/catalog/Religion+","children":null},{"id":6,"name":"Science and nature","url":"/catalog/Science+and+nature","children":null},{"id":7,"name":"Internet","url":"/catalog/Internet","children":null},{"id":8,"name":"Sport","url":"/catalog/Sport","children":null},{"id":9,"name":"Technical documentation","url":"/catalog/Technical+documentation","children":null},{"id":10,"name":"Travel","url":"/catalog/Travel","children":null},{"id":11,"name":"Art and Design","url":"/catalog/Art+and+Design","children":null},{"id":12,"name":"Automotive","url":"/catalog/Automotive","children":null},{"id":13,"name":"Business","url":"/catalog/Business","children":null},{"id":14,"name":"Government","url":"/catalog/Government","children":null}], $('#directory-aside')); var __root_directory = $('#directory-aside > ul'); $('#directory-aside') .on('show.bs.collapse', function() { //console.log('show.collapse') }) .on('hide.bs.collapse', function() { //console.log('hide.collapse') }); $('#directory-modal') .on('show.bs.modal', function() { $('[class$="body"]', this).prepend(__root_directory); }) .on('hide.bs.modal', function() { $('#directory-aside').prepend(__root_directory); }); $('.directory-mobile').on('click', function(e) { e.preventDefault(); }); $('.directory .link').on('click', function(e) { e.stopPropagation(); }); </script> <script> function scrollToViewport() { $('html, body').stop().animate( { scrollTop: $('.navbar').outerHeight() }, 1000); } setTimeout(scrollToViewport, 1000); $(window).on('orientationchange', scrollToViewport); $('[data-toggle="tooltip"]').tooltip(); </script> <script async src="//s7.addthis.com/js/300/addthis_widget.js#pubid=#sp('addthis_pub_id')"></script> <!-- Yandex.Metrika counter --> <script type="text/javascript"> (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter28397281 = new Ya.Metrika({ id:28397281 }); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); </script> <noscript><div><img src="//mc.yandex.ru/watch/28397281" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" /> <style> @media screen and (max-width: 768px) { .cc-revoke { display: none; }} </style> <script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script> <script> window.addEventListener("load", function() { window.cookieconsent.initialise( { content: { href: "https://slideum.com/dmca" }, location: true, palette: { button: { background: "#fff", text: "#237afc" }, popup: { background: "#007bff" }, }, position: "bottom-right", revokable: true, theme: "classic", type: "opt-in" })}); </script> </body> </html>