web-dev-qa-db-fra.com

Ajouter un lien vers les attributs de produit - Filtre post_row_actions () ou comment remplacer une question de classe

J'ai une demande pour pouvoir dupliquer un attribut de produit dans WooCommerce. Pensez: dupliquer un produit (avec des fonctionnalités déjà existantes), ou des plug-ins qui vous permettent de dupliquer une publication.

Cependant, je pense que cela concerne WP en général, car j'essaie de comprendre comment ajouter un lien "Cloner" pour aller avec les liens "Modifier" et "Supprimer" de chaque attribut de produit WooCommerce dans la page d’administration Produits> Attributs.

J'ai vu plusieurs articles sur l'utilisation du filtre post_row_actions.

Je peux ajouter un lien "Clone" vers des produits très bien (j'utilise "Clone" car WC fournit déjà un lien "Dupliquer" pour les produits) en utilisant ce filtre, en utilisant quelque chose comme ceci:

// Add "Clone" link to each row in the Woo Attributes admin page
function my_duplicate_post_link($actions, $post)
{
    if ($post->post_type=='product' )
    {
     $actions['duplicate'] = '<a href="#" title="" rel="permalink">Clone</a>';
}
return $actions;
}
add_filter('post_row_actions', 'my_duplicate_post_link', 10, 2);

J'ai ensuite ajouté un autre argument au test post_type comme ceci:

if ($post->post_type=='product' && $post->page=='product_attributes')

Évidemment (pour moi maintenant), non seulement le lien "Cloner" vers les attributs n'a pas été fourni, mais il a également été supprimé de la zone de liens rapides de chaque produit sur la page de liste des produits. Ce qui implique que post_row_actions ne fonctionne qu'au niveau supérieur de post_type. Comme dans, page en tant que demande de publication annule le filtre post_row_actions.

Le code HTML de la page d'attributs du produit est généré avec le /woocommerce/includes/admin/class-wc-admin-attributes.phpfichier . Woo est bien sûr célèbre pour sa capacité à gérer les hameçons et les actions, alors je me suis dit: "Pas de problème".

Cependant, je ne trouve aucune information sur la création de versions de thème enfant de ces scripts d’administrateur Woo. Tout le reste, semble-t-il, mais pas ceux-là. Je mets une copie de ce fichier dans plusieurs dossiers de thèmes enfants, en commençant par la racine, puis sur une réplique de la structure de dossiers Woo elle-même. Pas de chance.

Alors, pourquoi ne pas étendre la classe WC_Admin_Attributes et écrire ma propre fonction? Ensuite, j'ai quelque chose comme ça:

class Cloneable_WC-Admin_attributes extends WC-Admin_Attributes {

Et je copie toute la fonction public static function edit_attribute() dans celle-ci, en ajoutant le lien "Cloner" dans la partie du code qui génère les liens "Modifier" et "Supprimer".

Cela ne fonctionne pas non plus. Je suppose que toutes les fonctions de la classe parente sont appelées par self::.

Mon dernier recours consiste à utiliser jQuery pour modifier le innerHTML de la classe row-actions de la DIV contenant afin d’ajouter le lien "Cloner". C'est un tel bidouillage, cependant.

L'exécution de PHP pour dupliquer l'attribut n'est pas un problème. Je n'arrive pas à comprendre comment ajouter un lien!

 enter image description here 

1
Terry Hale

WooCommerce n'a pas anticipé le besoin d'ajouter une nouvelle action à cet endroit, il n'y a donc pas de filtres ni d'actions pour le faire.

il y a 2 autres solutions:

  • ajout du lien avec JavaScript
  • analyser le résultat HTML pour ajouter le lien à cet endroit

.

Pour ajouter le lien dans le code HTML, vous pouvez essayer ceci

add_action("admin_menu", function () {

    $menu_slug = "edit.php?post_type=product";
    $submenu_slug = "product_attributes";

    $hookname = get_plugin_page_hookname($submenu_slug, $menu_slug);


    // removing the original page call
    remove_all_actions($hookname);

    // adding the hook for the new page
    add_action($hookname, "display_newPage_product_attributes");

});


function display_newPage_product_attributes() {

    // original page

    $wc_Admin_Menus = new WC_Admin_Menus();

    ob_start();
    $wc_Admin_Menus->attributes_page();
    $content = ob_get_clean();


    // adding the links, to improve

    $link = "<a href=\"a\">Attack of the Clone</a>";

    $content = str_replace(
        "</a></span></div>"
        , "</a></span> | $link</div>"
        , $content
    );


    // display

    echo $content;

}

J'écris "pour améliorer" dans un commentaire parce que vous devrez certainement personnaliser chaque lien et peut-être pouvez-vous penser à un remplacement qui fonctionnera même si la future version de WooCommerce apporte des modifications sur cette page

0
mmm