Wordpress - Synchroniser les statuts de vos custom posts non pris en charge par WPML

Wordpress

[09/09/2020] Synchroniser les statuts de vos custom posts non pris en charge par WPML

Sync Post Status of Custom posts when not handled by wpml

Synchroniser les statuts de vos custom posts non pris en charge par WPML

On trouve beaucoup d'articles sur les forums de WPML où les demandeurs sont un peu dépités de voir toujours la même réponse du support qui leur annonce que cela n'est pas possible !!! (Ex: "At the moment, unfortunately, this is not possible. This is how WPML works at this moment").

Vous vous dîtes que s'il faut modifier à la main les 5 langues que vous avez par custom posts, vous allez y passer à chaque fois des "plombes".

Pas de panique, il y a une solution pour synchroniser automatiquement vos custom posts lorsque vous leur modifiez leurs statuts dans la première langue.

Voici une fonction qui fait l'affaire, à placer dans votre fichier de thème functions.php ou dans vos développements de plugins (Remplacez custompost par votre propre variable) :
 
/*
* Sync Post status of Custom Posts when not handled by wpml
*/
add_action('save_post', 'my_sync_post_status', 10, 1);
function my_sync_post_status( $post_id ) {
     
    global $wpdb, $sitepress;
    
    # Initialize
    $post = get_post( $post_id );
    
    # only sync for your custom post
    if ($post->post_type != 'custompost') {
        return;
    }
 
    # Don't save for autosave
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }
 
    # Don't save for revisions
    if (isset($post->post_type) && $post->post_type == 'revision') {
        return $post_id;
    }
     
    # Don't sync deleted items
    if ($post->post_status == 'trash') {
        return;
    }
 
    # Only save translation if wpml is not synced anymore
    $duplicate_status = apply_filters('wpml_element_translation_type', NULL, $post_id, 'custompost');
    if ($duplicate_status == 1 ) {
        
        # Get translation IDs
        $trid        = $sitepress->get_element_trid($post_id);
        $translation = $sitepress->get_element_translations($trid);
        
        # Update post_status for all translations except the current language
        foreach( $translation as $language_code => $post_details ) {
            if( ICL_LANGUAGE_CODE != $language_code ) {
                 $wpdb->update( $wpdb->prefix . 'posts', array( 'post_status' => $post->post_status ), array( 'ID' => $post_details->element_id ) );
            }
        }
        
    }
}


Bon code ;-)

© 2005 - 2020 • INFORMATUX