Faça o login no site também no WordPress

Desenvolvi um site usando PHP e MySQL, que já possui um formulário de login e registro. ( myweb.com )

Eu adicionei wordpress a ele neste url myweb.com/blog

Eu quero desativar a página de login e registro no WordPress e forçar os usuários a usar o meu. Basicamente, integre meu login com o WordPress para que o usuário seja logado em ambos os sites.

A tabela dos members site parece assim. E todos os usuários registrados são armazenados aqui. E as senhas em meu database são hash usando md5()

 id | name | email | password 

e a estrutura do WordPress é assim e atualmente está vazia

 ID | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key | user_status | display_name 

Eu tentei seguir os passos mencionados aqui

mas recebo esse erro na linha 254 var_dump($user);

  object(WP_Error)#620 (2) { ["errors"]=> array(1) { ["invalid_username"]=> array(1) { [0]=> string(166) "ERROR: Invalid username. Lost your password?" } } ["error_data"]=> array(0) { } } 

Além disso, todas as informações do usuário são armazenadas na tabela de meus members no meu site não no Word DB do WordPress.

Aqui está o meu código de login para o meu site, que adicionei recentemente o login do WordPress também.

 /* * Login * * $email = email of user * $pass = user password (must already be in md5 form) * $url = url of page they are login from */ function login($email = '', $pass = '', $url = '', $sticky = false) { global $lang, $_db, $mod, $template_style; // Replace nasty things to stop sql injection $email = addslashes(strtolower($email)); $email = strip_tags($email); $email = htmlspecialchars($email, ENT_QUOTES); //get user id $sql = "SELECT `id`, `name`, `username` FROM `members` WHERE `email`='".mysql_real_escape_string($email)."' AND `pass` = '" . mysql_real_escape_string($pass) . "' LIMIT 0,1"; $q = $_db->query($sql); list($uid, $name, $username) = $_db->fetch_array($q); $login_check = $_db->num_rows($q); if ($login_check get_error_codes() == array('empty_email', 'empty_password') ) { //$user = new WP_Error('', ''); $user = wp_update_user(array ( 'user_login' => $name, 'user_email' => $email, 'user_pass' => $pass )); } } var_dump($user); wp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie); do_action('wp_login', $user->user_login, $user); /* set login cookies */ set_login_cookie($uid, $pass, $sticky); //lock check lock_checker($uid); update_thisuser_online(); } 

Eu tenho que copiar tudo da tabela dos meus members e preenchê-lo em wp_users ou há uma maneira de fazer login no wordpress sem ter dados duplicados em 2 tabelas diferentes? Não quero ter 2 logins e 2 formulários de registro em ambos os sites.

Por que wp_authenticate() no meu código acima autenticado?

Você pode configurar o login do wordpress para usar uma tabela personalizada editando o config.php e adicionando estas duas linhas:

 define('CUSTOM_USER_TABLE','new_user_table'); //login, pass, email etc define('CUSTOM_USER_META_TABLE', 'new_usermeta_table'); //optional bio, don't have to include this line 

Onde new_user_table é a tabela do seu site e new_usermeta_table é a tabela de biologia do seu site (se desejar uma)

A tabela personalizada precisa ter a mesma estrutura que uma tabela de wordpress normal. Então, para que isso funcione com a tabela do seu site existente, você precisará adicionar alguns campos e certificar-se de que a senha seja executada da mesma maneira.

Veja como estruturar a tabela do usuário

Veja como estruturar a meta tabela do usuário

Para ter as senhas corretamente no registro, inclua o arquivo wp-includes / pluggable.php e use a function
< ?php $hash = wp_hash_password( $password ) ?>

Para as senhas existentes que não sejam escondas corretamente, você precisará configurar uma reboot da senha de e-mail.

Ou. Se você quiser manter seus hashes de senha atuais (não recomendado por motivos de segurança, mas possíveis), você pode alterar a function de hashing wordpress. Em wp-includes / pluggable.php change:

 if ( !function_exists('wp_hash_password') ){ function wp_hash_password($password) { //apply your own hashing structure here return $password; } } 

E mudança:

 if ( !function_exists('wp_check_password') ){ function wp_check_password($password, $hash, $user_id = '') { //check for your hash match return apply_filters('check_password', $check, $password, $hash, $user_id); } } 

Para detalhes sobre wp_check_password Vá aqui

alternativamente

Você pode ignorar o uso de sua tabela de usuários personalizados e ter o login do wordpress aplicado ao resto do seu site. Para fazer isso, use simplesmente o seguinte código:

 < ?php include 'wp-config.php'; if ( is_user_logged_in() ) { echo 'Welcome, registered user!'; } else { header( 'Location: http://google.com' ) ; }; ?> 

Certifique-se de que ‘wp-config.php’ é o caminho relativo completo para o arquivo, então coloque este código em cada página em seu site não wordpress. substitua o eco com qualquer conteúdo a ser exibido para um usuário conectado e substitua o header por qualquer que seja para ser exibido para um convidado. Se o conteúdo for simples html, você pode fazer o seguinte:

 < ?php include 'wp-config.php'; if ( is_user_logged_in() ) { ?>   

Welcome Registered user

< ?php } else { ?>

Please log in

< ?php }; ?>

Tente alterar as opções no seu arquivo wp-config.php para apontar para o database de seus members ; Provavelmente é uma boa idéia criar um usuário / senha separado com o MySQL e conceder privilégios ao database de seus membros. Existe uma série de opções úteis que você pode definir / alterar com esse arquivo. Eu sugiro que você leia a documentação sobre isso para mais informações detalhadas. Se você decidir tentar a abordagem acima mencionada, certifique-se de alterar também a linha de $table-prefix para corresponder ao seu database existente.

Além disso, veja se esta publicação do blog é de alguma ajuda, pois trata diretamente da autenticação externa. Há um script php disponível, que você pode copiar / colar ou ajustar de outra forma às suas necessidades específicas. Preste especial atenção ao include_once("../wp-config.php"); e include_once("../wp-includes/class-phpass.php"); linhas.

Eu consegui fazer isso há algum tempo usando uma function da API do WordPress.

 wp_set_auth_cookie( $wordpress_user_id, $remember, false ); 

$wordpress_user_id é a ID do usuário na tabela do WordPress.

$remember é uma variável booleana que indica se o WordPress deve criar um cookie persistente “lembrando” o usuário entre as sessões.

Não me lembro do terceiro, mas você poderia o Google com facilidade.


PS Para ter a function wp_set_auth_cookie disponível, você precisa include / exigir alguns arquivos WordPress antes de usá-lo. Experimente com o arquivo wp-load.php .