Что означает этот PHP-код функции?

29 мар. 2012 г., 00:41:37
Просмотры: 828
Голосов: -7

Может кто-нибудь помочь мне разобрать каждую часть этого кода? Можете прокомментировать каждую строку, чтобы я понял и смог адаптировать код под свои нужды. Вот ссылка на pastebin:

class Towfiq_Person {
    static function on_load() {
        // Добавляем действие при инициализации WordPress
        add_action('init',array(__CLASS__,'init'));
        // Добавляем действие при создании/обновлении записи
        add_action('wp_insert_post',array(__CLASS__,'wp_insert_post'),10,2);
        // Добавляем действие при обновлении профиля пользователя
        add_action('profile_update',array(__CLASS__,'profile_update'),10,2);
        // Добавляем действие при регистрации нового пользователя
        add_action('user_register',array(__CLASS__,'profile_update'));
        // Добавляем фильтр для ссылки автора
        add_filter('author_link',array(__CLASS__,'author_link'),10,2);
        // Добавляем фильтр для URL автора
        add_filter('get_the_author_url',array(__CLASS__,'author_link'),10,2);
 }

Остальная часть кода по этой ссылке: pastebin.com/30GCNhLv

Большое спасибо

ОБНОВЛЕНИЕ 1:

Первая часть понятна, а что насчет этой части? Что делает каждая строка, я имею в виду простым языком:

 // Статическая функция для получения ключа email
 static function get_email_key() {
     // Возвращает ключ для email с возможностью фильтрации
     return apply_filters( 'person_email_key', '_email' );
 }
 // Функция обновления профиля пользователя
 static function profile_update($user_id,$old_user_data=false) {
     global $wpdb;
     $is_new_person = false;
     // Получаем данные пользователя
     $user = get_userdata($user_id);
     // Получаем email пользователя (старый или новый)
     $user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email);
     // Получаем ключ для email
     $email_key = self::get_email_key();
     // Ищем запись (post) связанную с этим email
     $person_id = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta}      WHERE     meta_key='%s' AND meta_value='%s'",$email_key,$user_email));
     // Если запись не найдена, создаем новую
     if (!is_numeric($person_id)) {
         $person_id = $is_new_person = wp_insert_post(array(
            'post_type' => 'towfiq-person',
            'post_status' => 'publish',   // Возможно стоит установить 'pending' или 'draft'?
            'post_title' => $user->display_name,
        ));
    }
    // Обновляем метаданные пользователя
    update_user_meta($user_id,'_person_id',$person_id);
    // Обновляем метаданные записи
    update_post_meta($person_id,'_user_id',$user_id);
    // Если это новый пользователь или изменился email, обновляем email в записи
    if ($is_new_person || ($old_user_data && $user->user_email!=$old_user_data-   >user_email)) {
        update_post_meta($person_id,$email_key,$user->user_email);
    }
}
1
Комментарии

Попробуйте сформулировать это как управляемый вопрос. В текущем виде это даже не вопрос, а просьба сделать работу по документированию стороннего кода и объяснению его вам. Таким образом, это не подходит для формата вопросов и ответов на этом сайте.

Rarst Rarst
29 мар. 2012 г. 01:40:02
Все ответы на вопрос 1
4

По сути, это шаблон программирования для организации пространства имен в коде WordPress-плагина. Обычно в программе может быть только одна функция с именем init(), но несколько авторов могут попытаться использовать это имя. Размещение имен функций внутри класса позволяет обойти это ограничение.

Например:

class Towfiq_Person {
    static function on_load() { }

    static function init() { }

    static function profile_update() { }
}

Вместо прямого вызова этих функций, их вызывают с указанием имени класса. Например:

Towfiq_Person::on_load();
Towfiq_Person::init();
Towfiq_Person::profile_update();

Участок кода, который вы включили в свой вопрос, является загрузчиком (bootstrapper) для этого класса. В самом низу связанного PHP-файла находится строка Towfiq_Person::on_load(), которая указывает WordPress выполнить статическую функцию on_load() класса Towfiq_Person.

