Vue d'ensemble:
Sur mon site, je souhaite créer un espace client. Il existe un formulaire dans lequel le visiteur entre un nom (par exemple "event_xyz") et un mot de passe. Seuls certains cercles bien informés (les participants à l'événement xyz souhaitant télécharger des fichiers) connaissent les données d'accès. En soumettant, le visiteur est redirigé vers un fichier pp-redirect.php qui doit définir le cookie pour accéder au site spécifique auquel le visiteur souhaite accéder - $ _POST ["nom"] est égal au slug du message.
J'ai trouvé ce script pour installer ce cookie et j'ai essayé de résoudre mon problème comme ceci:
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();
Mais cela me montre que, dans ce fichier et dans wp-includes/pluggable.php, les en-têtes ont déjà été envoyés. Je ne sais pas non plus comment le script, qui provient du fichier wp-login.php? Action = postpass, sait à quel site je veux accéder. Des solutions?
Enfin, j'ai trouvé la solution:
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'] );
?>
Salue!
Vous devrez accrocher ce code pour qu'il s'exécute avant que toute donnée ne soit envoyée au navigateur.
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');
C'est complètement non testé. Je n'ai pas toutes les informations nécessaires pour le tester si je le souhaite. :) Vous devrez presque certainement modifier cela pour fonctionner dans le nouveau contexte. Mais c'est l'idée.