web-dev-qa-db-ja.com

外部スクリプトを介して訪問者にパスワードで保護されたページ/投稿へのアクセスを許可する

概要:
私のサイトでは顧客エリアをやりたいです。訪問者が名前( "event_xyz"など)とパスワードを入力するフォームがあります。アクセスデータを知っているのは、よく知られたサークル(ファイルをダウンロードしたいイベントxyzの参加者)だけです。送信することで、訪問者はpp-redirect.phpにリダイレクトされ、訪問者がアクセスしたい特定のサイトにアクセスするようにCookieを設定する必要があります。

私はこのスクリプトがそのクッキーを設定するのを見つけて、このように私の問題を解決しようとしました:

global $wp_hasher;
if ( empty( $wp_hasher ) ) {
    require_once( ABSPATH . 'wp-includes/class-phpass.php' );
    $wp_hasher = new PasswordHash(8, true);
}

setcookie( 'wp-postpass_' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $_POST['pw'] ) ), 0, COOKIEPATH );

wp_safe_redirect( "http://www.domain.com/wordpress/".$_POST['name'] );
exit();

しかし、これは私にこのファイルとwp-includes/pluggable.phpにヘッダがすでに送信されているというエラーを示しています。また、wp-login.php?action = postpassから取得したスクリプトが、どのサイトにアクセスしたいかを認識していることもわかりません。解決策はありますか?

2
luke

最後に、私は解決策を見つけました:

form.php

<form action="<?php echo bloginfo('template_directory'); ?>/pp-redirect.php" method="post">
Event: <input name="event" type="text" size="25" /><br />
Passwort: <input name="post_password" type="password" size="25" /><br />
<input name="submit" type="submit" value="Los" />
</form>

pp-redirect.php

<?php
/** Make sure that the WordPress bootstrap has run before continuing. */
require( dirname(__FILE__) . './../../../wp-load.php');
global $wp_hasher;
if ( empty( $wp_hasher ) ) {
    require_once( ABSPATH . 'wp-includes/class-phpass.php' );
    $wp_hasher = new PasswordHash(8, true);
}
if ( get_magic_quotes_gpc() )
    $_POST['post_password'] = stripslashes($_POST['post_password']);

// Expires when the browser shuts down
setcookie( 'wp-postpass_' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $_POST['post_password'] ) ), 0, COOKIEPATH );

wp_safe_redirect( get_bloginfo('url') . "/" . $_POST['event'] );
?>

あいさつ

2
luke

データがブラウザに送信される前に実行されるように、そのコードをフックする必要があります。

function remote_login_wpse_104911() {
  global $wp_hasher;
  if ( empty( $wp_hasher ) ) {
    require_once( ABSPATH . 'wp-includes/class-phpass.php' );
    $wp_hasher = new PasswordHash(8, true);
  }

  setcookie( 'wp-postpass_' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $_POST['pw'] ) ), 0, COOKIEPATH );

  wp_safe_redirect( "http://www.domain.com/wordpress/".$_POST['name'] );
}
add_action('template_include','remote_login_wpse_104911');

それは全くテストされていません。必要に応じて、テストに必要な情報がすべて揃っていません。 :)あなたはほぼ確実にそれを新しい文脈で働くために修正しなければならないでしょう。しかしそれがアイデアです。

1
s_ha_dum