web-dev-qa-db-fra.com

Exiger l'image en vedette

J'aimerais avoir une image en vedette sur un site que je développe.

J'ai essayé le code ici: Rendre l'image sélectionnée requise et rien ne s'est passé - le JS est apparu dans l'en-tête du site, mais je pouvais toujours enregistrer le message sans une image sélectionnée et je n'ai jamais reçu de message d'erreur.

Plusieurs plugins le font, tels que Mandatory Field et WyPiekacz, mais je dois faire quelque chose de plus compliqué ... J'ai une méta-boîte personnalisée avec des boutons radio. Je n'ai besoin d'une image sélectionnée que si un certain bouton radio est coché. J'ai déjà besoin de certains autres champs (catégorie et certaines taxonomies personnalisées) si certains boutons radio sont cochés, à l'aide de la validation jQuery.

Donc, je suppose que je peux résumer cela à deux questions:

  1. Quel est le bon moyen d'exiger une image sélectionnée?

  2. Comment puis-je l'intégrer dans une validation existante et exiger une image sélectionnée uniquement si un bouton radio est sélectionné?

Il est probablement beaucoup plus facile de répondre à la question 1, et si quelqu'un peut répondre à la question 1, alors je pourrai probablement me débrouiller seul (e).

5
Morgan Kay

Voici ce que j'ai fini par faire:

      jQuery('#post').submit(function() {
            if (jQuery('.force').is(':checked')) {
              if (jQuery("#set-post-thumbnail").find('img').size() > 0) {
                jQuery('#ajax-loading').hide();
                jQuery('#publish').removeClass('button-primary-disabled');
                return true;
              }else{
                alert("Please set a Featured Image!");
                jQuery('#ajax-loading').hide();
                jQuery('#publish').addClass('button-primary-disabled');
                return false;
              }
            }else{
              return true;
            }
            return false;
            });

Comme je l'ai dit dans mon commentaire à fischi, je préférerais généralement utiliser une méthode PHP comme la sienne, mais dans ce cas, mon site s'appuie de toute façon sur beaucoup de validation jQuery, il était donc logique de s'en tenir à avec une méthode JavaScript. Cela fonctionne très bien pour moi.

0
Morgan Kay

Je le ferais en accrochant l'action save_post, pas par javascript.

L'idée principale est de vérifier si les deux valeurs sont présentes (votre radiobutton est sélectionné ET que le post_thumbnail est présent) et de définir la publication sur brouillon si elles ne le sont pas, ainsi que d'afficher une information si l'utilisateur ne remplit pas les conditions requises.

Tout d’abord, connectez-vous à l’action save_post et vérifiez si le radiobutton a votre valeur et si la vignette de publication est sélectionnée. Si tout va bien, vous n'avez rien d'autre à faire, mais dans votre cas particulier, vous devez empêcher la publication de la publication et afficher un message d'erreur pour en informer l'utilisateur.

<?php
// this function checks if the checkbox and the thumbnail are present
add_action('save_post', 'f711_option_thumbnail');

function f711_option_thumbnail($post_id) {
    // get the value that is selected for your select, don't know the specifics here
    // you may need to check this value from the submitted $_POST data.
    $checkoptionvalue = get_post_meta( $post_id, "yourmetaname", true );
    if ( !has_post_thumbnail( $post_id ) && $checkoptionvalue == "yourvalue" ) {
        // set a transient to show the users an admin message
        set_transient( "post_not_ok", "not_ok" );
        // unhook this function so it doesn't loop infinitely
        remove_action('save_post', 'f711_option_thumbnail');
        // update the post set it to draft
        wp_update_post(array('ID' => $post_id, 'post_status' => 'draft'));
        // re-hook this function
        add_action('save_post', 'f711_option_thumbnail');
    } else {
        delete_transient( "post_not_ok" );
    }
}

// add a admin message to inform the user the post has been saved as draft.

function showAdminMessages()
{
            // check if the transient is set, and display the error message
    if ( get_transient( "post_not_ok" ) == "not_ok" ) {
        // Shows as an error message. You could add a link to the right page if you wanted.
        showMessage("You need to select a Post Thumbnail if you choose this Option. Your Post was not published.", true);
                // delete the transient to make sure it gets shown only once.
        delete_transient( "post_not_ok" );
    }

}   
add_action('admin_notices', 'showAdminMessages');       
// function to display the errormessage
function showMessage($message, $errormsg = false)
{
    if ($errormsg) {
        echo '<div id="message" class="error">';
    }
    else {
        echo '<div id="message" class="updated fade">';
    }

    echo "<p><strong>$message</strong></p></div>";

}   


?>
2
fischi