Эта функция связывает различные события и фильтры внутри WordPress. Когда WordPress запускает действие init, оно также вызовет Towfiq_Person::init(). Когда WordPress добавляет запись и запускает действие wp_insert_post, оно также вызовет Towfiq_Person::wp_insert_post().

Каждая строка, которую вы перечислили выше, связывает конкретную функцию в классе с конкретным событием, запускаемым WordPress.

Я рекомендую вам немного почитать о Действиях и Фильтрах, чтобы точно понять, что происходит, но это базовый обзор.

Обновление

Исходя из вашего дополнительного запроса информации...

Мы не можем определить каждую функцию для вас. Вам действительно стоит связаться с оригинальным разработчиком и запросить документацию. Но вот краткий обзор.

Функция get_email_key() применяет фильтр WordPress к строке "_email". По сути, она берет "_email" и пропускает ее через любую функцию, привязанную к этому фильтру, перед тем как вернуть пользователю. Если бы вы вызвали get_email_key() прямо сейчас, вам бы вернулось "_email".

Функция profile_update() привязана к действиям profile_update и user_register в WordPress. Когда любое из этих действий запускается, WordPress вызовет вашу функцию и передаст ID пользователя, который изменяется, и (опционально) данные, которые были изменены.

Ваша функция затем выполняет следующее:

// Ссылаемся на глобальный объект базы данных, чтобы позже выполнить запросы
global $wpdb;

// Пока предполагаем, что это существующая запись. Это будет обновлено позже,
// если необходимо.
$is_new_person = false;

// Получаем данные пользователя, переданные WordPress
$user = get_userdata($user_id);

// Если у нас есть старые данные пользователя, берем email из них. Если нет, берем email
// из объекта $user, созданного выше.
$user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email);

// Получаем ключ email. Обычно это будет "_email"
$email_key = self::get_email_key();

// Получаем ID человека, с которым работаем, из базы данных. Мы ищем
// ID записи, у которой есть мета-информация, соответствующая ключу email из выше
// и email-адресу пользователя.
$person_id = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' AND meta_value='%s'",$email_key,$user_email));

// Если мы не нашли ID пользователя (возвращается null или "false"), тогда мы
// вставляем новый пользовательский тип записи "towfiq-person" с нужными данными.
// Заголовок — это имя пользователя, статус — опубликован, и мы устанавливаем
// мета-информацию записи, чтобы потом можно было найти ее с помощью запроса выше.
if (!is_numeric($person_id)) {
         $person_id = $is_new_person = wp_insert_post(array(
            'post_type' => 'towfiq-person',
            'post_status' => 'publish',   // Возможно, здесь должен быть pending или draft?
            'post_title' => $user->display_name,
        ));
    }
    // Обновляем мета-информацию пользователя, чтобы связать с новым пользовательским типом записи
    update_user_meta($user_id,'_person_id',$person_id);
    // Обновляем мета-информацию пользовательского типа записи, чтобы связать с пользователем
    update_post_meta($person_id,'_user_id',$user_id);
    if ($is_new_person || ($old_user_data && $user->user_email!=$old_user_data->user_email)) {
        // Обновляем мета-информацию пользовательского типа записи, чтобы связать с email пользователя
        update_post_meta($person_id,$email_key,$user->user_email);
    }
29 мар. 2012 г. 00:53:13
Комментарии

спасибо, я понял первую часть, но что насчет второй части, смотри update1.

fritids fritids
29 мар. 2012 г. 01:15:13

Я задокументирую один набор функций, но честно говоря, мы не будем делать всю работу за вас. Читайте код. Если вы не понимаете, что он делает, свяжитесь с оригинальным разработчиком и попросите документацию. Мы не будем писать код или документацию за вас.

EAMann EAMann
29 мар. 2012 г. 01:25:37

большое спасибо за ваши усилия, я понял. я пытался связаться с автором этого кода на этом сайте, но без успеха. не страшно, это уже начало. удачи

fritids fritids
29 мар. 2012 г. 01:48:00

Я связался напрямую с автором оригинального кода - если посмотреть, исходный ответ был предоставлен Майком Шинклом. Просто загуглите его имя, и я уверен, вы сможете найти его контактные данные, чтобы связаться, если вам понадобится дополнительная помощь.

EAMann EAMann
29 мар. 2012 г. 01:49:19