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
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
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.
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));
}
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.
add_filter('bulk_actions-upload', 'BulkActionPublish');
function BulkActionPublish($bulk_actions)
{
$bulk_actions['publish'] = __('Publish');
return $bulk_actions;
}
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;
}
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'
));
}
}
}