web-dev-qa-db-ja.com

カスタムカテゴリのデフォルトカテゴリリンクはリンク切れです

私はMultisuteプラグインを開発しています。これは特定のテンプレートを使用してサイトをセットアップすることを想定しています。これには、いくつかの静的ページやメニュー項目の設定、ブログ投稿の「Blog」カテゴリの設定も含まれます。

カテゴリはうまく作成されており、その中に1つの投稿があります、そして私はpage_for_postsオプションを使ってブログカテゴリへのメニューリンクを設定する方法を考え出しました。ただし、WordPressはブログのサイドバーの[カテゴリ]の下に各カテゴリへのデフォルトリンクを作成します。そしてそれが作るリンクは壊れています。

それは/category/blogにリンクしていますが、このリンクをクリックすると404 - "まあ、これは恥ずかしいです..."が表示されます。同じリンクがデフォルトの404テンプレートのフッターに表示され、まだ壊れています(明らかに)。

このリンクが機能しない理由はわかりませんが、作成したサイトからパーマリンク設定ページにアクセスした場合(または単にflush_rewrite_rules();を実行した場合)、機能することがわかりました。それで私はswitch_to_blogを使ってプラグインのセットアップスクリプトからそれを実行しました、しかし何らかの理由で、プラグインスクリプトがメインサイトで動くので、それは働きません。作成したサイトから実行するまで(または作成したサイトのパーマリンク構造ページにアクセスするまで)、そのURLの404を取得します。これは私が作成したデバッグスクリプトです。メインサイトからではなく、作成したサイトからアクセスした場合に機能します。

//Filename: wp-admin/debug.php

require_once('./admin.php');

global $wp_rewrite;
switch_to_blog(84); //this is the created blog in question
$wp_rewrite->init(); //JUST to make sure it's initialized for the correct blog
$wp_rewrite->flush_rules();
restore_current_blog();
$wp_rewrite->init(); //To make sure it's set back to where it should be.

そのため、メインサイトでの実行と作成サイトでの実行には違いがあります。書き換えルールがワードプレスのマルチサイトでどのように機能するのかわかりません。そのため、あるケースでは変化しているものを見つける方法がわかりませんが、別のケースでは変化しません。ブログ84のget_option(rewrite_rules)から返されるルールはどちらの場合もほぼ同じです。そのため、書き換え用キャッシュを更新するために別の手順を実行するか、作成したサイトから実行するときには実行する必要があります。メインサイトから実行します。

何か案は?新しく作成したサイトにカスタムカテゴリを挿入しても問題ありませんか。作成したサイトからflush_rewrite_rulesを実行したときに機能するように変更されている部分をどのように確認できますか?

ありがとうございます。

1
mltsy

flush_rewrite_rules();が機能していないのは、switch_to_blog$wp_rewriteの一部のプロパティを再初期化しないため、flush_rewrite_rulesはまだ次のパーマリンク構造に基づいていくつかのルールを生成しているためです。現在のブログ(同じではありません)。切り替え先のブログ(84)ではなく。 $wp_rewrite->init();を呼び出してもwp_rewriteの$extra_permastructsプロパティは更新されません - これがすべてのデフォルトの分類法パスがあるところです!

$extra_permastructsがどこに設定されているかを遡る必要があり、それは$wp_rewrite->add_permastructへのさまざまな呼び出しによって設定されています - 幸いなことに、プラグインはインストールされていません。 create_initial_taxonomies。だからこれはトリックでした:

add_action('switch_blog', function() {
  global $wp_rewrite;
  $wp_rewrite->init();
  create_initial_taxonomies();
});

//[...]

switch_to_blog($new_blog_id);
flush_rewrite_rules();
restore_current_blog();

しかし... ... WPで@skeltoacから知らされたばかりなので、削除rewrite_rulesオプションを指定すると、次回誰かがページを開いたときにWordPressが自動的にルールを再生成しますそのブログ(そしてそれはon新しいブログなので、それらは正しいパーマリンク構造から生成されます)。したがって、より簡単な解決策は次のとおりです。

switch_to_blog($new_blog_id);
delete_option('rewrite_rules');
// This option is automatically regenerated the next time someone loads the new blog!
restore_current_blog();

実際、私はなぜflush_rewrite_rulesメソッドが存在するのかさえ知りません - 単にrewrite_rulesを削除すべきです。

しかし、何らかの理由でフラッシュせずに他のブログのルールを実際にeditrewriteする必要がある場合は、おそらく上記の方法が役に立ちます。

おそらく、例えば、あなたが何百もの書き換えをしているかもしれず、あなたが次の不幸な訪問者に彼らの要求の初期化段階の間にそれらすべてが再生されるのを待たせたくないならば。ただし、その数が多い場合は、switch_blogアクションで考慮する必要がある他の$extra_permastructsがある可能性があります(多くの分類法がある場合を除く)。

4
mltsy

書き換えルールをフラッシュするのではなく、新しいサイトのオプションテーブルのオプションを編集する少し異なる方法を試してください。

新しいサイトは最初からuse permalinkオプションが設定されていないため、書き換え規則がpermalinks構造セットの値で保存されるまでNice URLは認識されません。

次のことを試してください。

//Filename: wp-admin/debug.php

require_once('./admin.php');

switch_to_blog(84); //this is the created blog in question

// add permalink option and remove rewrite rules so they get rerun
update_option( 'permalink_structure', '/%year%/%monthnum%/%postname%/' );
update_option( 'rewrite_rules', array() );

// flush_rewrite_rules(); // if it doesn't work with the above try uncommenting this

restore_current_blog();
1
sanchothefat