2016-05-10 13 views
0

WordPressのカスタムポストタイプと高度なカスタムフィールドを使ってログインシステムを作ることはできますか?カスタム投稿タイプとカスタムフィールド(ACF)を使用してログインできますか?

私はこのような構造を持っている「ユーザー」というカスタムポストタイプ作成しました:

  • 記事のタイトル
  • ユーザーの電子メール(ACFを使用してtext型のフィールド)
  • ユーザーのパスワードを(ACFを使用したタイプパスワードのフィールド)

これらの助けを借りて私は実際に自分自身を私が望むように登録します。

私の問題は、フロントログインフォームからユーザーにログインすることができないと考えているため、保存されているデータベースの構造に問題があります。

いくつかのクエリを試しましたが、何かが正しくないように見えます。誰かがこれで私を助けることができますか?私は正しい道にいるかどうか?

$login_email = $_POST['login_email']; 
$login_password = $_POST['login_password']; 

$email_sql = $wpdb->get_var($wpdb->prepare("SELECT meta_value FROM ".$wpdb->postmeta." WHERE meta_key = %s AND meta_value = %s",'user_email', $login_email)); 

$pass_sql = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM ".$wpdb->postmeta." WHERE meta_key = %s AND meta_value = %s",'user_password', $login_password)); 

事は、ユーザーの電子メールとユーザーパスワードの両方がmeta_keyであり、彼らが同じレコードではないということであると私はそれに基づいて、ログインを行うことができないと思います。私は正しいですか、方法がありますか?

+0

[編集

など、あなたのコードを保護するために、正しくパスワードのハッシュを処理する必要があります。なぜ、組み込みのユーザー機能を使用してバイパスしたいのですか?あなたのフロントエンドユーザーは、Wordpressのバックエンドへのアクセスから除外されるカスタムロールを与えることができますか? – Gavin

+0

私はワードプレスを使ってモバイルアプリを作っているのでアプリはWordPressの外にある。私は管理目的でのみCMSを使用しています。ユーザーはWordPress管理者にアクセスできません。私は、カスタム情報で管理者から追加するだけです。 – Ionut

+0

WP-APIを簡単にインストールできます。WP-APIは、組み込み機能を使用してRESTサービスを介してログインする機能を公開します。代わりに、ユーザ名とパスワードを渡す 'meta_query'検索を使うこともできます。下の私の答えを見てください。 – Gavin

答えて

2

カスタムフィールドをクエリするためにWordpress内でメタクエリを実行できます。 usernamepasswordカスタムフィールドが提供された値と一致する場合

$user = new WP_Query(array(
    'posts_per_page' => 1, 
    'meta_query' => array(
     'relation' => 'and', 
     array(
      'key' => 'username', 
      'value' => $_POST['username'], 
      'compare' => '=' 
     ), 
     array(
      'key' => 'password', 
      'value' => $_POST['password'], 
      'compare' => '=' 
     ) 
    ) 
)); 

上記は、単一のポストを返します。

注:上記のコードは例です。 @Anonymousとチャットした後、それが判明、それはもう少し複雑だったが、最終的な解決策だった:

アウト
$login_email = $_POST['email']; 
// Hash the plain text password. 
$login_password = wp_hash_password($_POST['password']); 

// Find a post with the ACF Custom value that matches our username. 
$user_query = new WP_Query(array( 
    'posts_per_page' => 1, 
    'post_type' => 'users', 
    'meta_query' => array( 
     'relation' => 'or', 
     array( 
      'key' => 'email_user', 
      'value' => $login_email, 
      'compare' => '=' 
     ) 
    ) 
)); 
// Check if the user exists. 
if ($user_query->have_posts()) { 
    while($user_query->have_posts()){ 
     // Load the current post. 
     $user_query->the_post(); 
     // Get the current post. 
     $user = get_post(); 
     // Get the hashed password from the post. 
     $hashed_password = get_post_meta($user->ID, 'password', true); 
     // Compare the hashed passwords. 
     if (wp_check_password(wp_hash_password($login_password), $hashed_password)) { 
      echo "logged in successfull"; 
     } else { 
      echo "user found, password incorrect"; 
     } 
    } 
} 
+0

これは、巨大なオブジェクトのみを返します。これがどうやって私を助けてくれるのか分かりません。 – Ionut

+0

上記は、ACF内のカスタムフィールド設定に基づいてユーザーの投稿を返します。その後、残りの部分を処理する必要があります(なぜ、私はデフォルトの機能を使用することを提案したのですか)。 – Gavin

+0

いいえ。しかし、「あなたのコードを安全にするためには、パスワードのハッシングを正しく処理する必要があります。私はすでにカスタムフィールドを使用して保存されたパスワードをハッシュしています。私はそれを比較すると意味ですか? – Ionut

関連する問題