web-dev-qa-db-fra.com

Récupération des valeurs de champs personnalisés en mode d'édition rapide

J'ai essayé d'ajouter un champ à Quick Edit. En quelque sorte, cela fonctionne: il est affiché et si vous entrez une valeur dans le champ de saisie, la valeur est enregistrée dans un champ personnalisé. Cependant, il semble impossible de trouver un moyen de récupérer la valeur du champ personnalisé. Voici ce que j'ai eu jusqu'à présent:

add_action('quick_edit_custom_box', 'ilc_quickedit_show', 10, 2);
function ilc_quickedit_show( $col, $type ) {
    if( $type != 'event' ) return; ?>

    <fieldset class="inline-edit-col-left">
        <div class="inline-edit-col">
            <div class="inline-edit-group">
                <label for="eventdate" style="font: italic 12px Georgia, serif;">Event Date</label>
                <span class="input-text-wrap">
                    <input type="text" name="eventdate" id="eventdate" size="10" value="">
                </span>
            </div>
        </div>
    </fieldset>

    <?php
}

les valeurs entrées sont sauvegardées avec:

add_action('save_post','ilc_quickedit_save',10,3);
function ilc_quickedit_save($post_id, $post) {
    if( $post->post_type != 'event' ) return;
    update_post_meta($post_id, 'Event Date', $_POST['eventdate']);
}

Comme vous l'avez sûrement remarqué, il s'agit d'un type d'événement personnalisé. Cependant, je ne peux pas récupérer les valeurs et renseigner les champs. Pour autant que je sache, cela implique inline-edit-post.js, mais je ne trouve aucun moyen d'utiliser inlineEditPost pour récupérer la valeur du champ personnalisé. Même l'identifiant de publication est disponible dans le domaine JavaScript

add_action('admin_head-edit.php', 'ilc_quickedit_get');
function ilc_quickedit_get() { ?>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery('a.editinline').live('click', function() {
            var id = inlineEditPost.getId(this);
            alert("Post id: " + id);
        });
    });
    </script>
    <?php
}

J'ai téléchargé le plugin Custom Field Template pour disséquer le code et découvert qu'ils redéfinissaient des parties de la fonction inlineEditPost. J'ai donc pensé faire la même chose. Cependant, ils semblent le faire via un tableau d'options où un doublon est stocké. Si vous avez résolu ce problème, pouvez-vous partager ce que vous utilisez pour récupérer les valeurs de chaque champ personnalisé?

3
Elliot

Ok, je l'ai, voici le code:

function ilc_quickedit_save($post_id, $post) {
    if( $post->post_type != 'evento' ) return;
    if (isset($_POST['is_quickedit']))
        update_post_meta($post_id, 'eventdate', $_POST['eventdate']);
}

function ilc_quickedit_get() { 
    $html = '<script type="text/javascript">';
    $html .= 'jQuery(document).ready(function() {';
        $html .= 'jQuery("a.editinline").live("click", function() {';

        $html .= 'var id = inlineEditPost.getId(this);';
        $html .= 'jQuery.post("' . THEME_URI . '/library/admin/admin.php",{ post_id: id, modo: "ajaxget" },';
        $html .= 'function(data){ jQuery("#eventdate").val(data); }';

    $html .= ');});});';
    $html .= '</script>';
    echo $html;
}

et le code au début du fichier admin.php (qui est le même fichier où tout ce code est situé):

if($_POST['modo'] == 'ajaxget'){
    require_once('../../../../../wp-blog-header.php');
    $post_id = $_POST['post_id'];
    echo get_post_meta($post_id, 'eventdate', true);
    return;
}

Jusqu'ici tout va bien, il y a peut-être d'autres façons de le faire. Reste à gérer les économies en mode d’édition en masse. Pourrait utiliser une main aussi :) J'espère que cela est utile pour quelqu'un.

2
Elliot

C'est non testé code. Voyez si cela fonctionne pour vous. En gros, comme vous le lirez ci-dessous, je globalisez $post, vérifie votre CPT, puis récupère le champ personnalisé event à partir de la méta de la publication (renvoyant une valeur unique - comme défini par le "vrai" dans le dernier paramètre).

La seule chose à faire est de référencer $event dans votre jQuery comme ceci: {$event} pour afficher la valeur dans le javascript. Cela paraîtra "statique" mais en réalité, c'est dynamique.

add_action('admin_head-edit.php', 'ilc_quickedit_get');

function ilc_quickedit_get()
{
    global $post;

    if ( $post->post_type != "event" )
        return;

    $event = get_post_meta( $post->ID, 'event', true ); // gets a *single* option from the postmeta table

$html = <<<HTML
<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery('a.editinline').live('click', function() {
            // do something with {$event}
        });
    });
</script>
HTML;

    echo $html;
}

P.S. J'ai assigné votre code HTML à une variable PHP pour faciliter la lecture et vous permettre de référencer rapidement $event dans jQuery.

0
Zack