web-dev-qa-db-fra.com

Ajouter un champ aux articles (case à cocher) qu'un seul article peut avoir

J'essaie d'ajouter un champ à des publications Wordpress (pas des pages) qui inclurait simplement une étiquette et une case à cocher. Quelque chose comme: Si cocher, la clé doit être sur TRUE ou quelque chose qui est facilement accessible. Le problème est cependant que je veux seulement un post pour avoir éventuellement la valeur TRUE. Cela signifie que, lorsque j'ai vérifié le champ après 1 et que je vérifie ensuite ce champ après 2, la valeur du champ post-1 doit être définie sur FALSE afin qu'un seul post puisse avoir la valeur TRUE en même temps.

Je lirais ensuite le message dans mon index.php pour obtenir le message de valeur == TRUE et l’afficher quelque part sur la page. Quelque chose comme ça (non testé):

    $args = array(
        'order'             => 'DESC',
        'posts_per_page'    => 1,
        'meta_key'          => 'post_sticky',
        ),
    );
    $stickyPost = new WP_Query( $args );

Idéalement, je souhaite que ce champ soit défini dans mon fichier functions.php , mais d'après ce que j'ai rassemblé sur Internet, ce n'est pas aussi facile qu'il le devrait. Vous pouvez ajouter des champs dans Wordpress lui-même, mais je ne veux pas le faire comme cela parce que je suis dépendant des écrivains et que je ne veux pas qu'ils soient manipulés.

EDIT: apparemment, quand aucun post n'est coché en surbrillance, 4 posts sont affichés (ce que je permets sur la page d'index). Aurais-je besoin de réinitialiser les données de publication de la boucle principale avant d'appeler cette boucle? Même dans ce cas, je m'attendrais à ce que les messages if has excluent tous les autres messages. C'est le code dans mon fichier sidebar.php:

<?php $args = array(
    'p' => get_option('my_sticky_post')
    );
    $stickyPost = new WP_Query($args);
?>
<?php if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?>
    <aside class="highlight">
        <h3>Must-read</h3>
        <div class="sidebar-content">
            <div class="thumbnail">
            <?php $image_id = get_post_thumbnail_id();
            $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?>
                <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a>
            </div>
            <?php the_excerpt(); ?>
        </div>
    </aside>
    <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

EDIT 2: on peut vérifier l'existence de l'option 'my_sticky_post'. S'il n'existe pas, WP renverra FALSE. Par conséquent, les travaux suivants:

<?php 

$stickyId = get_option('my_sticky_post');
if ($stickyId) :
    $args = array(
        'p' => $stickyId
    );
    $stickyPost = new WP_Query($args);

    if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?>
        <aside class="highlight">
            <h3>Must-read</h3>
            <div class="sidebar-content">
                <div class="thumbnail">
                <?php $image_id = get_post_thumbnail_id();
                $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?>
                    <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a>
                </div>
                <?php the_excerpt(); ?>
            </div>
        </aside>
    <?php endwhile; // have posts ?>
    <?php endif; // have posts ?>
    <?php wp_reset_postdata(); ?>
<?php endif; // $stickyId ?>
2
Bram Vanroy

J'espère que j'ai bien compris votre question et j'espère que le code ci-dessous vous aidera.

Vous devez d’abord ajouter une métabox contenant l’option que vous souhaitez ajouter à chaque publication. La fonction my_add_sticky_metabox() le fera, conjointement avec le hook d’action add_meta_boxes.

À ce stade, vous n'imprimez rien, vous demandez plutôt à WordPress d'imprimer à l'aide de votre rappel déclaré (my_output_sticky_metabox()) lorsque l'écran de modification est affiché.

Avec la fonction my_output_sticky_metabox(), le contenu de metabox est imprimé, avec un contrôle permettant de déterminer si la case doit être cochée et/ou désactivée.

Enfin, la valeur correcte est enregistrée à l’aide de la fonction my_save_sticky_metabox(), associée au crochet d’action save_post.

add_action('add_meta_boxes', 'my_add_sticky_metabox');
function my_add_sticky_metabox(){

    add_meta_box(
        'my_sticky_post_metabox',
        __('Sticky Post', 'my_text_domain'),
        'my_output_sticky_metabox',
        'post'
    );

}

