Изменить код php из плагина

Вопрос или проблема

Я хотел бы изменить файл php плагина, который содержит всего лишь несколько операторов if/else и echo. Я могу это сделать, скопировав файл в папку дочерней темы и изменив одну маленькую деталь, но если тема будет обновлена, эти обновления не попадут в скопированный файл, верно?

Вот часть файла:

<a class="logout with-icon" href="https://wordpress.stackexchange.com/questions/193113/<?php echo wp_logout_url( get_permalinks() ) ?>" data-icon="&#xf08b;"><?php _e('Выйти', 'franklin') ?></a>

<?php elseif ( $crowdfunding_enabled && ! is_user_logged_in() ) : ?>

    <a class="user-login button with-icon button-alt button-small" href="#" data-reveal-id="login-form" data-icon="&#xf007;"><?php _e('Войти / Зарегистрироваться', 'franklin') ?></a>

<?php endif ?>

Я хочу изменить

wp_logout_url( get_permalinks() )

на

wp_logout_url( home_url() )

В этом файле нет действий или фильтров, которые можно было бы добавить или удалить. Я видел другие ответы, которые говорят сначала создать ответвление плагина. Но тогда у ответвленной версии не будет обновлений. Есть ли какой-то другой способ внести это небольшое изменение?

Обновление:

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

add_action('wp_logout',create_function('','wp_redirect(home_url());exit();'));

Учитывая, что в теме нет фильтров, которые вы могли бы изменить, это немного сложнее, но вы можете изменить URL-адрес выхода в общем с помощью фильтра logout_url:

function hack_logout_url_wpse_193113($logout_url, $redirect) {
  $logout_url = parse_url($logout_url);
  if (!empty($logout_url['query'])) {
    parse_str(html_entity_decode($logout_url['query']),$qry_str);
    $qry_str['redirect_to'] = urlencode(home_url());
  }
  $logout_url['query'] = build_query($qry_str);
  $ret="";
  foreach ($logout_url as $k=>$v) {
    switch ($k) {
      case 'scheme':
        $ret .= $v.'://';
        break;
      case 'host':
      case 'query':
        $ret .= $v;
        break;
      default :
        $ret .= $v."https://wordpress.stackexchange.com/";
    }
  }
  return $ret;
}
add_filter('logout_url','hack_logout_url_wpse_193113',10,2);
echo wp_logout_url(get_permalink());

Ответ или решение

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

Использование Фильтра logout_url

Одним из наиболее приемлемых способов изменить поведение ссылки выхода в WordPress является использование фильтра logout_url. Этот фильтр позволяет вам изменить URL для выхода из системы, сохраняя возможность обновления плагина без потери изменений.

Пример кода:

function custom_logout_redirect($logout_url, $redirect) {
    $logout_url = parse_url($logout_url);
    // Проверяем, есть ли запрос в URL (query)
    if (!empty($logout_url['query'])) {
        parse_str(html_entity_decode($logout_url['query']), $query_vars);
        $query_vars['redirect_to'] = urlencode(home_url());
    }
    // Формируем новый запрос
    $logout_url['query'] = http_build_query($query_vars);
    // Воссоздаем URL
    $new_logout_url = '';
    foreach ($logout_url as $key => $value) {
        switch ($key) {
            case 'scheme':
                $new_logout_url .= $value . '://';
                break;
            case 'host':
            case 'port':
            case 'path':
                $new_logout_url .= $value;
                break;
            case 'query':
                $new_logout_url .= '?' . $value;
                break;
        }
    }
    return $new_logout_url;
}
add_filter('logout_url', 'custom_logout_redirect', 10, 2);

Объяснение:

  1. Функция custom_logout_redirect: Эта функция принимает два параметра:

    • $logout_url – текущий URL для выхода.
    • $redirect – URL для перенаправления после выхода.

    Функция разбивает текущий URL на его компоненты, проверяет наличие параметров запроса и изменяет параметр redirect_to, перенаправляя пользователей на главную страницу (home_url).

  2. Фильтр logout_url: Мы добавляем наш фильтр в файл functions.php вашей дочерней темы. Это позволит заменить стандартный URL для выхода на измененный URL, где вы сможете указать нужное направление.

Заключение

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

Если у вас возникнут дополнительные вопросы или потребуется помощь с интеграцией, не стесняйтесь обращаться за поддержкой!

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

Капча загружается...