it-swarm-vi.tech

cách đặt giá trị mặc định cho hộp kiểm trong wordpress

Tôi đang gặp vấn đề để đặt giá trị mặc định cho trường hộp kiểm trong WordPress. Tôi có một trường nhập hộp kiểm (metabox) trong một bài đăng tùy chỉnh. Tôi muốn kiểm tra theo mặc định. và nếu người dùng bỏ chọn nó thì nó sẽ được lưu và bỏ chọn và vẫn không được chọn khi trang được làm mới. Vấn đề của tôi là tôi không thể đặt giá trị mặc định cho hộp kiểm. Tôi chỉ có hai giá trị để làm việc. Vấn đề chính nảy sinh, bởi vì chức năng siêu dữ liệu chạy khi tôi nhấp vào 'thêm bài đăng mới, vì vậy, một giá trị mặc định sẽ tự động được lưu trong cơ sở dữ liệu mà không lưu bài đăng mới. Tôi đã cố gắng trong 3 ngày nay. Tôi đã cố lưu giá trị mặc định 'có' khi người dùng không chọn hộp kiểm.

nhưng trong trường hợp đó, khi người dùng bỏ chọn thì nó vẫn được kiểm tra với giá trị mặc định. đoạn mã hiện tại của tôi

// for displaying metabox
function aps_add_meta_box() {
 add_meta_box(
    'aps_metabox',
    __( 'Slider Settings & Shortcode Generator', APS_TEXTDOMAIN ),
    'aps_metabox_cb', // callback
    'apspostslider', // screen or posttype
    'normal'
 );}
add_action( 'add_meta_boxes', 'aps_add_meta_box' );

function aps_metabox_cb( $post ) {
    wp_nonce_field( 'aps_meta_save', 'aps_meta_save_nounce' ); // nounce
    $aps_display_post_title = get_post_meta( $post->ID, 'aps_display_post_title', true );

    <input type="checkbox" name="aps_display_post_title" value="yes" <?php checked( $aps_display_post_title, 'yes'); />
}

Mã để lưu dữ liệu metabox trong lưu fucntion:

function aps_meta_save( $post_id ) {
    // Perform checking for before saving
    $is_autosave = wp_is_post_autosave($post_id);
    $is_revision = wp_is_post_revision($post_id);
    $is_valid_nonce = (isset($_POST['aps_meta_save_nounce']) && wp_verify_nonce( $_POST['aps_meta_save_nounce'], 'aps_meta_save' )? 'true': 'false');

    if ( $is_autosave || $is_revision || !$is_valid_nonce ) return;
   // Is the user allowed to edit the post or page?
    if ( !current_user_can( 'edit_post', $post_id )) return;
    $aps_display_post_title = (isset($_POST['aps_display_post_title']))? sanitize_text_field( $_POST["aps_display_post_title"] ): '' ;

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);
}
// save only when aps post slider posttype is saved
    add_action( 'save_post_apspostslider', 'aps_meta_save');

Tôi đã thử mã sau đây trong khi lưu nhưng trong trường hợp đó, hộp kiểm được kiểm tra theo mặc định. nhưng khi tôi bỏ chọn và lưu bài đăng thì hộp kiểm vẫn được chọn.

    $aps_display_post_title = (isset($_POST['aps_display_post_title']))? sanitize_text_field( $_POST["aps_display_post_title"] ): 'yes' ;

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);

CẬP NHẬT: Bây giờ mọi thứ đang hoạt động sau khi thay đổi hook. hook save_post chạy khi bài đăng mới được tạo hoặc cập nhật. Vì vậy, chức năng lưu dữ liệu meta sẽ chạy khi bài đăng được tạo và do đó, một giá trị mặc định sẽ được lưu trong cơ sở dữ liệu. Tuy nhiên, bây giờ sau khi thay đổi hook thành - "edit_post", bây giờ mọi thứ đều hoạt động. Cảm ơn anh trai majick người đã giúp tôi. Tất cả các mã làm việc được đưa ra dưới đây:

