Reply New Topic
2024/5/3 17:49:48
#1
Offline
Home away from home

Code review: icms_ipf_Metagen

I'm working through a few things on a couple of sites and looking a little more into ways to improve readability for all readers - people and search engines.

Page titles are always a key thing and it is something we need to pay more attention to. The ICMS IPF Metagen class handles creating meta tags, including the title. However, much of it was done before we implemented HTML Purifier and our standard filtering practices for content being saved into the database and before it is rendered.

What I find happening is punctuation - which is allowed - is being stripped out, making it a little awkward to read. It all starts in icms_ipf_Metagen->setTitle(). The first thing it does is call icms_html2text(), a function to strip HTML tags and replace HTML entities with text equivalents. Then, icms_purifyText() gets called to strip out punctuation. The post title displays as desired in the content, but the meta title is altered.

Would removing those 2 function calls be risky? After all, a module following the IPF methods and any module saving content is having the content filtered before being added to the database. I think these 2 functions served a different purpose, and the code comments even indicate they should be replaced by other methods already in the core.

There are other parts of this to explore in more detail. Just starting with this one, since it isn't one that can be overridden by other properties saved with the post, like the keywords, description, and short URL text can be.


_________________
Christian Web Resources
Facebook

2024/5/5 7:39:27
#2
Offline
Home away from home

Re: Code review: icms_ipf_Metagen

Here are some code snippets to look at -

libraries/icms/ipf/Metagen.php - setTitle()

These both have this:  @todo Remove this and use the proper data filter and HTML Purifier

include/functions.php - icms_html2text()

include/functions.php - icms_purifyText()

My review is that at this point, when the title tag is being rendered, the title has already been filtered and purified before being saved in the database, and then retrieved and sent to these functions. It's important to note that the title is not sent through these functions for rendering on the page.


_________________
Christian Web Resources
Facebook

2024/5/6 23:51:15
#3
Offline
Webmaster

Re: Code review: icms_ipf_Metagen

PHPStorm identifies loads of parts of the code that contain repetitive statements, so your findings are more or less expected. We can't fix them all at once, and the metagen is a good place to start.

This is an area that can be more fleshed out as well, I would expect the metagen function to be able to generate other metadata like the ones for facebook, twitter (sorry, 'X'), linkedin, schema.org and the likes.

When metagen was developed, those newer systems weren't there yet (or not as ubiquitous), now they're the norm and search engines have reduced or dropped the importance of the fields we're generating at the moment.


_________________

Me on OpenHub


2024/5/15 17:51:29
#4
Offline
Home away from home

Re: Code review: icms_ipf_Metagen

I've built in the metadata for open graph (Facebook/Instagram and Pinterest, mostly) and Twitter into the themes I use, using the same template vars ($icms_pagetitle, $icms_meta_keywords, $icms_meta_description, etc).

The next thing I was hoping to work out is a method for determining the components of each value. You could set preferences to change the pattern of your pagetitle - like %post title% %category% %module% - %sitename%, or %category%: %post title% - %module%, %sitename%. That way, you have control and flexibility, and you don't have to edit a bunch of files to make changes.

This method would also allow you to make it work with whatever theme you were using. Again, without having to edit the theme.


_________________
Christian Web Resources
Facebook

2024/5/16 0:08:28
#5
Offline
Webmaster

Re: Code review: icms_ipf_Metagen

You are using the same pragmatic approach I've used until now, but this kind of functionality really shouldn't be handled in the theme layer or each module separately, but site-wide. Whether we make metagen smarter or extensible, or have a separate module to handle the metadata on a site-wide bases are both possibilities.


_________________

Me on OpenHub


2024/5/16 7:34:35
#6
Offline
Home away from home

Re: Code review: icms_ipf_Metagen

There are other meta data that should be controlled by the site - some are not relevant for all, like location and geo data. To move towards a 'no code' solution, where this is done through the admin panel or a module, we'll have to consider impact for those, like you and I, that have built themes to include these data and what injecting the new meta data into the theme and how we go about doing it.

Back on the easy stuff: There's a config option being checked by the current metagen methods - $icmsModuleConfig['show_mod_name_breadcrumb'] - that I don't believe is in any module. It is part of the title generation and the breadcrumb generation. Just so you know.


_________________
Christian Web Resources
Facebook

2024/5/17 18:55:30
#7
Offline
Home away from home

Re: Code review: icms_ipf_Metagen

There's so much to be found in the forum! And there are a lot of yet to be utilized parts of the core.

Here's one about opengraph and schema.org - Re: Question about facebook social plugin - a mere 10 years ago.


_________________
Christian Web Resources
Facebook

2024/5/21 18:58:03
#8
Offline
Home away from home

Re: Code review: icms_ipf_Metagen

A lot of interesting things have come out of this review! There are several things that can be done to improve your overall SEO with a few updates to the modules that leverage the IPF classes.

One of the most important things for every site's SEO is having unique page titles. This becomes challenging when the script page doesn't change and the arguments passed to the page change. For example, in imBlogging, index.php can display a list of the most recent blog posts, blog posts in a particular category (imTagging), or posts by a particular author. These all can have multiple pages, so the page number is also a component of the page.

icms_ipf_Metagen:_construct() has arguments to help with all this. The first argument is the page title, the second is the page keywords, the third argument is the page description. There is a fourth argument (category path) that I'm still investigating.

A few things that I have found beneficial -

  • Add a module meta keywords configuration option
  • Add a module meta description configuration option
  • Add a module 'show module name in breadcrump' option

These can all be done by adding a few lines to your icms_version.php file and updating the module from the admin control panel. You also need to add some language constants to describe these options before updating the module.

For imBlogging, here's what I added

