Меню: добавление подстраниц в профиле. Часть 1

Одно из распространненых желаний владельцев собственных нишевых социальных сетей – добавить что-либо на страницу профиля своих пользователей. Это может быть мини-фак какой-нибудь (в формате вопросы-ответы) или другая как статическая, так и динамическая информация.

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

Итак, для начала создадим папку /wp-content/mu-plugins/. Эта папка не является deprecated – и не будет в ближайшее время. Она по-прежнему используется с той же логикой, как и в WordPress MU (до версии 3.0) – то есть все php файлы, которые лежат там в корне, инклудятся в систему и их код доступен для использования/манипулирования. Также по-прежнему файлы (или плагины), лежащие там, не требуют активации.

В эту папку мы положим наш php файл, который создаст необходимое нам меню с требуемым содержимым.

Порядок действий

1. Открыть/создать файл example.php с помощью Notepad++ (кодировка – UTF-8 без BOM, синтаксис – PHP).

2. Если вы хотите создать подменю к уже существующему меню, например, к друзьям или группам, то вписываете вот такой код:

add_action('bp_init', 'example_submenu');
function example_submenu(){
    global $bp;
    
    $parent = bp_get_friends_slug(); // bp_get_groups_slug()
    $screen = 'example_submenu_page';
    $parent_url = trailingslashit( $bp->loggedin_user->domain . $parent );
    $sub_nav = array(
        'name'            => 'Example',
        'slug'            => 'example',
        'parent_url'      => $parent_url,
        'parent_slug'     => $parent,
        'screen_function' => $screen,
        'position'        => 99,
        'item_css_id'     => 'example',
        'user_has_access' => bp_is_my_profile()
    );
    bp_core_new_subnav_item($sub_nav);
}

Параметры функции bp_core_new_subnav_item():

  • name – имя ссылки, ее анкор, по которому вы будете кликать;
  • slug – часть ссылки, которая будет использоваться в url для доступа к странице, обязательно латиницей, допускаются только буквы, цифры, дефис и подчеркивание;
  • parent_url – ссылка на уровень выше в меню (если вы делаете подстраницу к Друзья, то это ссылка на Друзья);
  • parent_slug – последняя часть ссылки меню выше (для Друзья – friends, для Группы – groups и т.д.);
  • screen_function – функция, которая вызывается для отображения контента этой страницы;
  • position – расположение этой ссылки, указанной в name (чем меньше число – тем левее/выше эта ссылка будет отображаться), целое число от 1 до 99 включительно (можно и больше, но нет смысла);
  • item_css_id – id этого подменю, чтобы можно было стилизовать его как вам захочется (background сделать, к примеру);
  • user_has_access – указание того, кто имеет доступ к этой странице. Глобальное правило – функция должна возвращать true или false. Примеры:
    • bp_is_my_profile() – только владелей этого профиля будет видеть эту страницу;
    • is_user_logged_in() – только если пользователь авторизован;
    • is_site_admin() – только админ сайта может видеть эту страницу;
    • true – все пользователи будут видеть (в том числе и неавторизованные посетители сайта).

3. Теперь нам надо написать функцию, которая будет выводить контент:

function example_submenu_page() {
	do_action( 'example_submenu_page' );
	bp_core_load_template( apply_filters( 'example_submenu_page', 'members/single/plugins' ) );
}

Здесь мы просто используем стандартный файл plugins.php, который есть внутри темы.
Находится он по адресу: /[theme]/members/single/plugins.php
Не рекомендуется менять его верстку кардинально, так как вы можете тем самым поломать работу других плагинов, которые используют этот файл.

4. Теперь добавим наш собственный контент:

add_action('bp_template_title', 'example_submenu_page_title');
function example_submenu_page_title(){
    echo 'Какой-нибудь ваш заголовок';
}
add_action('bp_template_content', 'example_submenu_page_content');
function example_submenu_page_content(){
    echo 'Здесь может быть любой текст или выводящая что-либо функция';
}

Первая функция example_submenu_page_title() отображает заголовок в h3 теге. Его можно и не использовать, если вам не надо.

Вторая функция example_submenu_page_content() уже обязательна, так как туда вы засовываете то, что увидит конечный пользователь. Это может быть все, что угодно (даже какая-нибудь галерея). Собственно, ради нее весь этот пост и написан :)

