WordPress

zapytanie – automatyczna aktualizacja Metabox lub jakikolwiek inny pomysł na rozwiązanie tego problemu

  • 20 lutego, 2023
  • 4 min read
zapytanie – automatyczna aktualizacja Metabox lub jakikolwiek inny pomysł na rozwiązanie tego problemu


Mam moim zdaniem skomplikowany problem. Otrzymuję daty artystów z serwera. Aby je pokazać i rozdzielić, każdy artysta ma swój identyfikator. Tak więc „Artyści” to CPT, a identyfikator artysty znajduje się w CustomMetabox. Na stronach pojedynczych artystów mam daty jednego artysty. Do tego wszystko działa dobrze. Teraz mam „Witrynę ze wszystkimi datami”, na której umieszczam listę wszystkich artystów wraz z ich datami. Artysta 1 + daty, Artysta 2 + daty i tak dalej.

Problem: nie każdy Artysta ma Daty za każdym razem i chcę pokazać tylko tych, którzy mają Daty. Z CSS lub jQuery to działa, ale przeszukuje każdego Artystę szukającego dat, co wygląda źle i zajmuje zbyt dużo czasu (ponad 100 Artystów …).

Aby rozwiązać ten problem, wypróbowałem go z Metaboksem na stronie artystów, który szuka dat i łapie pierwszy numer, jeśli są daty. Więc pomyślałem, że mogę powiedzieć, że jeśli to Pudełko nie ma Numeru – nie pokazuj Artysty na Stronie Daty. Wydaje się, że to działa, ale tylko wtedy, gdy klikam Zapisz na każdej stronie wykonawcy… ale to powinno działać automatycznie!

Warto przeczytać!  Niech ślimak niestandardowej taksonomii mieści się w ślimaku niestandardowego typu postu

Próbowałem aktualizować Metabox przez zadanie cron co minutę, ale to również nie działa. Co ja robię źle??

// Metabox - Artist Dates
function artistdates_metabox_content($post) {   
    wp_nonce_field( basename( __FILE__ ), 'artistdates_metabox_content_nonce' );
    $artistid = get_post_meta($post->ID, 'artistsid_metabox_content' , true);     
    $datecheck = do_shortcode('[aboss-events template="new-singleartist-widget" project_id="' . $artistid . '" amount_of_shows="1"]');
    if(strlen($datecheck) > 3){ 
        $value = substr($datecheck,0,3); 
    }   
    ?>      
    <input type="text" name="datescontent_field" id="datescontent_field" class="datescontentheck" value="<?php echo trim($value); ?>">    
    <?php    
}
function artistdates_metabox_content_save_postdata($post_id, $update) {
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ 'artistdates_metabox_content_nonce' ] ) && wp_verify_nonce( $_POST[ 'artistdates_metabox_content_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';
    if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
        return;
    }       
    if (!empty($_POST['artistdates_metabox_content'])) {
        update_post_meta($post_id, 'artistdates_metabox_content');
    }
    if ( isset ( $_POST['artistdates_metabox_content'] ) ) {
        update_post_meta( $post_id, 'artistdates_metabox_content', $_POST['artistdates_metabox_content'] );
    }
    if ( $_POST['artistdates_metabox_content'] = null ) {
        delete_post_meta($post->ID, 'artistdates_metabox_content');
    }
    if (array_key_exists('datescontent_field', $_POST)) {
        update_post_meta( $post_id, '_artistdates_metabox_meta_key', $_POST['datescontent_field']);        
    } else { 
        delete_post_meta( $post_id, '_artistdates_metabox_meta_key' );
    }
        update_post_meta( $post_id, '_artistdates_metabox_meta_key', $_POST['datescontent_field']);
        update_post_meta( $post_id, 'artistdates_metabox_content', $_POST['artistdates_metabox_content'] );
}
add_action( 'save_post', 'artistdates_metabox_content_save_postdata',2,3);



<?php $args = array( 
'post_type' => 'artists', 
'numberposts' => -1, 
'posts_per_page' => -1, 
'orderby' => 'title', 
'order' => 'ASC',
'meta_query' => array(  
'relation'      => 'AND',           
array(
'key'       => 'artistsid_metabox_content', 
),
array(
'key'       => '_artistdates_metabox_meta_key',
)               
)
);
$the_query = new WP_Query( $args ); 
if( $the_query->have_posts() ) : 
while( $the_query->have_posts() ) : $the_query->the_post(); 
$artistid = get_post_meta($post->ID, 'artistsid_metabox_content', true);
if( !empty($artistid) ) { ?>
<div class="item a-boss">
    <div class="all-artists-dates">
            <?php echo do_shortcode('[aboss-events template="allartists-widget" project_id="' . $artistid . '" display_ticket_links="yes"]'); ?>
    </div>
</div>
<?php } ?>
<?php wp_reset_postdata(); ?>
<?php wp_reset_query(); ?>
<?php endwhile; ?>

<?php endif; ?>


// Auto Update Artists Dates Check
function run_update_artists_cron_job() {
    $posts = get_posts([
        'post_type' => 'artists',
        'posts_per_page' => -1,
    ]);
    // now check meta and update custom fields for every post
    foreach ($posts as $post_id) {
        update_post_meta( $post_id, '_artistdates_metabox_meta_key', $_POST['datescontent_field']);
        update_post_meta( $post_id, 'artistdates_metabox_content', $_POST['artistdates_metabox_content'] );
    }
}
// Schedule Interval
function artists_add_cron_interval( $schedules ) {
    $schedules['everyminute'] = array(
            'interval'  => 60, 
            'display'   => 'Every Minute'
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'artists_add_cron_interval' );
// Schedule Cron Job Event
function update_artists_cron_job() {
    if (!wp_next_scheduled('run_update_artists_cron_job')) {
        wp_schedule_event( time(), 'everyminute', 'run_update_artists_cron_job');
    }
}
add_action('wp', 'update_artists_cron_job');
add_action('run_update_artists_cron_job', 'run_update_artists_cron_job');


Źródło

Warto przeczytać!  php — wtyczka wordpress (widget), która wykonuje wyszukiwanie Neaby w punkcie końcowym openstreetmap: wokół x znajdź y