web-dev-qa-db-ja.com

Cookie nonceが無効です - マルチサイト

次のようなメッセージが表示されます。

アプリケーションパスワードプラグイン

Cookie nonceが無効です

iThemesのセキュリティ

一回限りのセキュリティチェックが失敗し、要求が期待どおりに完了できませんでした。ページを再読み込みしてからもう一度お試しください。

...ネットワーク(サブディレクトリマルチサイト)adminに設定を保存しようとしたとき。しかし、サイト内のプラグインに設定パネルを使用した場合、このメッセージは表示されません。

私はいくらかのデバッグをしました、そして、私が見つけたものはそれが wp_verify_nonce() で常にfalseを返すということでした。 Cookieトークンが予想されるトークンと一致することはありません。 Wordpressがこのように動作している理由はわかりません。

Wordpressのnonceがこのように動作している理由を誰かが知っていますか?どうすれば修正できますか?

私はBedrockを使用していて、これが私の設定です。

define('WP_HOME', 'http://my-local-cms.dev');
define('WP_SITEURL', 'http://my-local-cms.dev/backend');
define('CONTENT_DIR', '/app');

define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', '');
define('COOKIEPATH', '');
define('SITECOOKIEPATH', '');

define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'my-local-cms.dev');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
1
Eric Wallmander

私はその問題を見つけた。

ネットワーク管理者へのリンクが正しくありません。たとえば、ネットワークユーザーは次のようになります。

http://my-local-cms.dev/wp-admin/network/ /

そうであるべきです(wordpressコアがバックエンド/にある場合)

http://my-local-cms.dev/backend/wp-admin/network/

最初のリンクにアクセスし、ブラウザでwp-adminの前に/ backend /を追加すると、ネットワーク管理者は正しく動作します。

修正

編集2017-08-30新しい解決策:

public function fix_network_admin_url($path, $scheme) {
    $path = ltrim($path, '/');
    return str_replace('/wp-admin/network', '/backend/wp-admin/network', $path);
}
add_filter('network_admin_url','fix_network_admin_url', 10, 3);

2017-08-30編集の終わり

私がこれを解決するために選んだ方法は、正しいリンクを使って別のネットワーク管理メニューを作ることです。これは優雅な解決策ではありません、 しかし、私はネイティブのネットワーク管理メニューだけのURLを修正し、残りのリンクをそのままにする方法を知りません(「他の可能性のある解決策」を見てください)

私の解決策はこれに似ています(テーマのfunction.phpに追加するかプラグインを作成する):

add_action('admin_head', 'admin_head_network_menu');
add_action('admin_bar_menu', 'custom_network_admin_bar_menu', 20);

function admin_head_network_menu()
{
    echo '<style type="text/css">#wp-admin-bar-my-sites-super-admin {display: none}</style>';
}

function custom_network_admin_bar_menu($adminBar)
{
    // Don't add network admin bar for non super admins
    if (!current_user_can('manage_network')) {
        return;
    }

    $mainMenuID = 'my-new-network-admin-menu';

    $adminBar->add_menu([
        'id' => $mainMenuID,
        'title' => __('Network Admin'),
        'href' => new_admin_url(),
    ]);

    $adminBar->add_menu([
        'id' => $mainMenuID.'-sites',
        'parent' => $mainMenuID,
        'title' => __('Network Sites'),
        'href' => new_admin_url('sites.php'),
    ]);

    $adminBar->add_menu([
        'id' => $mainMenuID.'-users',
        'parent' => $mainMenuID,
        'title' => __('Network Users'),
        'href' => new_admin_url('users.php'),
    ]);

    $adminBar->add_menu([
        'id' => $mainMenuID.'-plugins',
        'parent' => $mainMenuID,
        'title' => __('Network Plugins'),
        'href' => new_admin_url('plugins.php'),
    ]);

    $adminBar->add_menu([
        'id' => $mainMenuID.'-settings',
        'parent' => $mainMenuID,
        'title' => __('Network Settings'),
        'href' => new_admin_url('settings.php'),
    ]);
}

function new_admin_url($path = '')
{
    $url = network_admin_url($path);
    return str_replace('/wp-admin/network', '/backend/wp-admin/network', $url);
}

その他の考えられる解決策

(サブ)ドメインのマルチサイトインストールをお持ちの場合は、Githubの "felixarntz/multisite-fixes"(mu-plugins/wpms-site-url-fixer.php)をチェックしてください。

私は多分これは.htaccessの変更で解決できると思います。いくつかの理由で、これは私のプロジェクトの選択肢ではありませんでした。しかし、他の誰かが試してみたいのであれば、これがBedrockの.htaccessの例です。

RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
0
Eric Wallmander