В PHP как мне переименовать строку в одной функции и использовать результат во второй функции

#php #mysql #wordpress

#php #mysql #wordpress

Вопрос:

Простите меня, если это ультраосновно, я довольно новичок во всем этом.

Я пытаюсь извлечь строковое значение (название главы) из базы данных WordPress, использовать функцию php для переименования значения, а затем объединить переименованное значение с некоторыми другими переменными для создания member_id.

Ниже мой текущий код (добавлен вfunctions.php файл) и у меня с этим 2 проблемы:

  1. Из 1-й функции, когда я использую короткий код [member_chapter] на странице / сообщении, я всегда получаю PG независимо от того, какое значение названия главы использовалось для регистрации. Если я переключаю порядок операторов foreach, то я всегда получаю BB , т. Е. Я всегда получаю возвращаемое значение первого if оператора, независимо от того, какое название главы на самом деле в базе данных.
  2. Из 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-ю функцию.