Вопрос или проблема
Мне нужно получить 10 текущих полей пользователя и передать значения полей в строку поста. Строка поста ожидает определенные имена меток для каждого значения.
Пример – строка поста ожидает 'firstname' => 'value'
, а не 'user_firstname' => 'value'
. После нескольких дней фатальных ошибок парсинга синтаксиса, теперь я просто получаю статус неудачи. Либо мой код массива, либо код поста (или оба) каким-то образом ошибочен. Сегодня я прочитал пост 2011 года, в котором говорится, что с версии WordPress 3.3 (текущая версия – 3.9) способ обращения к пользовательским полям изменился. В посте > http://goo.gl/x5deHi говорится, что можно обращаться к пользовательским полям WP, как к пяти из моих, следующим образом:
if ( $current_user->has_prop( 'my-field' ) ) )
echo '<p>
' . $current_user->get( 'my-field' ) . '
</p>';`
Так что это код, который у меня есть на данный момент:
// Получить значения для этих 10 полей пользователя
function wp_get_current_user() {
$current_user = wp_get_current_user();
$current_user_info = array(
'firstname' . $current_user->user_firstname =>' ',
'lastname' . $current_user->user_lastname =>' ',
if ( $current_user->has_prop( 'mepr-address-one' ) ) )
' . $current_user->get( 'mepr-address-one' ) . => ' ',
if ( $current_user->has_prop( 'mepr-address-city' ) ) )
' . $current_user->get( 'mepr-address-city' ) . => ' ',
if ( $current_user->has_prop( 'mepr-address-state' ) ) )
' . $current_user->get( 'mepr-address-state' ) . => ' ',
if ( $current_user->has_prop( 'mepr-address-zip' ) ) )
' . $current_user->get( 'mepr-address-zip' ) . => ' ',
if ( $current_user->has_prop( 'mepr-address-country' ) ) )
' . $current_user->get( 'mepr-address-country' ) . => ' ',
'email' . $current_user->user_email =>' ',
'username' . $current_user->user_login =>' ',
'password' . $current_user->user_pass =>' '
);
}
// Генерировать строку POST
// Эти последние три строки не отправляют мои значения пользователя
$postdata="";
foreach($query_vals as $key => $value){
$postdata .= $key.'='.urlencode($n=$value).'&';
}
И строка поста должна соответствовать параметрам, описанным в посте, который таков:
foreach ( get_user_meta( $user->ID ) as $key => $values ) {
var_dump( $key, $values );
}
Но, будучи новичком в PHP, я не уверен в синтаксисе кода. Разве мне не нужно определить has_prop, прежде чем я смогу его использовать?
В вашем коде много ошибок. Например, внутри вам нужно объявить global $current_user
, а не снаружи. Другая ошибка – вы используете переменную $query_vals
снаружи функции, где эта переменная не определена. В любом случае, я бы использовал функцию wp_get_current_user()
, которая не должна вызываться до инициализации хука действий.
Например, если вы собираетесь использовать строку POST как данные для Javascript:
add_action( 'wp_enqueue_scripts', 'wpse_scripts' );
function wpse_scripts() {
$user_fields = wpse_get_current_user_info();
$postdata = http_build_query( $user_fields );
wp_localize_script( 'my_script', 'my_script_data', $postdata );
}
function wpse_get_current_user_info() {
$current_user = wp_get_current_user();
$current_user_info = array(
'firstname' => $current_user->user_firstname,
'lastname' => $current_user->user_lastname,
//Добавьте остальную информацию, которая вам нужна
//В формате ключ => значение
);
return $current_user_info;
}
Чтобы помочь вам более конкретно, вам следует сказать, где вы собираетесь использовать строку POST и в каком контексте.
Базовый пример отправки данных пользователя на сервер, используя WP HTTP API (Вызовите wpse_send_user_data, когда вам нужно получить тело ответа после отправки данных пользователя стороннему сервису):
function wpse_send_user_data() {
//Вы должны проверить, нужно ли делать запрос
//if( $some_control == true ) return;
$uerdata = wpse_get_current_user_info();
$args = array( 'method' => 'POST', 'body' => $uerdata );
$request = wp_remote_request( 'http://www.example.com', $args )
$response = wp_remote_retrieve_body($request);
return $response;
}
function wpse_get_current_user_info() {
$current_user = wp_get_current_user();
$current_user_info = array(
'firstname' => $current_user->user_firstname,
'lastname' => $current_user->user_lastname,
//Добавьте остальную информацию, которая вам нужна
//В формате ключ => значение
);
return $current_user_info;
}
Я предпочитаю использовать WP HTTP API, но если вы хотите использовать cURL:
function wpse_send_user_data() {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.example.com/");
curl_setopt($ch, CURLOPT_POST, 1);
// Получить массив информации о пользователе и установить в качестве полей POST
$uerdata = wpse_get_current_user_info();
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query( $uerdata ));
// получать ответ сервера ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
curl_close ($ch);
// дальнейшая обработка ....
if ($server_output == "OK") { ... } else { ... }
}
function wpse_get_current_user_info() {
$current_user = wp_get_current_user();
$current_user_info = array(
'firstname' => $current_user->user_firstname,
'lastname' => $current_user->user_lastname,
//Добавьте остальную информацию, которая вам нужна
//В формате ключ => значение
);
return $current_user_info;
}
Ответ или решение
Получение текущего массива пользователя с использованием строки POST в WordPress
Ваша задача заключается в извлечении значений десяти полей текущего пользователя в WordPress и передаче этих значений в строку POST с определёнными названиями меток. Давайте шаг за шагом разберёмся, как это правильно реализовать, соблюдая синтаксис PHP и методологии WordPress.
Основные моменты
- Получение текущего пользователя: Мы будем использовать функцию
wp_get_current_user()
, которая предоставляет объект текущего пользователя. - Создание массива с данными пользователя: Мы соберём необходимые данные в виде ассоциативного массива, где ключами будут названия меток, а значениями — соответствующие поля пользователя.
- Формирование строки POST: Для создания строки POST мы воспользуемся функцией
http_build_query()
, которая преобразует массив в строку форматаkey=value
.
Код
Ниже представлен подробный код для извлечения пользовательских данных и формирования строки POST:
// Получение информации о текущем пользователе
function wpse_get_current_user_info() {
$current_user = wp_get_current_user(); // Получаем объект текущего пользователя
// Собираем необходимые поля в массив
$current_user_info = array(
'firstname' => $current_user->user_firstname,
'lastname' => $current_user->user_lastname,
'address_one' => $current_user->has_prop('mepr-address-one') ? $current_user->get('mepr-address-one') : '',
'address_city' => $current_user->has_prop('mepr-address-city') ? $current_user->get('mepr-address-city') : '',
'address_state' => $current_user->has_prop('mepr-address-state') ? $current_user->get('mepr-address-state') : '',
'address_zip' => $current_user->has_prop('mepr-address-zip') ? $current_user->get('mepr-address-zip') : '',
'address_country' => $current_user->has_prop('mepr-address-country') ? $current_user->get('mepr-address-country') : '',
'email' => $current_user->user_email,
'username' => $current_user->user_login,
// Обратите внимание, что поле password не рекомендуется передавать через POST из соображений безопасности
);
return $current_user_info; // Возвращаем массив
}
// Отправка данных пользователя через POST-запрос
function wpse_send_user_data() {
$user_data = wpse_get_current_user_info(); // Получаем массив пользовательских данных
$args = array(
'method' => 'POST',
'body' => $user_data
);
// Здесь вы можете определить URL, куда отправляются данные
$response = wp_remote_post('http://www.example.com', $args);
// Получаем тело ответа
return wp_remote_retrieve_body($response);
}
// Пример вызова функции отправки данных
add_action('init', 'wpse_send_user_data'); // Настройка вызова функции при инициализации
Пояснения к коду
- Функция
wpse_get_current_user_info()
: Эта функция собирает информацию о текущем пользователе и возвращает ассоциативный массив с именами полей, которые вы указали. - Проверка свойств пользователя: Используется метод
has_prop()
, чтобы определить, есть ли пользователь определённое свойство, прежде чем извлекать его с помощью методаget()
. Это предотвращает ошибки, если свойство отсутствует. - Отправка данных через
wp_remote_post()
: Данные отправляются с помощью встроенной функции WordPress, которая позволяет обрабатывать HTTP-запросы. В данном примере вы отправляете данные на указанный URL.
Заключение
Данный код является практическим примером того, как можно эффективно управлять данными пользователя и отправлять их на сервер в формате, требуемом для дальнейшей обработки. Важно помнить о безопасности передачи данных, особенно когда речь идёт о конфиденциальной информации, такой как пароли. Также рекомендуется отладить и протестировать код в безопасной среде перед его развертыванием на производственном сайте.