function my_output_sticky_metabox($post){

    /** Grab the current 'my_sticky_post' option value */
    $sp = intval(get_option('my_sticky_post'));

    /** Check to see if the 'my_sticky_post' option should be disabled or checked for the current Post */
    $checked = checked($sp, $post->ID, false);
    if($sp > 0) :
        $disabled = (!disabled($sp, $post->ID, false)) ? 'disabled="true"' : '';
    else :
        $disabled = '';
    endif;

    /** Add a nonce field */
    wp_nonce_field('my_sticky_post_metabox', 'my_sticky_post_metabox_nonce');

    /** Add a hidden field to check against in case it is unchecked before save */
    $value = ($checked) ? '1' : '0';
    echo '<input type="hidden" name="was_checked" value="' . $value . '" />';

    /** Output the checkbox and label */
    echo '<label for="my_sticky_post">';
    echo '<input type="checkbox" id="my_sticky_post" name="my_sticky_post" value="' . $post->ID . '" ' . $checked . $disabled . ' />';
    echo 'Make this the sticky post?</label>';

    /** Let the user know which Post is currently sticky */
    switch($sp) :

        case 0:
            $message = 'There is currently no Sticky Post.';
            break;
        case $post->ID:
            $message = 'This Post is the Sticky Post.';
            break;
        default:
            $message = '<a href="' . get_edit_post_link($sp) . '" title="' . the_title_attribute('before=Edit post \'&after=\'&echo=0') . '">' . get_the_title($sp) . '</a> is the current Sticky Post';
            $message.= '<br />You must remove the sticky status from that post before you can make this one sticky.';

    endswitch;
    echo '<p><em>' . $message .'</em></p>';

}

add_action('save_post', 'my_save_sticky_metabox');
function my_save_sticky_metabox($post_id){

    /*
     * We need to verify this came from our screen and with proper authorization,
     * because the save_post action can be triggered at other times.
     */

    /** Ensure that a nonce is set */
    if(!isset($_POST['my_sticky_post_metabox_nonce'])) :
        return;
    endif;

    /** Ensure that the nonce is valid */
    if(!wp_verify_nonce( $_POST['my_sticky_post_metabox_nonce'], 'my_sticky_post_metabox')) :
        return;
    endif;

    /** Ensure that an AUTOSAVE is not taking place */
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) :
        return;
    endif;

    /** Ensure that the user has permission to update this option */
    if(!current_user_can('edit_post', $post_id)) :
        return;
    endif;

    /**
     * Everything is valid, now the option can be updated
     */

    /** Check to see if the 'my_sticky_post' option was checked */
    if(isset($_POST['my_sticky_post'])) : // It was...

        update_option('my_sticky_post', $_POST['my_sticky_post']);  // Update the option

    else : // It was not...

        /** Check to see if the option was checked prior to the options being updated */
        if($_POST['was_checked'] != 0) : // It was...

            update_option('my_sticky_post', -1);    // Set the option to '-1'

        endif;

    endif;

}

Maintenant, quand vous voulez saisir votre post-it personnalisé, vous utilisez cette requête -

$args = array(
    'p' => get_option('my_sticky_post')
);
$stickyPost = new WP_Query($args);

if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post();

        { Your code goes here }

    endwhile;
endif;
wp_reset_postdata();

Il y a beaucoup de lectures que je vous encourage à jeter un coup d'oeil ici, j'espère que cela répondra à vos questions sur le code ci-dessus -

Modifier

Vous mentionnez que si aucune publication permanente n'est définie, vous avez 4 publications en sortie sur index.php (qui est votre numéro standard).

Je pense que c'est parce que si le paramètre p est vide, il est ignoré. Vous devez donc vérifier la valeur de l'option my_sticky_post.

Apportez cette modification au tableau $args (et notez la ligne supplémentaire ci-dessus) -

$sticky_id = get_option('my_sticky_post');
$args = array(
    'p' => ($sticky_id) ? $sticky_id : '-1'
);
4
David Gard