web-dev-qa-db-fra.com

Comment puis-je ajouter des boutons à une colonne personnalisée de la table de taxonomie?

Je travaille sur un système de publication par numéro pour un de mes amis. Jusqu'à présent, j'ai créé une taxonomie personnalisée appelée "Question"; ajout de plusieurs champs personnalisés à la taxonomie personnalisée (tels que "numéro de publication", "URL PDF" et "est publié?"); et élargi la page de gestion de la taxonomie avec des colonnes supplémentaires pour afficher ces données de terme personnalisées.

Maintenant, je souhaite mettre en œuvre une méthode pratique pour publier (et annuler la publication) des numéros individuels. Mon plan est d'ajouter une colonne personnalisée supplémentaire à la page de gestion de la taxonomie, qui contient les boutons "Publier" et "Annuler la publication" . J'ai donc essayé de renseigner la colonne personnalisée avec un formulaire contenant des champs de données masqués et un bouton de soumission visible. j'ai essentiellement dupliqué les fonctionnalités du formulaire d'édition de terme par défaut et les ai placées dans les cellules du tableau.

Le problème est que toute la table de gestion de la taxonomie est encapsulée dans un formulaire appelé "posts-filter" et que les formulaires ne peuvent pas être imbriqués . Donc, ma solution ne fonctionne pas correctement.

Existe-t-il une solution appropriée pour ajouter de tels boutons à une colonne personnalisée? Toutes les suggestions sont les bienvenues!

Une image pour clarification: http://img845.imageshack.us/img845/669/customcol.png

add_filter("manage_issue_custom_column", 'manage_issue_columns', 10, 3);

// The function that manages the custom columns
function manage_issue_columns($out, $column_name, $issue_id) {
    $issue = get_term($issue_id, 'issue');
switch ($column_name) {
    case 'issue_pdf_url':
        $term_meta = get_option( "taxonomy_term_$issue_id" );
        if ( isset( $term_meta["issue_pdf_url"] ) ){
            $out .= $term_meta["issue_pdf_url"]; 
        }   
    break;

    case 'issue_num':
        $term_meta = get_option( "taxonomy_term_$issue_id" );
        if ( isset( $term_meta["issue_num"] ) ){
            $out .= $term_meta["issue_num"];
        }
    break;

    //This is the column where I need to add buttons
    case 'issue_published':
        $term_meta = get_option( "taxonomy_term_$issue_id" );
        $term_object = get_term($issue_id, "issue");
        if ( isset( $term_meta["issue_published"] ) && $term_meta["issue_published"] == "yes" ){
            //This is the form which shows the publishing buttons; not working due to being nested in other form
            $out .= '<form name="edittag" id="edittag" method="post" action="edit-tags.php" class="">  <input type="hidden" name="action" value="editedtag" />  <input type="hidden" name="tag_ID" value="' . esc_attr($issue_id) . '" />  <input type="hidden" name="taxonomy" value="issue" />  ' . wp_original_referer_field(true, 'current') . wp_nonce_field('update-tag_' . $issue_id) . ' <input name="name" id="name" type="hidden" value="' . $term_object->name . '" />  <input name="slug" id="slug" type="hidden" value="' . $term_object->slug .'" />  <input name="description" id="description" type="hidden" value="' . $term_object->description .'" />  <input type="hidden" value="" checked="" id="term_meta[issue_published]" name="term_meta[issue_published]">  <input type="submit" value="Unpublish" class="button-primary" id="submit" name="submit"></form>';
        } else {
            $out .= '<form name="edittag" id="edittag" method="post" action="edit-tags.php" class="">  <input type="hidden" name="action" value="editedtag" />  <input type="hidden" name="tag_ID" value="' . esc_attr($issue_id) . '" />  <input type="hidden" name="taxonomy" value="issue" />  ' . wp_original_referer_field(true, 'current') . wp_nonce_field('update-tag_' . $issue_id) . ' <input name="name" id="name" type="hidden" value="' . $term_object->name . '" />  <input name="slug" id="slug" type="hidden" value="' . $term_object->slug .'" />  <input name="description" id="description" type="hidden" value="' . $term_object->description .'" />  <input type="hidden" value="yes" checked="checked" id="term_meta[issue_published]" name="term_meta[issue_published]">  <input type="submit" value="Publish" class="button-primary" id="submit" name="submit"></form>';
        }
    break;

    default:
    break;
}

return $out;
}
1
MrValueType