//Show meta box
function aps_add_meta_box() {
add_meta_box(
    'aps_metabox',
    __( 'Slider Settings & Shortcode Generator', APS_TEXTDOMAIN ),
    'aps_metabox_cb',
    'apspostslider',
    'normal'
);
}
add_action( 'add_meta_boxes', 'aps_add_meta_box' );

/**
 * Prints the box content.
 */
function aps_metabox_cb( $post ) {


    // Add a nonce field so we can check for it later.
    wp_nonce_field( 'aps_meta_save', 'aps_meta_save_nounce' );
    $aps_display_post_title = get_post_meta( $post->ID, 'aps_display_post_title', true );
    <input type="checkbox" name="aps_display_post_title" value="yes" <?php if ($aps_display_post_title != 'no') { echo 'checked'; }?>/>

}

// Save or Update metabox data
function aps_meta_save( $post_id, $post ) {

if ($post->post_type != 'apspostslider') {return;}
// Perform checking for before saving
$is_autosave = wp_is_post_autosave($post_id);
$is_revision = wp_is_post_revision($post_id);
$is_valid_nonce = (isset($_POST['aps_meta_save_nounce']) && wp_verify_nonce( $_POST['aps_meta_save_nounce'], 'aps_meta_save' )? 'true': 'false');

if ( $is_autosave || $is_revision || !$is_valid_nonce ) return;
// Is the user allowed to edit the post or page?
if ( !current_user_can( 'edit_post', $post_id )) return;

 if ( (isset($_POST['aps_display_post_title']))
         && ($_POST['aps_display_post_title'] == 'yes') ) {
        $aps_display_post_title = 'yes';
} else {$aps_display_post_title = 'no';}

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);

add_action( 'edit_post', 'aps_meta_save', 10, 2);
2
Kamal Ahmed

Tôi nghĩ vấn đề có thể là logic khi sử dụng checked...

 <input type="checkbox" name="aps_display_post_title" value="yes" <?php if ($aps_display_post_title != 'no') {echo 'checked';} ?> />

... mặt khác, sau đó chạy sanitize_text_field trên giá trị hộp kiểm cũng có thể gây ra sự cố.

Thay vào đó, bạn có thể muốn phá vỡ logic khác nhau để dễ hiểu hơn và sử dụng mã này với mã ở trên để kiểm tra giá trị không phải là no và do đó sẽ mặc định là đã chọn:

if ( (isset($_POST['aps_display_post_title'])) 
  && ($_POST['aps_display_post_title'] == 'yes') ) {
    $aps_display_post_title = 'yes';}
} else {$aps_display_post_title = 'no';}

update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);

CẬP NHẬT

Để ngăn chức năng siêu dữ liệu kích hoạt khi tạo bài đăng, hãy móc vào edit_post thay vì save_post (và kiểm tra loại bài đăng trong nội bộ bằng cách sử dụng đối số thứ hai được truyền là $post) ...

add_action( 'edit_post', 'aps_meta_save', 10, 2);

function aps_meta_save($post_id, $post) {

    if ($post->post_type != 'apspostslider') {return;}

    ...
2
majick

Mã của bạn sẽ tạo giá trị yes chỉ khi người dùng điền vào biểu mẫu. Bạn có thể kiểm tra nếu meta không có ở đó thì hãy kiểm tra hoặc thử điều này:

$aps_display_post_title = get_post_meta( $post->ID, 'aps_display_post_title', true );
$aps_display_post_title = ! ( 'off' == (string) $aps_display_post_title );

?>
    <input type="checkbox" name="aps_display_post_title" <?php checked( $aps_display_post_title ); ?> />
<?php


// updating the meta
$aps_display_post_title = ! empty($_POST['aps_display_post_title'])? 'on' : 'off'; // call this only when the checkbox is in the screen
update_post_meta( $post_id, "aps_display_post_title", $aps_display_post_title );

Đoán nó sẽ được làm việc. NHƯNG không gọi tập lệnh cập nhật nếu hộp kiểm không ở dạng trong màn hình, điều đó sẽ bỏ chọn các hộp ngay cả khi được chọn ..

0
Samuel Elh