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

8

ОК Полный код:

<?php

//check to see whether the user is an admin or not.
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('Products List','wpsc'); ?></h2>
<p>Below is a list of products. Select a product to edit it's SEO properties.</p>
    <table>
        <tr>
            <td></td>
            <td>Product Name</td>
            <td>Meta Title</td>
            <td>Meta Description</td>
            <td>Edit</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; ?>">Edit</a></td>
                </tr>
            <?php endforeach; ?>
        <?php endif; ?>
    </table>

<?php

}

function wpsc_product_seo_details()
{
    echo "<h2>Hello</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 For Products','wpsc'),  __('SEO For Products','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">Edit</a>


function wpsc_product_seo_details()
{
    echo "<h2>Hello</h2>";
}

Я знаю, что моя разметка для тега, вероятно, неверна, но я просто тестировал. Нужно ли регистрировать крючок для этого.


источник
Раньше вы копировали часть разметки страницы, когда настраивали вопрос, просто давая вам знать ..;)
t31os
Это был не я. Вот как был оригинальный вопрос. Я просто попытался уточнить заголовок (который, кажется, потребует взять два).
Первое
По префиксу функции это похоже на что-то, построенное поверх плагина WP e-Commerce? ..
11:10
@ Стив: Является ли ваша проблема, что вы не знаете, когда / как позвонить wpsc_product_seo_details()? Вы как-то добавили его в свое меню?
Ян Фабри
2
Хорошо, глядя на ваше решение, я полностью потерялся. :) Не могли бы вы переименовать ваш вопрос, чтобы точно описать проблему и контекст? Таким образом, другие могут извлечь выгоду из этого в будущем.
Первое

Ответы:

6

Я не уверен, что вы пытаетесь сделать.

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

$path = 'admin.php?page=wpsc_product_seo_details';
$url = admin_url($path);
$link = "<a href='{$url}'>Edit</a>";
echo $link;

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

Rarst
источник
Когда я нажимаю на ссылку, я получаю: У вас недостаточно прав для доступа к этой странице.
Извините, я, вероятно, не очень хорошо объясняю это. У меня есть пункт подменю, который, когда вы нажимаете на него, вы получаете список продуктов. У меня есть кнопка редактирования рядом с каждым продуктом, и когда администратор нажимает на эту кнопку, он переходит на указанный выше URL-адрес и вызывает соответствующую функцию (чтобы я мог сделать форму редактирования продукта и т. Д.)
Какие продукты технически, заказные типы сообщений? Что такое редактировать ссылку? Я все еще не уверен, но взглянуть на то, edit_post_link()что генерирует ссылки для редактирования отдельных сообщений.
Первое
4

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

add_action( 'admin_menu', 'wpse4677_admin_menu' );
function wpse4677_admin_menu()
{
    add_options_page(
        'WPSE 4677 Page title',
        'WPSE 4677 Menu item title',
        'manage_options', // Minimum capability to view this page
        'wpse4677-page-identifier', // Unique identifier
        'wpse4677_page_content' // Callback function to get the contents
    );
}

function wpse4677_page_content()
{
    echo '<div class="wrap">';
    echo '<h2>Welcome to my page!</h2>';
    echo '</div>';
}
Ян Фабри
источник
Я обновил кодовый блок в моем оригинальном посте! - Надеюсь, это поможет, я уверен, что ты скажешь "WTF"
3

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

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

global $pagenow, $plugin_page;
$this_page = add_query_arg( 'page', $plugin_page, admin_url( $pagenow ) );
/* 
   Example URL
   themes.php?page=custom-background 

   $pagenow     - themes.php
   $plugin_page - custom-background

*/

Хотите добавить свои собственные запросы в этот URL, просто добавьте их в переменную, созданную выше, используя add_query_arg...

$edit_link = add_query_arg( 'edit_id', $id, $this_page );
/*
   Example only, $id would need to come from your code
   and $edit_link generated appropriately for each result you display
*/

По крайней мере, теоретически это должно работать, я не тестировал код, но не вижу причин, по которым он не будет работать :)

t31os
источник
Хочу отметить, что возврат функции добавления страницы не сработает. Это не имя страницы, это более сложный идентификатор экрана, который входит в $hook_suffixглобальный. Также вы можете передать ассоциативный массив материала в качестве первого аргумента add_query_arg()вместо нескольких вызовов.
Rarst
Я не уверен, что следую за Rarst, что именно не сработает? Если код не будет делать то, для чего он предназначен, тогда я удалю ответ (код, который не работает, не имеет смысла).
t31os
Я имел в виду эту часть $my_hook = add_xxxx_pageв комментариях к коду, $my_hookона не будет заменой, $plugin_pageпотому что это разные вещи. Сам код здоров и работает.
Первый
Я никогда не предлагал это в качестве замены, только чтобы вы могли ссылаться $my_hookвместо этого var, потому что они обычно имеют одинаковое значение. Не знаете, чем они отличаются, посмотрите, как они $plugin_pageзаполнены (wp-admin / admin.php), а затем посмотрите, как создается это значение меню.
t31os
1
Да, вы правы, извините, раннее начало, мозг еще не совсем загрузился ... лол ... забудь мои предыдущие комментарии ...;) Я удалю эту часть ответа.
t31os
2

Решено!

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

function wpsc_display_products_seo(){

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

}

источник
почему вы не опубликовали весь код?
Франциско Корралес Моралес