Вопрос или проблема
Кто-нибудь сталкивался с этой проблемой: использование 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 и возможность их комбинирования позволяют избежать распространенных ошибок. В данном случае важно правильно использовать относительные и абсолютные пути в зависимости от ситуации. Удачное исправление может значительно улучшить читаемость и работоспособность вашего кода, а также упростить отладку.