If I understand your post correctly you are looking to uniquely identify any given requested resource, not just CMS pages, right?
As you've found out, in most cases that works fine, except that for the CMS pages where the page_id param isn't added to the request path info.
The following should suffice in most cases, though you might want to customize it for layered navigation query arguments and such.
public function getRequestIdentifier()
{
$req = $this->getRequest();
$params = array('page_id', 'id', 'category', 'p', 'limit', 'order');
$parts = array(
$req->getModuleName(), $req->getControllerName(), $req->getActionName()
);
foreach ($params as $p) {
$value = $req->getParam($p, false);
if (false !== $value) {
$parts[] = $p;
$parts[] = $value;
}
}
return implode('/', $parts);
}
If the url is determined by a controller and an action you can use this:
{{store url="module/controller/action"}}
If the url is to a cms page you this:
{{store _direct="url-key-here"}}
if you want some query params also like /some-ulr?a=2&b=5
use one of the methods above and add a _query
parameter.
{{store url="module/controller/action" _query="a=2&b=5"}}
{{store _direct="url-key-here" _query="a=2&b=5"}}
[EDIT]
You can get the same urls in a template file like this:
$this->getUrl('module/controller/action'); //for controller pages
$this->getUrl('', array('_direct'=>'some-url-key')); //for cms pages
$this->getUrl('module/controller/action', array('_query'=>'a=2&b=5')); //for query params
$this->getUrl('', array('_direct'=>'some-url-key', '_query'=>'a=2&b=5')); //for query params
Best Answer
By ObjectManager:
By Factory Method
Note: Do not use objectManager directly in files as Magento 2 coding standards.