web-dev-qa-db-ja.com

パラメータによるプラグインへの顧客書き換え

私は本当にWP_Rewrite機能にこだわっています...

私が持っているもの

ショートコードを使用してレンダリングされ、フルサイトのコンテンツを表示しているプラ​​グインがあります。例えば。:

//?p=2 (maps to domain.tld/myplugin/)
[my-plugin]

このプラグインは基本的にいくつかのリストコンテンツのディレクトリです。

欲しいもの

基本的に私はプラグインによって表示されるリストの内容の分類のためにNice URLを達成したいです。例えば。:

domain.tld/myplugin/?filter=someFilter // works but is ugly

domain.tld/myplugin/someFilter         // is what I want

私が試したこと

それで、私はadd_rewrite_ruleを使って、そして修正することを試みました:

global $wp_rewrite

$customRules = [
    "myplugin/([^/]+)/?" => "?p=2&filter=$matches[1]" // try 1.1
    "myplugin/([^/]+)/?" => "/myplugin/filter=$matches[1]" // try 2.1
];

$wp_rewrite->rules = $customRules + $wp_rewrite->rules; // try 1
$wp_rewrite->extra_rules_top = $customRules + $wp_rewrite->extra_rules_top // try 2

しかし、私の書き換えはどれもうまくいきません。私が達成できる最善の方法は、ページにパラメーターを追加せずに単に/myplugin/にリダイレクトすることです。これはWordpressが?p=2/myplugin/をページのパーマリンク構造内で定義されているように一致させるためであると私は思います。だから私の推測では、パラメータは単純にルールから取り除かれます。

だから私の質問:

どうしたら私は欲しいものを達成できますか?私は本当に.htaccessに書き換え規則を書く必要がありますか?

50%ソリューション

だから/を読んだ後 この素晴らしい記事 /私は少なくとも何かが動くようにすることができた。最終的に私は達成することができます

domain.tld/myplugin/filter/someFilter
a syntax like "param/value"

これはadd_rewrite_endpoint()query_varsにフィルタを追加することによって行われます。今のところこれは私がしていることですが、最終的に私は本当にそれを降ろしたいです。

domain.tld/myplugin/someFilter

それで、助けはまだ大いに感謝されるでしょう;)

@websupporterによる最初の解決策を更新する

ここでユーザによって与えられたアプローチを試みました、そしてそれはまだうまくいきません。すべてのプラグインを無効にしましたが、まだ機能しません。

私が知る限りこの時点で干渉する可能性があるのは.htaccessだけですが、私にとってはこれもかなり標準的に見えます。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
3
Sam

このアプローチはあなたのために働くはずです:

<?php
/**
 * Plugin Name: Rewrite Shortcode
 **/

 add_shortcode( 'myplugin', 'mp_shortcode' );
 function mp_shortcode(){
    return '<p>Filter: ' . get_query_var( 'filter' ) . '</p>';
 }

 add_action( 'init', 'mp_rewrite' );
 function mp_rewrite(){
    $post_id = 2;
    add_rewrite_rule( 'myplugin/([^/]+)/?$', 'index.php?p=' . $post_id . '&filter=$matches[1]', 'top' );
    add_rewrite_tag( '%filter%', '([^/]+)' );
 }
?>

小さなプラグインとして素早く開発したので、自分でテストすることができました。あなたがグローバルな$wp_rewriteで作業している間、私はそれがCodexに文書化されている関数を使うほうが良いかもしれないと思いました。基本的には、私はそれらをよく知っているので:)だから私はあなたが間違っていたことを明白に言うことはできませんが、私は違うことを言うことができます。

あなたはアプローチです:

"myplugin/([^/]+)/?" => "?p=2&filter=$matches[1]

私はWordPressに index.php を使用するように明示的に伝えました。そして私はadd_rewrite_tag()を使って新しいクエリ変数を生成します。これはショートコードの中でget_query_var()で読むことができます。

注意:ルールをクリアしてください!これらの機能を使うときは、設定>パーマリンクに行き、「更新」ボタンをクリックしなければなりません。そうしなければ、新しいルールは有効になりません。プラグインの起動中にflush_rewrite_rules()を使うこともできます。これを行う方法の例は、コーデックスにあります。

ドキュメント:

3
websupporter

私はadd_rewrite_rule()関数を使います。コードはテストされていませんが、あなたの特定の用途に応じて動作するはずです。post_idも設定する必要がある場合は、それをindex.php?p=X...文字列に追加してください。

function myplugin_filter_add_rewrite_rules()
{
  // Allow for /myplugin/filter/someFilter
  add_rewrite_rule('myplugin/filter/([^/]+)/?$',
   'index.php?filter=$matches[1]',
   'top');

  // Optionally keep pagination /myplugin/filter/someFilter/page/2
  add_rewrite_rule('myplugin/filter/([^/]+)/page/([0-9]+)?$',
   'index.php?filter=$matches[1]&paged=$matches[2]',
   'top');
}

add_filter('init', 'myplugin_filter_add_rewrite_rules');

すでに述べたように、Settings> Permalinksにアクセスするか、プラグインのアクティブ化にflush_rewrite_rules()を使用してルールをフラッシュすることを忘れないでください(ページを読み込むたびに実行しないでください)。

1
gyo