Erlaube nur einen Metaschlüsselwert pro Post in einer Kategorie

Ich habe eine Metabox für ein Thema erstellt, an dem ich gerade arbeite. Es ist eine einfache Metabox mit einem Kontrollkästchen für den gewünschten Beitrag. Das Problem besteht darin, dass der Benutzer das Kontrollkästchen für mehrere Posts derselben Kategorie aktivieren kann .

Ich möchte den Metawert von einem alten Beitrag deaktivieren, sobald ein neuer Beitrag unter dieser Kategorie veröffentlicht wurde. Also im Grunde nur 1 Beitrag überprüft werden, wie in einer bestimmten Kategorie gekennzeichnet. Ich denke ich sollte etwas damit machen

delete_post_meta( $post_id, 'featured_post' ); 

aber ich bin nicht sicher, wie ich vorherige Posts überprüfen und das Post-Meta von ihnen löschen kann. Irgendein Vorschlag?

Update # 1:

Das ist meine Meta-Box:

 //FEATURED POST CHECK BOX //ADD THE META BOX add_action( 'add_meta_boxes', 'add_featured_slide' ); function add_featured_slide(){ //POST TYPES TO HAVE THE CUSTOM META BOX $ctptypes = array( 'post', 'page', 'your_custom_post_type' ); foreach ( $ctptypes as $ctptype ) { add_meta_box( 'featured-slide', 'Featured Post', 'featured_slide_func', $ctptype, 'side', 'high' ); } } //DEFINE THE META BOX function featured_slide_func( $post ){ $values = get_post_custom( $post->ID ); $check = isset( $values['special_box_check'] ) ? esc_attr( $values['special_box_check'][0] ) : ''; wp_nonce_field( 'my_featured_slide_nonce', 'featured_slide_nonce' ); ?> 

<input type="checkbox" name="special_box_check" id="special_box_check" />

array( 'href' => array() ) ); // IF CHECKED SAVE THE CUSTOM META if ( isset( $_POST['special_box_check'] ) && $_POST['special_box_check'] ) { add_post_meta( $post_id, 'special_box_check', 'on', true ); } // IF UNCHECKED DELETE THE CUSTOM META else { delete_post_meta( $post_id, 'special_box_check' ); } }

Solutions Collecting From Web of "Erlaube nur einen Metaschlüsselwert pro Post in einer Kategorie"

Ich denke, Sie möchten alle Meta-Werte aus allen Posts mit diesem löschen:

 delete_metadata('post', null, $meta_key, null, true) 

Siehe die Dokumentation, die besagt, dass das letzte Argument ist, alle Einträge von allen Objekten zu löschen:

 delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $delete_all = false) 

$ delete_all (boolean) (optional) Optional, Standardwert ist false. Wenn dies der Fall ist, löschen Sie übereinstimmende Metadateneinträge für alle Objekte und ignorieren Sie die angegebene Objekt-ID. Andernfalls löschen Sie nur übereinstimmende Metadateneinträge für die angegebene object_id. Standard: falsch

https://codex.wordpress.org/Function_Reference/delete_metadata

Anschließend können Sie mit wp_get_recent_posts() den neuesten Beitrag aus einer Kategorie wp_get_recent_posts() und dort den Meta-Wert zuweisen.

https://codex.wordpress.org/Function_Reference/wp_get_recent_posts

Sie behaupten, dass Sie “… zulassen möchten, dass 1 Beitrag in einer bestimmten Kategorie überprüft wird.” Um dies zu tun, müssen Sie Ihren special_box_check mit den Kategorien special_box_check anstatt einen einfachen Ein / Aus- special_box_check zu haben. Das erfordert eine Änderung in der Form, in der $check gesetzt und checked() verwendet wird. Es erfordert auch eine Änderung, wie die Daten gespeichert werden. Suchen Sie in der Quelle unten nach “Änderungen folgen”.

 //ADD THE META BOX add_action( 'add_meta_boxes', 'add_featured_slide' ); function add_featured_slide(){ //POST TYPES TO HAVE THE CUSTOM META BOX $ctptypes = array( 'post', 'page', 'your_custom_post_type' ); foreach ( $ctptypes as $ctptype ) { add_meta_box( 'featured-slide', 'Featured Post', 'featured_slide_func', $ctptype, 'side', 'high' ); } } //DEFINE THE META BOX function featured_slide_func( $post ){ $values = get_post_custom( $post->ID ); $check = isset( $values['special_box_check'] ) ? true : false; wp_nonce_field( 'my_featured_slide_nonce', 'featured_slide_nonce' ); ?> 

/>

< ?php } //SAVE THE META BOX DATA WITH THE POST add_action( 'save_post', 'featured_slide_save', 10, 2 ); function featured_slide_save( $post_id, $post ){ if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if( !isset( $_POST['featured_slide_nonce'] ) || !wp_verify_nonce( $_POST['featured_slide_nonce'], 'my_featured_slide_nonce' ) ) return; if( !current_user_can( 'edit_post' ) ) return; $allowed = array( 'a' => array( 'href' => array() ) ); // Changes follow if ( isset( $_POST['special_box_check'] ) && $_POST['special_box_check'] ) { $cats = wp_get_post_categories($post_id); foreach ($cats as $v) { delete_metadata ( 'post', null, 'special_box_check', $v, true ); } foreach ($cats as $v) { add_post_meta( $post_id, 'special_box_check', $v); } } else { delete_post_meta( $post_id, 'special_box_check' ); } }