использование admin_url() в add_menu_page()

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

Кто-нибудь сталкивался с этой проблемой: использование admin_url() в add_menu_page() возвращает URL, который содержит имя домена дважды:

add_submenu_page(
        'smart-crm',
        __('WP SMART CRM Documents', 'mytextdomain'),
        __('Documents', 'mytextdomain'),
        'manage_options',
        admin_url('admin.php?page=smart-crm&p=documenti/list.php'),
        ''
        );

Моя ссылка на выходе: https://domain.com/domain.com/wp-admin/admin.php?page=smart-crm&p=documenti/list.php

Есть идеи?

Ссылка: добавить подменю

Вы не можете использовать какую-либо функцию в качестве URL-параметра, только слаг страницы администратора.

Похоже, я решил проблему следующим образом:

$adminurl=admin_url();
add_submenu_page(
    'smart-crm',
    __('WP SMART CRM Documents', 'mytextdomain'),
    __('Documents', 'mytextdomain'),
    'manage_options',
    $$adminurl.'admin.php?page=smart-crm&p=documenti/list.php',
    ''
    );

Теперь ссылки правильные.

Извиняюсь, что поднимаю такую старую тему, но я столкнулся с этой конкретной проблемой недавно, и все, что я нашел в Google, было “Вот что делает функция” и ничего связанного с этой проблемой, кроме этого поста.

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

Да, вышеуказанный метод действительно решает проблему, но это случайность. Добавив $$ перед adminurl, он фактически вызывает пустую строку, так как он хранит URL в переменной, а затем пытается использовать переменную с именем, которое совпадает с URL. Поскольку он никогда не создавал переменную с именем $”mysite.com/wp-admin”, $$adminurl всегда будет возвращать пустую строку.

В связи с этим я провел последний эксперимент и просто полностью отказался от использования admin_url() — это сработало идеально. То есть:

add_submenu_page(
    'smart-crm',
    __('WP SMART CRM Documents', 'mytextdomain'),
    __('Documents', 'mytextdomain'),
    'manage_options',
    'admin.php?page=smart-crm&p=documenti/list.php',
    '');

Это решение проблемы с двойным доменом. В идеале, мне также хотелось бы знать ответ на вопрос автора поста и понимать, ПОЧЕМУ домен возвращается дважды, но пока это работает, я могу с этим жить.

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

Использование функции admin_url() в вызове add_menu_page() и add_submenu_page() может вызывать путаницу, особенно когда она приводит к ситуации, в которой URL-адрес содержит доменное имя дважды. Давайте разберем эту ситуацию подробно и посмотрим, как ее можно исправить.

Описание проблемы

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

add_submenu_page(
    'smart-crm',
    __('WP SMART CRM Documents', 'mytextdomain'),
    __('Documents', 'mytextdomain'),
    'manage_options',
    admin_url('admin.php?page=smart-crm&p=documenti/list.php'),
    ''
);

В результате вы получаете URL вида https://domain.com/domain.com/wp-admin/admin.php?page=smart-crm&p=documenti/list.php. Здесь мы видим, что доменное имя появляется дважды, что, конечно, является ошибкой.

Причина возникновения проблемы

Данная проблема возникает из-за неправильного использования функции admin_url(). Когда вы передаете полный путь в add_submenu_page(), необходимо понимать, что admin_url() уже возвращает полный URL-адрес, который включает доменное имя и пути к админским страницам WordPress. Если вы добавите к этому уже существующему пути еще один путь, вы получите дублирование доменного имени.

Решение проблемы

Как было отмечено в комментариях, одно из возможных решений заключается в использовании переменной для хранения URL:

$adminurl = admin_url();
add_submenu_page(
    'smart-crm',
    __('WP SMART CRM Documents', 'mytextdomain'),
    __('Documents', 'mytextdomain'),
    'manage_options',
    $adminurl . 'admin.php?page=smart-crm&p=documenti/list.php',
    ''
);

Однако стоит отметить, что эта реализация, как указано, имеет своеобразный недостаток. На самом деле, в коде присутствует ошибка с двойным знаком доллара ($$), который приводит к тому, что переменная $adminurl остается пустой. Это может вызвать путаницу.

Еще одно решение, которое оказалось более простым и, как показано на практике, также работало корректно:

add_submenu_page(
    'smart-crm',
    __('WP SMART CRM Documents', 'mytextdomain'),
    __('Documents', 'mytextdomain'),
    'manage_options',
    'admin.php?page=smart-crm&p=documenti/list.php',
    ''
);

Здесь мы используем относительный путь, что исключает возможность неправильного формирования URL-адреса.

Объяснение механизма работы

Функция admin_url() предназначена для формирования полного URL для административной части WordPress. При использовании внутри add_submenu_page() важно помнить, что она уже добавляет базовый URL. Если вы хотите указать дополнительный маршрут или параметры, вы должны использовать относительный путь. Таким образом, вызов admin.php?page=smart-crm&p=documenti/list.php будет более подходящим вариантом.

Заключение

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

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

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