密码表单重定向至所属帖子

时间:2013-03-21 作者:HunterListInsight

我的想法是,访问者在页面上输入密码,然后在wordpress帖子上加载属于自己的密码(如果有)。

代码如下:

第页表单:

<form method="post" action="">
  <input type="password" name="passwordfield">
  <input type="hidden" name="homepagepassword" value="1">
  <input type="submit" value="Submit">
</form>
功能。php:

function dopasswordstuff(){
    if(isset($_POST[\'homepagepassword\'])){
    $post_password = $_POST[\'passwordfield\'];
    global $wpdb;
    $post_id = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_password = %s", $post_password) );
    $q = new WP_Query( \'p=$post_id\' );
    if($q->have_posts()){
        while($q->have_posts()){
            $q->the_post();
            wp_redirect( get_permalink ());
            die();
        }
    } else {
        // oh dear, there isnt a post with this \'password\', put a redirect to a fallback here
        wp_redirect(\'http://www.google.com\');
        die();
    }
    wp_reset_query();
    }
}
add_action(\'init\',\'dopasswordstuff\');
无论我做什么,也不管我输入什么密码,该功能都会引导我找到博客上的第一篇文章。有人能解释一下吗?

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

以下是您完成这项工作所需的全部内容,当然还有您的实际形式:

function dopasswordstuff(){
   if(isset($_POST[\'homepagepassword\'])){
    global $wpdb;
    $post_password = trim($_POST[\'passwordfield\']);
    $post_id = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_password = %s", $post_password) );
    if (!empty($post_id)) {
      wp_redirect(get_permalink($post_id));
    }
    exit;
   }
}
add_action(\'template_redirect\',\'dopasswordstuff\');
我利用以下事实大大简化了您的功能:get_permalink 将接受post ID a参数。

我迷上了template_redirect 而不是init 这似乎更合适。

SO网友:pipedragon72

我想我用这个使用cookies的代码找到了答案(我没有写!),然而,如果有人输入了错误的密码,我会看到白色的死亡屏幕,因此如果有人知道如何重新添加代码以进行重定向,那将是非常棒的。

function dopasswordstuff(){
   if(isset($_POST[\'homepagepassword\'])) {
    global $wpdb;
    $post_password = trim($_POST[\'passwordfield\']);
    $post_id = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_password = %s", $post_password) );
    if (!empty($post_id)) {
      if ( empty( $wp_hasher ) ) {
        require_once( ABSPATH . \'wp-includes/class-phpass.php\' );
        // By default, use the portable hash from phpass
        $wp_hasher = new PasswordHash(8, true);
      }
      // 10 days
      setcookie( \'wp-postpass_\' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $post_password ) ), time() + 864000, COOKIEPATH );
      wp_redirect(get_permalink($post_id));
    }
    exit;
  }
}
add_action(\'template_redirect\',\'dopasswordstuff\');

结束

相关推荐

如何将带有php代码的表单放入变量或短代码中?

我试图将我的前端表单放入一个变量或一个短代码中,这样我就可以在它周围包装另一个短代码(特别是Bainternet Post Creation Limits).我的表单中有PHP代码,所以我不确定该怎么做。我曾尝试为每行PHP代码创建其他变量,但它并没有像我想象的那样工作。我知道如何创建短代码;但我不知道如何将带有PHP的表单放入短代码中。我根本不知道如何将表单放入变量,也找不到如何执行此操作的信息。以下是表格:<form id=\"new_post\" name=\"new_post\" metho