Что означает этот PHP-код функции?
Может кто-нибудь помочь мне разобрать каждую часть этого кода? Можете прокомментировать каждую строку, чтобы я понял и смог адаптировать код под свои нужды. Вот ссылка на 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);
}
}
По сути, это шаблон программирования для организации пространства имен в коде 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);
}

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

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

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