Итог

Теперь вы умеете добавлять подменю в профиле пользователя к любому уже существующему меню. Это меню также появляется и в BuddyBar.

В следующей части серии я покажу, как добавлять меню верхнего уровня. Подпишитесь, чтобы не пропустить! А на основе полученных знаний, вы сможете составить иерархию (то есть сделать свои собственные меню с подменю в профиле – любое количество и порядок).

комментария 18

  1. Александр:

    Еще бы перейти с 1.2.x и воспользоваться памяткой)

    • А ты все еще на 1.2? Переходи обязательно :)
      Я еще планирую также подробно написать про top-menu и тоже самое внутри групп.

  2. Stranger:

    Опять незнаю куда написать: проблема такая: Есть сайт на wordpress+buddypress надо прикрутить форум(выбрал bbpress 2.0.2) форум этот ввиде плагина для wordpress, ним вместе идет оптимизированная тема. Как все это настроить со стандартной темой buddypress?
    Зарание спасибо за ответ…

  3. Извиняюсь, что не по теме, но нужной темы не нашёл.
    Подскажите _аккуратный_ виджет для отображения на первой странице списка последних записей и комментариев мультисайта в с “закладками” (tabs).
    Перерыскал многое.. В принципе WideSiteActivity есть.. но там комментарии не выделены (они вместе с блогами) и закладок нет.. и внешний вид ужасен (большущие кнопищи).
    Заранее спасибо.

  4. Андрей Плечев:

    Интересная и полезная возможность.
    Не вникая в детали скопировал ваш код и вставил в созданный файл в шаблоне.
    Но нового пункта в профиле не появилось. Наверно, надо было вникать в детали :)
    а можно ли таким образом создать в профиле пользователя что то вроде страницы с отзывами о пользователе, внедрить в созданную страницу стандартные комментарии?

    • Да, можно в ту страницу все, что угодно. Просто надо написать соответствующий код в функции вывода данных на странице.

      • Андрей Плечев:

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

  5. Андрей Плечев:

    ага, понял в чем проблема была. не создал папку my_plugins

  6. Александр:

    Полезная штука, спасибо. А как можно исключить какой-нибудь пункт из меню пользователя, например, сообщения, оставив его в buddybar? Если это сделать, то при помощи вашего плагина можно засунуть в меню только самое нужно, иначе слишком много пунктов – не влезает в строчку, особенно если есть сайдбары с обеих сторон и тема не резиновая.

  7. Stranger:

    @slaFFik, можете подсказать, что нужно сделать, чтобы элемент, добавленный в меню, отображался только для текущего пользователя, а не у всех?

  8. Сергей:

    Скажите, а если нужно подменю к Профилю сделать, то как будет выглядеть функция bp_get_friends_slug()?

  9. Сергей:

    Сначала перепробовал кучу вариантов, потом написал уж сюда:), получаю ошибку Fatal error: Call to undefined function bp_get_profiles_slug() in /home/хххххх/public_html/wp-content/mu-plugins/example.php on line 6.
    Может есть описание этих функций где-то, уже второй день роюсь, не могу найти.
    Нашёл, что за вывод всего меню отвечает функция bp_get_displayed_user_nav(), но опять же, никак её не найду…

    • Поиск по файлам по содержимому строки “_slug” (без кавычек) внутри папки /buddypress/bp-xprofile/.
      Думаю, будет что-то вроде bp_get_xprofile_slug();

  10. Сергей:

    Странно, для messages, forums, settings работает, а для профиля – никак. Слава, а как добавить своё меню, получится в двух словах хотя бы толкунуть в нужную сторону? За эту статью спасибо, единственное, что нашёл по этой теме.

  11. Сергей:

    Найдены две функции:
    bp_the_profile_group_slug() и
    bp_get_the_profile_group_slug() – результат 0.
    :(

  12. Joe:

    Говнокод одним словом ! Заголовок и контенд на всех вкладках вываливается. И никуда кроме трёх вкладок эту шнягу не воткнуть. Может в древнегреческой версии buddypress и есть пасхалка bp_get_xprofile_slug();

    • Не мешало бы Вам смотреть на дату публикации статьи перед использованием на текущей версии. Так что сами виноваты, если что-то поломали.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *