web-dev-qa-db-fra.com

Flux de travail pour les pièces jointes dans Wordpress

Je cherchais un moyen d'activer/d'utiliser un flux de travail pour les fichiers téléchargés (dans mon cas, les images). Les utilisateurs dotés de rôles/capacités spécifiques doivent pouvoir télécharger des fichiers connectés à un message. La publication a également un champ personnalisé qui contient un tableau utilisé comme galerie dans la vue publication.

Ce que je veux c'est:
1. Fichier téléchargé par l'utilisateur
2. La pièce jointe est générée via media_handle_upload
3. La pièce jointe devient "en attente" post_status
4. L'identifiant est ajouté au tableau
5. L'administrateur n'a besoin que de changer de post_status et l'image est visible

Dans ce cas, il serait facile d'afficher uniquement les pièces jointes avec post_status != "pending". Autant que je sache, ce n'est pas possible avec Wordpress.

Mes deux solutions pour le moment seraient:
1. Laissez l'administrateur ajouter le fichier à la matrice lorsque l'image est correcte
2. Utilisez un méta-champ pour la pièce jointe pour obtenir un flux de travail

Existe-t-il un moyen Worpress que je ne vois pas en ce moment ou devrais-je utiliser l'une de mes deux solutions?

J'utilise Wordpress 4.9.8

1
Michael N.

Voici comment j'ai réalisé un workflow multimédia simple. La vérification de la sécurité et la désinfection sont du ressort de tous.

Basé sur la version Wordpress: 4.9.8

Créer une pièce jointe | Poignée Média

if (!empty($_FILES) && isset($_POST['postid'])) {
  media_handle_upload("attachments", $_POST['postid']);
}

L'état de publication en attente n'est pas possible pour les pièces jointes avec media_handle_upload. Dans ce cas, un filtre doit être utilisé. Ce filtre doit être ajouté avant d'utiliser media_handle_upload.

add_filter('wp_insert_attachment_data', 'SetAttachmentStatusPending', '99');

function SetAttachmentStatusPending($data) {
  if ($data['post_type'] == 'attachment') {
    $data['post_status'] = 'pending';
  }

  return $data;
}

Maintenant, la publication en pièce jointe est ajoutée avec post_status en attente.

Afficher les messages en attente dans la médiathèque

Worpress Media Library affiche uniquement les publications avec post_status privé ou hérité. Pour afficher les publications en attente, nous pouvons nous connecter

add_action('pre_get_posts', array($this, 'QueryAddPendingMedia'));

function QueryAddPendingMedia($query)
{
  // Change query only for admin media page
  if (!is_admin() || get_current_screen()->base !== 'upload') {
    return;
  }

  $arr = explode(',', $query->query["post_status"]);
  $arr[] = 'pending';
  $query->set('post_status', implode(',', $arr));
}

Actions et actions en masse

Pour terminer le flux de travail, nous avons besoin de quelque chose pour publier les médias en attente. Pour ce faire, nous pouvons ajouter des actions (en bloc) à la médiathèque.

Ajouter une action en bloc

add_filter('bulk_actions-upload', 'BulkActionPublish');

function BulkActionPublish($bulk_actions)
{
  $bulk_actions['publish'] = __('Publish');

  return $bulk_actions;
}

Ajouter une action de ligne

Pour ajouter un lien aux actions de la ligne, ce code est utile

add_filter('media_row_actions', 'AddMediaPublishLink', 10, 3);

function AddMediaPublishLink(array $actions, WP_Post $post, bool $detached)
{
  if ($post->post_status === 'pending') {
    $link = wp_nonce_url(add_query_arg(array('act' => 'publish', 'itm' => $post->ID), 'upload.php'), 'publish_media_nonce');
    $actions['publish'] = sprintf('<a href="%s">%s</a>', $link, __("Publish"));
  }

  return $actions;
}

Actions de poignée

add_action('load-upload.php', 'RowActionPublishHandle');
add_filter('handle_bulk_actions-upload', 'BulkActionPublishHandler', 10, 3);

function BulkActionPublishHandler($redirect_to, $doaction, $post_ids)
{
  if ($doaction !== 'publish') {
    return $redirect_to;
  }

  foreach ($post_ids as $post_id) {
    wp_update_post(array(
      'ID' => $post_id,
      'post_status' => 'publish'
    ));
  }

  return $redirect_to;
}

function RowActionPublishHandle()
{
  // Handle publishing only for admin media page
  if (!is_admin() || get_current_screen()->base !== 'upload') {
    return;
  }

  if (isset($_GET['_wpnonce']) && wp_verify_nonce($_GET['_wpnonce'], 'publish_media_nonce')) {
    if (isset($_GET['act']) && $_GET['act'] === 'publish') {
      wp_update_post(array(
        'ID' => $_GET['itm'],
        'post_status' => 'publish'
      ));
    }
  }
}
0
Michael N.