web-dev-qa-db-fra.com

Valeur automatique pour les champs personnalisés pour les publications

J'ai créé des champs personnalisés pour les publications à l'aide de l'action add_meta_box. Je souhaite créer ma propre requête WP en fonction de mon champ personnalisé, afin de m'assurer que je ne chargerai qu'une collection de publications avec les données correctes. Si j'ajoute un nouveau champ, la publication n'a pas automatiquement de valeur pour mon champ personnalisé. Je ne peux donc pas charger la collection appropriée sans sauvegarder manuellement tous les articles. J'ai plus de 1200 articles, il va donc être très difficile de tous les changer et de définir la valeur dans la base de données.

Le champ que j'ai créé doit être automatiquement défini sur "true". Si le champ est vrai, je montrerai les messages sur une page spécifique. Je souhaite actuellement que tous les articles soient affichés sur cette page. Tous les 1200 articles doivent donc être chargés. À l'avenir, les messages seront triés et certains ne devraient pas apparaître sur la page d'accueil.

J'ai créé le champ à l'aide de l'action add_meta_boxes. Afficher le champ, éditer le champ et enregistrer le champ fonctionne correctement.

/**
 * Add Meta Box to post
 */
if(!function_exists('theme_settings_add_post_meta_box')) {
    function theme_settings_add_post_meta_box()
    {
        $screens = array('post');

        foreach ($screens as $screen) {
            add_meta_box(
                'theme_settings_section_slider',
                __('Homepage Slider', 'slidedata'),
                'theme_settings_section_slider_callback',
                $screen,
                'normal',
                'high'
            );
        }
    }
}

J'ai créé les éléments de formulaire dans la fonction "theme_settings_section_slider_callback". J'ai copié le champ personnalisé que je veux filtrer par:

$showPost = 'theme_settings_post_show';
<?php /** Show post on frontend */ ?>
<label for="<?php echo $showPost ?>"><?php _e('Show post on homepage') ?></label>
<br />
<select style="margin-bottom: 20px" name="<?php echo $showPost ?>" id="<?php echo $showPost ?>">
    <option value="false" <?php echo get_post_meta($object->ID, $showPost, true)  == 'false' ? '' : 'selected' ?>>No</option>
    <option value="true" <?php echo get_post_meta($object->ID, $showPost, true) != 'false' ? 'selected' : '' ?>>Yes</option>
</select>

Fonction de sauvegarde (qui fonctionne aussi très bien)

if(!function_exists('theme_settings_save_post_meta_box')) {
    function theme_settings_save_post_meta_box($post_id, $post) {
        // Add a check if this account has permission to save, maybe?
        .....
        $data['show_post']      = 'theme_settings_post_show';

        foreach($data as $item) {
            if(isset($_POST[$item])) {
                $value = $_POST[$item];
                update_post_meta($post_id, $item, $value);
            }
        }
    }
}

La logique de terrain fonctionne très bien. C'est la requête que j'utilise pour afficher les publications en fonction du champ "theme_settings_post_show":

//Get all posts which have to be shown on the homepage
if(!function_exists('getPosts')) {
    function getPosts() {
        //$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

        //Query arguments
        $queryArguments = array(
            'posts_per_page' => -1,
            'post_type'     => 'post',
            'meta_key'      => 'theme_settings_post_show',
            'meta_value'    => 'true'
        );

        $postsQuery = new WP_Query($queryArguments);

        if($postsQuery->have_posts()) {
            return $postsQuery;
        }

        return false;
    }
}

Comme vous pouvez vous en douter, le champ "theme_settings_post_show" n'est défini pour aucun message pour le moment. Je ne récupère donc aucun message avec ma fonction "getPost". J'ai également essayé de filtrer par meta_value null, mais cela ne fonctionne pas.

Ma question est donc la suivante: comment créer un champ qui a automatiquement une valeur par défaut pour toutes les publications? Ou suis-je obligé de créer une sorte de script qui parcourt toutes les publications et définit automatiquement les données? Ou est-ce que j'utilise une mauvaise méthode pour ajouter les champs à la publication?

1
Stefan R

Essayez meta_query pour obtenir des publications ayant theme_settings_post_show == true (pour les nouvelles publications) et theme_settings_post_show pas définies du tout (pour les anciennes publications):

<?php
$queryArguments = array(
    'posts_per_page' => -1,
    'post_type'     => 'post',
    'meta_query' => array(
       'relation' => 'OR', // value is not set or true
        array(
         'key' => 'theme_settings_post_show',
         'value' => '', // can be any value, since it does not exists
         'compare' => 'NOT EXISTS',
        ),
        array(
         'key' => 'theme_settings_post_show',
         'value' => true,
         'compare' => '=',
        ),
    ),
);
2
Max Yudin

Le plug-in Advanced Custom Fields possède également un type de champ vrai/faux, que vous pouvez ajouter à des publications spécifiques, des pages de types de publication, etc., et vous pouvez également définir la valeur par défaut.

Mais cela ne fonctionnerait que sur les nouveaux postes ajoutés.

0
D. Dan