Как вы деактивируете значение настраиваемого поля в посте WordPress в зависимости от количества постов, которые его использовали? - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь создать пользовательское поле дней, которое имеет 3 значения: суббота, воскресенье и понедельник. Теперь, если создано 10 сообщений, которые выбрали воскресенье, то это значение в настраиваемом поле будет затенено для будущих участников (вы больше не можете его выбирать). Есть ли способ сделать это? Любые предложения будут оценены.

1 Ответ

0 голосов
/ 04 февраля 2020

Из того, что я вижу, у вас есть несколько вариантов. Возможно, проще всего было бы добавить опцию с update_option() и get_option() на хуке save_post, который подсчитывает количество выбранных дней.

Примечание: хук save_post запускается после сохранения данных (поэтому мета поста изменяется при доступе к нему в этом хуке)

Нечто подобное поможет вам начать. Вы можете добавить больше проверки и прочее, но общая идея заключается в том, чтобы получить post_meta и увеличить подсчет, если это действительный день, а 10 еще не существует:

add_action( 'save_post', 'so60062764_tally_num_days', 12, 1 );
function so60062764_tally_num_days( $post_id ){
    // Prevent Saving Relations for Autodrafts
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;

    // Does this post have a $day?
    if( $day = get_post_meta( $post_id, 'day_chosen', true ) ){
        // Yup, build valid days (prevent arbitrary values)
        $day = strtolower( $day ); // Normalize the string
        $valid_days = array( 'saturday', 'sunday', 'monday' );

        // Is the saved day in our list of valid ones?
        if( in_array($day, $valid_days) ){
            $current_num_days = absint( get_option( "num_$day" ) ); // absint converts strings to int, and false to 0

            // Did they somehow save this with 10 already existing?
            if( $current_num_days >= 10 ){
                // Yes, abort and revert
                delete_post_meta( $post_id, 'day_chosen' );
            } else {
                // update our "global tally"
                update_option( "num_$day", $current_num_days + 1 );
            }
        }
    }
}

Тогда в вашей мета В этом поле вы можете просто проверить текущее глобальное число выбранных дней, прежде чем выводить эту опцию. Вот простой простой пример использования PHP Ternary Operator для экономии места:

echo '<select name="day_chosen">';
    $days = array( 'saturday', 'sunday', 'monday' );
    foreach( $days as $day ){
        $disabled = (get_option("num_$days") >= 10) ? 'disabled="disabled"' : '';
        printf( '<option %s value="%s">%s</option>', $disabled, $day, ucwords($day) );
    }
echo '</select>';
...