Comment créer et créer un lien vers la page d'administration d'un plugin?

8

OK Code complet:

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

?>

ANCIEN POST

Salut les gars,

J'écris actuellement un plugin pour mon client dans wordpress. Le problème que je rencontre est lorsqu'un utilisateur clique sur modifier pour modifier un enregistrement, je ne sais pas comment créer le lien d'administration pour ce faire.

c'est à dire

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

Je sais que mon balisage pour la balise est probablement faux, mais je testais juste. Dois-je enregistrer un hook pour ce faire.


la source
Rarement, vous avez copié une partie du balisage de page lorsque vous avez ajusté la question, juste pour vous faire savoir ..;)
t31os
Ce n'était pas moi. Voilà comment était la question d'origine. J'ai juste essayé de clarifier le titre (qui semble nécessiter deux).
Rarst
Par le préfixe de la fonction, cela semble être quelque chose de construit sur le plugin WP e-Commerce? ..
Rarst
@Steve: Votre problème est-il que vous ne savez pas quand / comment appeler wpsc_product_seo_details()? L'avez-vous ajouté à votre menu d'une manière ou d'une autre?
Jan Fabry
2
Ok, en regardant votre solution, je suis complètement perdu maintenant. :) Pourriez-vous s'il vous plaît renommer votre question pour décrire avec précision le problème et le contexte? D'autres pourront donc en bénéficier à l'avenir.
Rarst

Réponses:

6

Je ne sais pas trop ce que vous essayez de faire.

Les liens d'administration peuvent être facilement créés avec la admin_url()fonction, comme ceci:

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

Avec quoi avez-vous exactement un problème?

Rarst
la source
Lorsque je clique sur le lien, j'obtiens: Vous ne disposez pas des autorisations suffisantes pour accéder à cette page.
Désolé, je ne l'explique probablement pas très bien. J'ai un élément de sous-menu qui, lorsque vous cliquez dessus, vous obtenez une liste de produits. J'ai un bouton de modification à côté de chaque produit et lorsque l'administrateur clique sur ce bouton, il accède à l'URL ci-dessus et appelle la fonction appropriée (donc je peux faire un formulaire de modification de produit, etc.)
Les produits sont quels types de messages personnalisés sur le plan technique? Qu'est-ce que le lien d'édition exactement? Je ne suis toujours pas sûr, mais jetez un œil à edit_post_link()ce qui génère des liens d'édition pour les messages individuels.
Rarst
4

Avez-vous des problèmes pour créer la page d'administration ?

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>';
}
Jan Fabry
la source
J'ai mis à jour le bloc de code dans mon message d'origine! - J'espère que cela vous aide, je suis sûr que vous allez dire "WTF"
3

Juste quelques informations à ajouter à la discussion, et cela pourrait vous être utile plus tard.

Lorsque vous êtes sur une page de plugin, diverses variables d'administration sont définies, vous pouvez créer une URL de base à partir de ces variables et générer des liens à partir de là, en supposant que vous souhaitez qu'elles pointent vers la page de plugin actuelle.

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

*/

Vous voulez ajouter vos propres variables de requête à cette URL, ajoutez-les simplement à la variable créée ci-dessus en utilisant 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
*/

Cela devrait fonctionner en théorie au moins, je n'ai pas testé le code, mais je ne vois aucune raison pour que cela ne fonctionne pas .. :)

t31os
la source
Je veux noter que le retour de la fonction d'ajout de page ne fonctionnera pas. Ce n'est pas le nom de la page, c'est un identifiant d'écran plus complexe qui va dans le $hook_suffixmonde. Vous pouvez également passer un tableau associatif de trucs comme premier argument au add_query_arg()lieu d'appeler plusieurs fois.
Rarst
Je ne suis pas sûr de suivre Rarst, qu'est-ce qui ne fonctionnera pas exactement? Si le code ne fait pas ce qu'il était censé faire, je supprimerai la réponse (le code qui ne fonctionne pas sert peu).
t31os
Je voulais dire que cette partie $my_hook = add_xxxx_pagedans les commentaires de code $my_hookne fonctionnera pas en remplacement $plugin_pagecar ce sont des choses différentes. Le code lui-même est solide et fonctionne.
Rarst
Je ne l'ai jamais suggéré comme remplacement, seulement que vous pourriez vous référer à la $my_hookplace de cette var, car ils détiennent généralement la même valeur. Je ne sais pas en quoi ils sont différents, regardez comment $plugin_pageest rempli (wp-admin / admin.php), puis regardez comment cette valeur de menu est créée.
t31os
1
Oui, votre droit désolé, début précoce, le cerveau n'avait pas encore tout à fait démarré ... lol .. oubliez mes commentaires précédents ..;) Je vais supprimer cette partie de la réponse.
t31os
2

Résolu!

Essayez de compliquer les choses lorsqu'un simple conditionnel ferait l'affaire dans la fonction principale appelée depuis la page.

function wpsc_display_products_seo(){

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

}

la source
pourquoi vous n'avez pas posté tout le code?
Francisco Corrales Morales