$modversion['config'][] = array(
    'name' => 'show_mod_name_breadcrumb',
    'title' => '_MI_IMBLOGGING_MODNAME_BREADCRUMB',
    'description' => '_MI_IMBLOGGING_MODNAME_BREADCRUMB_DSC',
    'formtype' => 'yesno',
    'valuetype' => 'int',
    'default' => 1);

$modversion['config'][] = array(
    'name' => 'module_meta_keywords',
    'title' => '_MI_IMBLOGGING_KEYWORDS',
    'description' => '_MI_IMBLOGGING_KEYWORDS_DSC',
    'formtype' => 'textbox',
    'valuetype' => 'text',
    'default' => '');

$modversion['config'][] = array(
    'name' => 'module_meta_description',
    'title' => '_MI_IMBLOGGING_METADESC',
    'description' => '_MI_IMBLOGGING_METADESC_DSC',
    'formtype' => 'textbox',
    'valuetype' => 'text',
    'default' => '');

The language constants go in {your module}/language/{your language}/modinfo.php. For these additions, it would look like this -

define('_MI_IMBLOGGING_MODNAME_BREADCRUMB', 'Include Module Name in Breadcrumb and Title');
define('_MI_IMBLOGGING_MODNAME_BREADCRUMB_DSC', 'Do you want the module name included as part of the paget title?');
define('_MI_IMBLOGGING_METADESC', "Module's Meta Description");
define('_MI_IMBLOGGING_METADESC_DSC', 'The meta description to be used for the main page of the module');
define('_MI_IMBLOGGING_KEYWORDS', 'Default keywords for the module');
define('_MI_IMBLOGGING_KEYWORDS_DSC', 'The meta keywords to be used for the main page of the module');

Adding this will do nothing to your front end - unless you make some modification there, too. The page that benefits most from this is the index.php at the root of the module (imblogging/index.php). It does not have anything to generate meta tags (current release). Adding it is quite simple and once the above options are added and values are saved in them, you'll have a page title, meta keywords, and meta description you can influence from your admin page. I've added this just before the inclusion of the footer -

/**
 *  Generating meta information for this page
 *  This page will generate several 'pages'
 *  As the number of posts increases, there will be multiple pages
 *  The page can also be filtered by category (imTagging) - which has its own meta properties
 *  And, you can get a list of posts by an author
 *  We need to account for all these to provide unique page titles for them all (at a minimum)
 */

// some combination of the module, category, author, and page #
$page_title = icms_getModuleName(false);

// some combination of the module, category, author, and page #
$page_keywords = $icmsModuleConfig['module_meta_keywords'];

// some combination of the module, category, author, and page #
$page_description = $icmsModuleConfig['module_meta_description'];

/* Generating meta information for this page */
$icms_metagen = new icms_ipf_Metagen($page_title, $page_keywords, $page_description);
$icms_metagen->createMetaTags();

As you can see, the variables that affect the page content can be made part of the title, the keywords, and the description. For now, it is pretty simple and I'm still working on the logic to update based on category, author, and page. I'll post an update once I have an approach for them. If you have ideas and suggestions - feel free to post them here!

Oh - and for you to see this in your site, you'll need a theme that uses the core meta variables, like this, as an example -

        <title><{if $icms_pagetitle !=''}><{$icms_pagetitle}> - <{/if}><{$icms_sitename}></title>
        <meta name="keywords" content="<{$icms_meta_keywords}>" />
        <meta name="description" content="<{$icms_meta_description}>" />

As it stands, this will give you a different page title, meta keywords, and meta description for the main page of this module (and others like it). I'll post updates so that the category, author, and page # will also automatically update these values.



Edited by skenow on 2024/5/21 19:25:32
Edited by skenow on 2024/5/21 19:26:53
Edited by skenow on 2024/5/21 19:27:45
Edited by skenow on 2024/5/21 19:32:51
Edited by skenow on 2024/5/21 19:52:59
_________________
Christian Web Resources
Facebook

2024/5/26 10:45:56
#9
Offline
Home away from home

Re: Code review: icms_ipf_Metagen

I'm still uncovering a lot of hidden gems in the existing code base. For example, most uses of icms_ipf_Metagen don't make use of all the arguments available - there are 4: title, keywords, description, and 'category path'. Only the first argument is required. There isn't a lot of information about these arguments in the comments. So, read and experiment!

As it turns out, imBlogging constructs $categoryPath and it does much of what I'm setting out to do - utilize the category, author, and other filters that could change the content of the index page. icms_ipf_Metagen->setTitle() does use the 4th argument in preparing what the meta title will be.

Here's how I'm using it now in imblogging/index.php, in the same spot as in my previous post -

// some combination of the module, category, author, and page #

$page_title = icms_getModuleName(false);

 

// some combination of the module, category, author, and page #

$page_keywords = $icmsModuleConfig['module_meta_keywords'];

 

// some combination of the module, category, author, and page #

$page_description = $icmsModuleConfig['module_meta_description'];

 

// icms_ipf_Metagen takes 4 arguments - the last is 'categoryPath'

$page_category_path = $category_path;

 

/* Generating meta information for this page */

$icms_metagen = new icms_ipf_Metagen($page_title, $page_keywords, $page_description, $page_category_path);

$icms_metagen->createMetaTags();

Except for the pagination factor, the page title is  now different in more cases than it was before - good for all things SEO and SERPs. Because the content of each page is going to change as posts are added, is this going to be much of a factor? That post that was on page 1 last month might be on page 2 next month, along with several other posts. I think I'll leave this and focus next on the logic for addressing the various sources of keywords and description.


_________________
Christian Web Resources
Facebook

Reply New Topic extras
 Previous Topic   Next Topic
You can view topic.
You can start a new topic.
You can reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You can post without approval.