web-dev-qa-db-ja.com

URLの改ページを消去します(?page = parameterを書き換えます)

クライアントの1つがSEOエージェンシーと連携していて、ページ付けパラメーター?page=x(Viewsモジュールによって生成された)を削除して次のように書き直すように依頼されます。

前:

/my-page?page=1

後:

/my-page-1

Drupalでそれを行う方法はありますか?これを行うオプションがビューまたはPathautoに表示されません。

これをカスタムモジュールで処理することは可能ですか、それとも.htaccessファイルで作業する必要がありますか?

私は Clean Pagination モジュールを試しましたが、ページを手動で設定する必要があります。ページをクリーンページネーションが機能し、モジュールが正しく機能していないようです。

5

以下を実装する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;
  }
}
4
Cesar Moore