Как создать и связать страницу администрирования для плагина?
Полный код:
<?php
// Проверяем, является ли пользователь администратором
if (is_admin()) {
function wpsc_display_products_seo(){
global $wpdb;
$productList = $wpdb->get_results("SELECT * FROM " . WPSC_TABLE_PRODUCT_LIST . " ORDER BY name ASC");
echo get_admin_page_parent();
$path = 'admin.php?page=wpsc_product_seo_details';
$url = admin_url($path);
?>
<h2><?php _e('Список товаров','wpsc'); ?></h2>
<p>Ниже представлен список товаров. Выберите товар для редактирования его SEO-параметров.</p>
<table>
<tr>
<td></td>
<td>Название товара</td>
<td>Мета-заголовок</td>
<td>Мета-описание</td>
<td>Редактировать</td>
</tr>
</table>
<table>
<?php if($productList) : ?>
<?php foreach($productList as $product) : ?>
<?php $meta = getProductMeta($product->id); ?>
<tr style="background:#fff;">
<td width="200"><?php echo $product->name; ?></td>
<td width="300"><?php getVal($meta, 'meta_title'); ?></td>
<td width="200"><?php getVal($meta, 'meta_description'); ?></td>
<td width="200"><?php getVal($meta, 'meta_keywords'); ?></td>
<td width="200"><a href="<?php echo $url; ?>">Редактировать</a></td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</table>
<?php
}
function wpsc_product_seo_details()
{
echo "<h2>Привет</h2>";
}
function getProductMeta($id)
{
global $wpdb;
$meta = $wpdb->get_results("SELECT * FROM " . WPSC_TABLE_PRODUCT_META . " WHERE product_id = $id");
if($meta)
{
return $meta;
} else {
return null;
}
}
function getVal($RS, $key)
{
if($RS)
{
if (property_exists($RS, $key))
{
return $RS->$key;
}
}
return null;
}
function wpsc_add_seo_admin_pages($page_hooks, $base_page) {
$page_hooks[] = add_submenu_page($base_page, __('SEO для товаров','wpsc'), __('SEO для товаров','wpsc'), 7, 'wpsc-module-seo', 'wpsc_display_products_seo');
return $page_hooks;
}
add_filter('wpsc_additional_pages', 'wpsc_add_seo_admin_pages',10, 2);
}
?>
СТАРЫЙ ПОСТ
Привет всем,
Сейчас я разрабатываю плагин для клиента в WordPress. Проблема возникает при клике пользователя на "Редактировать" для изменения записи - я не уверен, как создать административную ссылку.
Пример:
<a href="<?php echo get_bloginfo('url'); ?>/wp-admin/admin.php?page=wpsc_product_seo_details">Редактировать</a>
function wpsc_product_seo_details()
{
echo "<h2>Привет</h2>";
}
Понимаю, что разметка тега возможно некорректна (это тестовый вариант). Нужно ли регистрировать хук для этого?

Я не совсем понимаю, что именно вы пытаетесь сделать.
Ссылки в админ-панели можно удобно создавать с помощью функции admin_url()
, например так:
$path = 'admin.php?page=wpsc_product_seo_details';
$url = admin_url($path);
$link = "<a href='{$url}'>Редактировать</a>";
echo $link;
С чем именно у вас возникла проблема?

Когда я нажимаю на ссылку, получаю сообщение: У вас недостаточно прав для доступа к этой странице.

Извините, возможно, я не очень хорошо объясняю. У меня есть пункт подменю, при нажатии на который отображается список товаров. Рядом с каждым товаром есть кнопка редактирования, и когда администратор нажимает на неё, происходит переход по указанному URL и вызывается соответствующая функция (чтобы можно было отобразить форму редактирования товара и т.д.)

Товары — это технически пользовательские типы записей? Что именно представляет собой ссылка редактирования? Я всё ещё не уверен, но взгляните на edit_post_link()
, которая генерирует ссылки редактирования для отдельных записей.

У вас есть проблемы с созданием страницы администрирования?
add_action( 'admin_menu', 'wpse4677_admin_menu' );
function wpse4677_admin_menu()
{
add_options_page(
'WPSE 4677 Заголовок страницы',
'WPSE 4677 Заголовок пункта меню',
'manage_options', // Минимальные права для доступа к странице
'wpse4677-page-identifier', // Уникальный идентификатор
'wpse4677_page_content' // Функция обратного вызова для вывода содержимого
);
}
function wpse4677_page_content()
{
echo '<div class="wrap">';
echo '<h2>Добро пожаловать на мою страницу!</h2>';
echo '</div>';
}

Просто некоторая информация к обсуждению, которая может быть вам полезна в дальнейшем...
Когда вы находитесь на странице плагина, устанавливаются различные административные переменные. Вы можете построить базовый URL из этих переменных и генерировать ссылки оттуда, предполагая, что вы хотите, чтобы они указывали на текущую страницу плагина..
global $pagenow, $plugin_page;
$this_page = add_query_arg( 'page', $plugin_page, admin_url( $pagenow ) );
/*
Пример URL
themes.php?page=custom-background
$pagenow - themes.php
$plugin_page - custom-background
*/
Если вы хотите добавить свои собственные query-параметры к этому URL, просто добавьте их к созданной выше переменной, используя add_query_arg
...
$edit_link = add_query_arg( 'edit_id', $id, $this_page );
/*
Только пример, $id должен поступать из вашего кода
и $edit_link должен генерироваться соответствующим образом для каждого отображаемого результата
*/
Это должно работать, по крайней мере в теории. Я не тестировал код, но не вижу причин, почему он не сработает.. :)

Хочу отметить, что возвращаемое значение функции add page не будет работать. Это не название страницы, а более сложный идентификатор экрана, который попадает в глобальную переменную $hook_suffix
. Также вы можете передавать ассоциативный массив данных в качестве первого аргумента в add_query_arg()
вместо многократных вызовов.

Не совсем понял, Rarst, что именно не будет работать? Если код не делает то, для чего предназначен, то я удалю ответ (код, который не работает, мало полезен).

Я имел в виду эту часть $my_hook = add_xxxx_page
в комментариях к коду. $my_hook
не будет работать как замена для $plugin_page
, потому что это разные вещи. Сам код правильный и рабочий.

Я не предлагал это в качестве замены, только что можно ссылаться на $my_hook
вместо этой переменной, потому что обычно они содержат одинаковое значение. Не уверен, чем они отличаются, посмотрите, как заполняется $plugin_page
(wp-admin/admin.php), затем посмотрите, как создается это значение меню.

Извините, я не понимаю. Вы утверждаете, что они равны или нет? Что означает ссылаться вместо переменной? Возврат add_*_page()
это $page_type . '_page_' . $plugin_name
, я не вижу, как это может быть равно $plugin_page
.
