#php #mysql #wordpress
#php #mysql #wordpress
Вопрос:
Простите меня, если это ультраосновно, я довольно новичок во всем этом.
Я пытаюсь извлечь строковое значение (название главы) из базы данных WordPress, использовать функцию php для переименования значения, а затем объединить переименованное значение с некоторыми другими переменными для создания member_id.
Ниже мой текущий код (добавлен вfunctions.php файл) и у меня с этим 2 проблемы:
- Из 1-й функции, когда я использую короткий код
[member_chapter]
на странице / сообщении, я всегда получаюPG
независимо от того, какое значение названия главы использовалось для регистрации. Если я переключаю порядок операторов foreach, то я всегда получаюBB
, т. Е. Я всегда получаю возвращаемое значение первогоif
оператора, независимо от того, какое название главы на самом деле в базе данных. - Из 2-й функции я никогда не получаю chapter_id, вместо этого результат всегда такой
FAL--2020-1007
, т. Е. Он не добавляет значение chapter_id, сгенерированное из 1-й функции
Я был бы очень признателен за любую помощь.
/**
* Fetch chapter name and return as 2-character chapter_id
* Create shortcode for viewing chapter_id
*/
add_action('user_register', 'fetch_chapter');
function fetch_chapter(){
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
global $wpdb;
$result = $wpdb->get_results('SELECT meta_value FROM usermeta WHERE meta_key = 'chapter_name' AND user_id = ' . $current_user->ID);
foreach($result as $row){
if ($row->meta_value = 'Peregrine') {
return $row->meta_value = 'PG';
}elseif ($row->meta_value = 'Barbary') {
return $row->meta_value = 'BB';
}else {
return $row->meta_value;
}
}
}
add_shortcode('member_chapter', 'fetch_chapter');
/**
* Generate unique_id
* Retrieve chapter_id
* Create member_id
* Add member_id to user_meta table
*/
add_action('user_register', 'generate_member_id');
function generate_member_id($user_id){
$unique_id = 1000 $user_id;
$chapter_id = fetch_chapter();
$member_id = "FAL-" . $chapter_id . "-" . date("Y") . "-" . $unique_id;
update_user_meta($user_id, 'member_id', $member_id);
}
Исправленный фрагмент
add_action('user_register', 'fetch_chapter');
function fetch_chapter(){
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
global $wpdb;
$result = $wpdb->get_results('SELECT meta_value FROM usermeta WHERE meta_key = 'chapter_name' AND user_id = '. $current_user->ID .' LIMIT 1');
if ($result[0]->meta_value == 'Peregrine') {
$result[0]->meta_value = 'PG';
}elseif ($result[0]->meta_value == 'Barbary') {
$result[0]->meta_value = 'BB';
}
return $result[0]->meta_value;
}
add_action('user_register', 'generate_member_id');
function generate_member_id($user_id){
$unique_id = 1000 get_current_user_id();
$chapter_id = fetch_chapter();
$member_id = "FAL-" . $chapter_id . "-" . date("Y") . "-" . $unique_id;
return $member_id;
}
add_shortcode('member_id', 'generate_member_id');
Комментарии:
1.
$row->meta_value = 'Peregrine'
это присвоение, а не сравнение! Используйте$row->meta_value == 'Peregrine'
вместо этого.2. Что вы пытались отладить в своем коде? Что вы имеете в виду под «переименовать строку»?
3. Комментарий @majidhajibaba полезен, но обратите внимание, что вы действительно должны проводить полное сравнение
===
в качестве наилучшей практики;-)
4. Я предлагаю это в ответе @Martin. Спасибо.
Ответ №1:
У вас несколько ошибок! Пожалуйста, прочитайте больше о языках программирования, прежде чем писать программы. Смотрите руководство по PHP
В первой функции вы использовали оператор присваивания (который является =
) вместо оператора сравнения (который является ==
или ===
). Вы должны изменить его везде, где используете if
в своем коде. Кроме того, вы используете функцию возврата внутри foreach. это означает, что ваш цикл foreach выполняется только один раз, а затем возвращается. Вы должны использовать просто if вместо foreach и использовать Limit 1 в вашем sql. Или сделайте все, что нужно сделать в вашем цикле, и избегайте else return blahblah
. Ваша вторая проблема связана с вашей первой, потому что, вероятно, $row->meta_value
для вашей первой возвращенной записи значение null.
Комментарии:
1. Я заменил операторы присваивания сравнениями. И 1-я проблема, похоже, теперь исправлена. Я все еще немного озадачен тем, как решить вторую проблему. Теперь в конце есть только один оператор return, удален foreach и добавлен LIMIT 1 к запросу, но я определенно ошибся, потому что возвращаемое значение — это просто массив.
2. Вы должны использовать $result[0] вместо $row. И проверьте в операторе if, имеет ли результат какой-либо член или нет.
3. Спасибо @majidh, пожалуйста, посмотрите пересмотренный фрагмент в моем исходном сообщении. Я получаю правильное 2-символьное мета_значение даже с дополнительными операторами elseif. Но вторая проблема сохраняется — результат 1-й функции не добавляется ко 2-й функции
4. Вы пропустили
return
ключевое слово! Нет необходимости, спасибо. Просто проголосуйте и примите, если ваша проблема решена.5. Я просто не вижу этого @majidh. У меня есть оператор return на месте
return $result[0]->meta_value;
. Возвращаемое значение попадает во внешний интерфейс (с коротким кодом), но не во 2-ю функцию.