クライアントの1つがSEOエージェンシーと連携していて、ページ付けパラメーター?page=x
(Viewsモジュールによって生成された)を削除して次のように書き直すように依頼されます。
前:
/my-page?page=1
後:
/my-page-1
Drupalでそれを行う方法はありますか?これを行うオプションがビューまたはPathautoに表示されません。
これをカスタムモジュールで処理することは可能ですか、それとも.htaccess
ファイルで作業する必要がありますか?
私は Clean Pagination モジュールを試しましたが、ページを手動で設定する必要があります。ページをクリーンページネーションが機能し、モジュールが正しく機能していないようです。
以下を実装するPathProcessorを記述する必要があります。
Drupal\Core\PathProcessor\InboundPathProcessorInterface
Drupal\Core\PathProcessor\OutboundPathProcessorInterface
例:
ファイル:modules/custom/mymodule/src/PathProcessor/MymodulePathProcessor.php
namespace Drupal\mymodule\PathProcessor;
use Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
use Drupal\Core\Render\BubbleableMetadata;
class MymodulePathProcessor implements InboundPathProcessorInterface, OutboundPathProcessorInterface {
public function processInbound($path, Request $request) {
if (strpos($path, '/my-page-') !== 0) {
return $path;
}
$page = preg_replace("/^\/my-page-(\d+)/", '$1', $path);
if (ctype_digit($page)) {
\Drupal::request()->query->set('page', $page);
return "/my-page";
}
else {
\Drupal::request()->query->set('page', 0);
return "/my-page";
}
return $path;
}
public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
if ($path === '/my-page' && isset($options['query']['page'])) {
$page = $options['query']['page'];
unset($options['query']['page']);
return '/my-page-' . $page;
}
return $path;
}
}
ファイル:modules/custom/mymodule/mymodule.services.yml
services:
mymodule.path_processor:
class: Drupal\mymodule\PathProcessor\MymodulePathProcessor
tags:
- { name: path_processor_outbound}
- { name: path_processor_inbound}
また、ポケットベルにカスタム変更を加える必要があります。完全なポケットベルの場合、リンクは通常のように作成されませんlink render elements、つまりprocessOutboud
を経由せず、代わりにtwigファイル(classy/templates/navigation/pager.html.twig)はカスタム形式を使用します。次のフック関数が調整を行います。
ファイル:modules/custom/mymodule/mymodule.module
/**
* Implements hook_preprocess_HOOK().
* Implements hook_preprocess_pager().
*
* @param $variables
*/
function mymodule_preprocess_pager(&$variables) {
$current_path = \Drupal::service('path.current')->getPath();
if ($current_path === '/my-page')
foreach ($variables['items']['pages'] as &$page_link) {
$page = preg_replace("/^\?page=(\d+)/", '$1', $page_link['href']);
$page_link['href'] = 'my-page-' . $page;
}
}