Pour quelque chose comme ça, vous pourriez envisager d'ajouter une "action"; qui apparaissent lorsque vous survolez l’article.

Le ​​code suivant n'est pas complet et n'a pas été testé - mais devrait vous mettre sur la bonne voie.

Ajouter l'action

Tout d'abord, pour ajouter le lien d'action, utilisez le hook tag_row_actions. (Gardez à l'esprit qu'une fonction accrochée à cette fonction sera activée sur chaque taxonomie, vous devez donc vérifier la taxonomie). Quelque chose comme:

add_filter('tag_row_actions','my_term_action',10,2);
function my_term_action($actions,$tag){
if($tag->taxonomy == 'issue'):
    $actions['my-action-class'] = '<a href="#"> My action </a>';
endif;
return $actions;
}

Le tableau $actions est associatif, la clé devenant la classe de l'élément span qui encapsule l'action. La valeur, est ce que la span va envelopper.

Vous pouvez utiliser le $tag (c'est un objet, le terme id est donné par $tag->term_id) pour déterminer quelle action afficher, donc si vous souhaitez afficher l'action 'publier'

$actions['my-action-class'] = '<a class="Publish" termid="'.$tag->term_id.'" href="#"> Publish </a>';

et si vous souhaitez afficher l'action 'annuler la publication', ajoutez plutôt:

$actions['my-action-class'] = '<a class="Unpublish" termid="'.$tag->term_id.'" href="#"> Unpublish </a>';

Je leur donne différentes classes et un attribut supplémentaire. JQuery/AJAX l'utilisera pour effectuer l'action correspondante ...

Le jQuery/AJAX

jQuery(document).ready(function(){
    jQuery(".my-action-class a").click(function(){
        change_publish_states(jQuery(this));
    });
});
    function change_publish_states(el){
   if(el.hasClass('Publish')){
      new_state = 'Unpublish';
   }else{
      new_state = 'Publish';
  }
        jQuery.getJSON(ajaxurl,
            {   term_id: el.attr("termid"),
                action: "my_change_publish_state",
                new_state: new_state
            },
            function(data) {
                if (data.error){
                    alert(data.error);                      
                }else{
                    //Update label and class
                    el.text(data.new_state);
                    el.attr('class', data.new_state)
                }
            });
    }

Vous devez ajouter ce script sur la page des taxonomies personnalisées. Vous pouvez exécuter une fonction sur admin_enqueue_scripts pour vérifier la page affichée et la mettre en file d'attente de manière conditionnelle.

add_action('admin_enqueue_scripts','load_my_ajax_script');
function load_my_ajax_script(){
 //Check globals like $pagenow=='edit-tags' and $taxonomy=='issues' or $current_screen 
 //to make sure you are on the right page and enqueue script - or add a filter 
 //to print the script at the footer.

 global $current_screen;
 if ( $current_screen->id != 'edit-issue' )
  return;

 wp_enqueue_script( 'my_ajax_save', get_stylesheet_directory_URI() . '/my_ajax_save.js' );
}

Ensuite, il reste à ajouter une fonction sur le AJAX action-hook:

action AJAX

add_action('wp_ajax_my_change_publish_state', 'change_the_publish_state');
function change_the_publish_state(){

   $term_id = $_GET['term_id'];
   $new_state = $_GET['new_state'];

   //Perform checks / logic & update publish status.
   $term_meta = get_option( "taxonomy_term_$term_id" );

   if ( $new_state == "Unpublish" )
    $term_meta['issue_published'] = 'yes';

   if ( $new_state == "Publish" )
    $term_meta['issue_published'] = '';

   update_option( "taxonomy_term_$term_id", $term_meta );    

//return the new state of the term
   $result['new_state'] = $new_state;
    echo json_encode($result);
    exit();
}
3
Stephen Harris