Личный кабинет для плагина Лейка

Если Вам необходимо сделать форму пожертвования, то лучше это сделать с помощью плагина Лейка

Лейка WordPress

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

Автоподстановка имени и email

По умолчанию плагин в форме пожертвования имеет поля «Имя и Фамилия» и «email». Таким образом у Вас регистрируются пользователи, но это не всегда удобно, если, например, у вас своя форма регистрации на сайте.

Давайте сделаем автоподстановку Имени (без Фамилии) и email и также скроем эти поля.

Wordpress пожертвования

Вставьте сниппет код:

//вставить на страницу шорткод [leyka_autofill], чтобы скрипт сработал
if (!defined('ABSPATH')) { exit; }
if (!function_exists('las_get_user_first_name')) {
    function las_get_user_first_name(\WP_User $u): string {
        $first = trim((string) get_user_meta($u->ID, 'first_name', true));
        if ($first !== '') return $first;
        $display = trim((string) $u->display_name);
        if ($display !== '') {
            $parts = preg_split('/\s+/', $display);
            if ($parts && isset($parts[0]) && $parts[0] !== '') return $parts[0];
        }
        return $u->user_login;
    }
}
if (!is_admin()) {
    add_shortcode('leyka_autofill', function() {
        if (!is_user_logged_in()) {
            return '
            <div class="leyka-login-required" style="padding:16px;border:1px solid #e5e7eb;border-radius:8px;background:#fafafa;margin:12px 0;">
                <p style="margin:0;"><a href="/login" style="text-decoration:underline;">Войдите в аккаунт</a>, чтобы пожертвовать</p>
            </div>
            <style>.leyka-pm-form{display:none!important}</style>';
        }
        $u = wp_get_current_user();
        if (!$u || !$u->ID) return '';
        $payload = [
            'email' => $u->user_email,
            'first' => las_get_user_first_name($u),
        ];
        $json = wp_json_encode($payload, JSON_UNESCAPED_UNICODE);
        return '
        <script>
        (function(){
          var data = ' . $json . ';
          function applyToForm(form){
            if (!form) return;
            var elEmail = form.querySelector(\'input[name="leyka_donor_email"]\');
            var elName  = form.querySelector(\'input[name="leyka_donor_name"]\');
            if (elEmail && elEmail.value !== data.email) {
              elEmail.value = data.email || "";
              elEmail.readOnly = true;
              elEmail.dispatchEvent(new Event("input",{bubbles:true}));
              elEmail.dispatchEvent(new Event("change",{bubbles:true}));
            }
            if (elName && elName.value !== data.first) {
              elName.value = data.first || "";
              elName.readOnly = true;
              elName.dispatchEvent(new Event("input",{bubbles:true}));
              elName.dispatchEvent(new Event("change",{bubbles:true}));
            }
            var submit = form.querySelector(\'input[type="submit"].leyka-default-submit[disabled]\');
            if (submit && ((elEmail && elEmail.value) || (elName && elName.value))) {
              submit.removeAttribute("disabled");
            }
          }
          function applyAll(){
            document.querySelectorAll("form.leyka-pm-form").forEach(applyToForm);
          }
          if (document.readyState === "loading") {
            document.addEventListener("DOMContentLoaded", applyAll);
          } else {
            applyAll();
          }
          if ("MutationObserver" in window) {
            var mo = new MutationObserver(function(mutations){
              for (var i=0;i<mutations.length;i++){
                var m = mutations[i];
                m.addedNodes && Array.prototype.forEach.call(m.addedNodes, function(n){
                  if (n.nodeType === 1) {
                    if (n.matches && n.matches("form.leyka-pm-form")) applyToForm(n);
                    else {
                      var f = n.querySelector && n.querySelector("form.leyka-pm-form");
                      if (f) applyToForm(f);
                    }
                  }
                });
              }
            });
            mo.observe(document.documentElement, {childList:true, subtree:true});
          }
        })();
        </script>';
    });
}

На странице, где у вас размещена форма пожертвования вставьте шорткод [ leyka_autofill ], чтобы автоподстановка сработала. Так сделано, чтобы код не грузился на всём сайте.

Добавьте css, чтобы скрыть поля имени и email.

.logged-in .leyka-pf .section--person .donor__textfield--email,
.logged-in .leyka-pf .section--person .donor__textfield--name {
  display: none ;}
.logged-in .leyka-pf .section--person .section-title-container {
  display: none !important;}

Кстати удобно вставлять форму пожертвования через виджет «Сбор пожертвований» в гутерберге. Без кода можно настроить цвета.

плагин Лейка

И вот, что у нас получится:

виджет Лейка
плагин Лейка

Личный кабинет через шорткод [ donor_account ]

Вставьте сниппет-код:

//Шорткод вывести стр платежи в приют
function custom_shortcode_function() {
    ob_start();
    ?>
    <iframe class="donor-account-iframe" src="/donor-account/" width="100%" height="600px" frameborder="0"></iframe>
    <?php
    return ob_get_clean();
}
add_shortcode('donor_account', 'custom_shortcode_function');

add_action('wp_head', function() {
    if( strpos($_SERVER['REQUEST_URI'], '/donor-account/') !== false ) {
        ?>
        <style>
        .header-tint {display:none!important;}
        .leyka-persistant-campaign .leyka-campaign-content .content-area .entry-content .leyka-pf-star {margin-top:50px; border-radius:30px;}
        .site-content {background-color:#F6F3EF!important;}
        .leyka-account .leyka-pf-star .leyka-screen-form h2{font-size:17px;}
        .leyka-account .leyka-star-history .donations-history .item p a {pointer-events: none !important;} .leyka-account .subscribed-campaigns-list .item .campaign-title a { pointer-events:none;}
         :root { --leyka-font-main: unset;}
         :root { --leyka-color-main: #608DDB;}
        </style>
        <?php
    }
});

Как Вы заметили css для личного кабинета можно применить только так. Измените его на своё усмотрение в сниппете. Ну и вставьте в ваш личный кабинет шорткод [ donor_account ]

Лейка личный кабинет

Ну вот так это будет выглядеть.

Приюты не кликабельны, так как там откроются страницы с пожертвованиями и там поля для ввода имени и email. Если вам нужно, чтобы они были кликабельными, то удалите из сниппета {pointer-events:none;}

Обновление!

Сделайте подстановку Имя и email чуть проще и вынесем js из php кода

Вставьте сниппет код:

//Автоподстановка имени и почты для лейки
add_shortcode('leyka_autofill', function() {
    if (!is_user_logged_in()) {
        return '<div data-leyka="{}"></div>';
    }
    $u = wp_get_current_user();
    $payload = [
        'email' => $u->user_email,
        'first' => trim(get_user_meta($u->ID, 'first_name', true)) ?: $u->display_name,
    ];
    return '<div id="leyka-autofill" data-leyka=\'' . wp_json_encode($payload, JSON_UNESCAPED_UNICODE) . '\'></div>';
});

И на страницу где форма вставьте как раньше шорткод [ leyka_autofill ] и в HTML виджет вставьте:

<script>
document.addEventListener("DOMContentLoaded", function() {
    const box = document.querySelector('#leyka-autofill');
    if (!box) return;

    const data = JSON.parse(box.dataset.leyka || "{}");

    const form = document.querySelector("form.leyka-pm-form");
    if (!form) return;

    const email = form.querySelector('input[name="leyka_donor_email"]');
    const name  = form.querySelector('input[name="leyka_donor_name"]');

    if (email && data.email) {
        email.value = data.email;
        email.readOnly = true;
        email.dispatchEvent(new Event("input", {bubbles: true}));
        email.dispatchEvent(new Event("change", {bubbles: true}));
    }

    if (name && data.first) {
        name.value = data.first;
        name.readOnly = true;
        name.dispatchEvent(new Event("input", {bubbles: true}));
        name.dispatchEvent(new Event("change", {bubbles: true}));
    }

    const submit = form.querySelector('input[type="submit"].leyka-default-submit[disabled]');
    if (submit && (email?.value || name?.value)) {
        submit.removeAttribute("disabled");
    }
});
</script>

Ну а для не авторизованных просто динамически скройте форму.

Picture of Автор: Александра

Автор: Александра

@avsalexandra
Занимаюсь натуральным питанием собак и кошек BARF. Wordpress для души ☺️

Crocoblock
Elementor
Gutenberg
Jetengine
Jetformbuilder
profile builder
Woocommerce
Wordpress
WYSIWYG
Лейка
#автосохранение
#доменная почта
#рассылка
#бейдж
#благотворительность
#заказ ожидает
#подарок
#подчёркивание
#публикация постов
#видео
#пожертвования
#мультивыбор
#роли
#drag and drop
#изображения товаров
#подписки
#распродажа
#личный кабинет
#пагинация
#alt text
#галерея товара
#аватар
#возврат
#видео товара
#купон
#отменить заказ
Комментарии:

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