Как создать и связать страницу администрирования для плагина?

30 нояб. 2010 г., 12:42:38
Просмотры: 13.5K
Голосов: 8

Полный код:

<?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>";
}

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

6
Комментарии

Rarst, ты случайно скопировал часть разметки страницы, когда правил вопрос, просто предупреждаю.. ;)

t31os t31os
30 нояб. 2010 г. 13:03:22

Это был не я. Так выглядел оригинальный вопрос. Я просто попытался уточнить заголовок (похоже, потребуется вторая попытка).

Rarst Rarst
30 нояб. 2010 г. 13:10:27

Судя по префиксу функции, это что-то построенное поверх плагина WP e-Commerce?..

Rarst Rarst
30 нояб. 2010 г. 13:29:11

@Steve: Ваша проблема в том, что вы не знаете, когда/как вызывать wpsc_product_seo_details()? Вы добавили это в свое меню каким-то образом?

Jan Fabry Jan Fabry
30 нояб. 2010 г. 13:30:46

Ок, я разобрался. Я просто использовал тот же URL и добавил условие в функцию, которая вызывается из меню. Спасибо за всю вашу помощь.

User User
30 нояб. 2010 г. 13:46:18

Хорошо, глядя на ваше решение, я теперь полностью запутался. :) Не могли бы вы переименовать ваш вопрос, чтобы точнее описать проблему и контекст? Чтобы другие могли извлечь из этого пользу в будущем.

Rarst Rarst
30 нояб. 2010 г. 13:49:24
Показать остальные 1 комментариев
Все ответы на вопрос 4
3

Я не совсем понимаю, что именно вы пытаетесь сделать.

Ссылки в админ-панели можно удобно создавать с помощью функции admin_url(), например так:

$path = 'admin.php?page=wpsc_product_seo_details';
$url = admin_url($path);
$link = "<a href='{$url}'>Редактировать</a>";
echo $link;

С чем именно у вас возникла проблема?

30 нояб. 2010 г. 12:54:31
Комментарии

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

User User
30 нояб. 2010 г. 12:57:37

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

User User
30 нояб. 2010 г. 13:01:33

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

Rarst Rarst
30 нояб. 2010 г. 13:06:24
1

У вас есть проблемы с созданием страницы администрирования?

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>';
}
30 нояб. 2010 г. 12:57:45
Комментарии

Я обновил блок кода в своем оригинальном сообщении! - Надеюсь, это поможет, уверен, вы скажете "WTF"

User User
30 нояб. 2010 г. 13:13:59
6

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

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

Это должно работать, по крайней мере в теории. Я не тестировал код, но не вижу причин, почему он не сработает.. :)

30 нояб. 2010 г. 16:54:45
Комментарии

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

Rarst Rarst
5 июл. 2011 г. 19:48:53

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

t31os t31os
6 июл. 2011 г. 13:05:52

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

Rarst Rarst
6 июл. 2011 г. 13:39:08

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

t31os t31os
6 июл. 2011 г. 14:24:38

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

Rarst Rarst
6 июл. 2011 г. 15:54:12

Да, вы правы, извините, раннее утро, мозг еще не до конца проснулся... лол... забудьте мои предыдущие комментарии.. ;) Я удалю эту часть ответа.

t31os t31os
6 июл. 2011 г. 16:26:07
Показать остальные 1 комментариев
1

Решено!

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

function wpsc_display_products_seo(){

    if($_GET['pid'] != "") 
    {
        renderProductForm();
    } else {
        renderProductList();
    }

}
30 нояб. 2010 г. 13:47:24
Комментарии

почему ты не опубликовал весь код?

Francisco Corrales Morales Francisco Corrales Morales
6 февр. 2014 г. 17:44:54