Wie erstelle ich eine Administrationsseite für ein Plugin und verlinke sie?

8

OK Vollständiger Code:

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

?>

ALTER POST

Hallo Leute,

Ich schreibe gerade ein Plugin für meinen Kunden in WordPress. Das Problem, das ich habe, ist, wenn ein Benutzer auf Bearbeiten klickt, um einen Datensatz zu ändern. Ich bin nicht sicher, wie ich den Administrator-Link erstellen soll, um dies zu tun.

dh

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

Ich weiß, dass mein Markup für das Tag wahrscheinlich falsch ist, aber ich habe nur getestet. Muss ich dafür einen Hook registrieren?


quelle
In erster Linie haben Sie einen Teil des Seiten-Markups kopiert, als Sie die Frage angepasst haben, und Sie nur wissen lassen ..;)
t31os
War ich nicht So war die ursprüngliche Frage. Ich habe nur versucht, den Titel zu klären (was anscheinend zwei erfordert).
Erster
Nach dem Funktionspräfix scheint dies etwas zu sein, das auf dem WP E-Commerce-Plugin aufgebaut ist? ..
Rarst
@Steve: Ist Ihr Problem, dass Sie nicht wissen, wann / wie Sie anrufen sollen wpsc_product_seo_details()? Hast du es irgendwie zu deinem Menü hinzugefügt?
Jan Fabry
2
Ok, wenn ich mir deine Lösung anschaue, bin ich jetzt völlig verloren. :) Könnten Sie bitte Ihre Frage umbenennen, um Problem und Kontext genau zu beschreiben? Andere können also in Zukunft davon profitieren.
Erster

Antworten:

6

Ich bin mir nicht sicher, was Sie versuchen zu tun.

Admin-Links können bequem mit folgenden admin_url()Funktionen erstellt werden:

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

Womit genau haben Sie ein Problem?

Selten
quelle
Wenn ich auf den Link klicke, erhalte ich Folgendes: Sie haben nicht genügend Berechtigungen, um auf diese Seite zuzugreifen.
Entschuldigung, ich erkläre das wahrscheinlich nicht sehr gut. Ich habe ein Untermenüelement, bei dem Sie eine Liste der Produkte erhalten, wenn Sie darauf klicken. Ich habe eine Bearbeitungsschaltfläche neben jedem Produkt und wenn der Administrator auf diese Schaltfläche klickt, geht er zur obigen URL und ruft die entsprechende Funktion auf (damit ich ein Produktbearbeitungsformular usw. durchführen kann)
Produkte sind welche technisch benutzerdefinierten Beitragstypen? Was genau ist ein Bearbeitungslink? Ich bin mir immer noch nicht sicher, aber schauen Sie sich an, edit_post_link()welche Bearbeitungslinks für einzelne Beiträge generiert werden.
Erster
4

Haben Sie Probleme beim Erstellen der Administrationsseite ?

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
quelle
Ich habe den Codeblock in meinem ursprünglichen Beitrag aktualisiert! - Hoffe das hilft, ich bin sicher, Sie werden "WTF" sagen
3

Nur einige Informationen, die Sie in die Diskussion einbinden können. Dies kann später für Sie hilfreich sein.

Wenn Sie sich auf einer Plugin-Seite befinden, werden verschiedene Administratorvariablen festgelegt. Sie können aus diesen Variablen eine Basis-URL erstellen und von dort aus Links erstellen, sofern diese auf die aktuelle Plugin-Seite verweisen sollen.

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

*/

Wenn Sie dieser URL Ihre eigenen Abfragevariablen hinzufügen möchten, fügen Sie sie einfach der oben erstellten Variablen hinzu, indem Sie 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
*/

Es sollte zumindest theoretisch funktionieren, ich habe den Code nicht getestet, aber ich sehe keinen Grund, warum es nicht funktionieren würde .. :)

t31os
quelle
Ich möchte darauf hinweisen, dass die Rückgabe der Funktion zum Hinzufügen von Seiten nicht funktioniert. Es ist nicht der Name der Seite, sondern eine komplexere Bildschirmkennung, die $hook_suffixglobal wird. Sie können auch ein assoziatives Array von Dingen als erstes Argument übergeben, add_query_arg()anstatt mehrmals aufzurufen.
Rarst
Ich bin mir nicht sicher, ob ich Rarst folge. Was genau funktioniert nicht? Wenn der Code nicht das tut, was er tun soll, entferne ich die Antwort (Code, der nicht funktioniert, hat wenig Sinn).
t31os
Ich meinte diesen Teil $my_hook = add_xxxx_pagein Codekommentaren, $my_hookwird nicht als Ersatz für funktionieren, $plugin_pageweil sie verschiedene Dinge sind. Der Code selbst ist solide und funktioniert.
Rarst
Ich habe es nie als Ersatz vorgeschlagen, nur dass Sie $my_hookanstelle dieser Variable darauf verweisen könnten , da sie normalerweise den gleichen Wert haben. Sie sind sich nicht sicher, wie sie sich unterscheiden. Sehen Sie sich an, wie sie $plugin_pagegefüllt sind (wp-admin / admin.php), und sehen Sie sich dann an, wie dieser Menüwert erstellt wird.
t31os
1
Ja, dein Recht, Entschuldigung, früher Start, das Gehirn war noch nicht ganz hochgefahren ... lol .. vergiss meine vorherigen Kommentare ..;) Ich werde diesen Teil der Antwort entfernen.
t31os
2

Aufgelöst!

Versuchen Sie, Dinge zu komplizieren, wenn eine einfache Bedingung den Trick in der von der Seite aufgerufenen Hauptfunktion ausgeführt hätte.

function wpsc_display_products_seo(){

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

}

quelle
Warum hast du nicht den ganzen Code gepostet?
Francisco Corrales Morales