it-swarm.com.de

Post_date muss mit dem ausstehenden post_date identisch sein, wenn der Beitrag privat veröffentlicht wird

Ich speichere mein CPT im Status private . Der Übergang würde also von pending zu private erfolgen. Wenn der Beitrag zum ersten Mal eingereicht wurde und noch aussteht, wird das Datum der Übermittlung im Feld post_date in db angezeigt. Aber als der Beitrag veröffentlicht wurde, wurde das Datum mit dem aktuellen Datum aktualisiert.

Ich möchte das ursprüngliche Datum der Einreichung des Beitrags behalten, auch wenn der Beitrag später privat veröffentlicht wird.

Also habe ich so etwas gemacht:

function mycpt_keep_pending_date_on_publishing( $new_status, $old_status, $post ) {
    if( 'mycpt' === $post->post_type && 'pending' === $old_status && 'private' === $new_status ) :
        $pending_datetime = get_post_field( 'post_date', $post->ID, 'raw' );

        // Update the post  
        $modified_post = array(  
            'ID'            => $post->ID,  
            'post_date'     => $pending_datetime,
            'post_date_gmt' => get_gmt_from_date( $pending_datetime )
        );  

        // Update the post into the database  
        wp_update_post( $modified_post );

    endif;
}

add_action( 'transition_post_status', 'mycpt_keep_pending_date_on_publishing' );

Aber es funktioniert nicht. Was kann der Grund sein?

3
Mayeenul Islam

@Howdy_McGee ist in seinem Kommentar auf dem richtigen Weg: Wenn transition_post_status ausgelöst wird, wurde der Beitrag bereits aktualisiert (dh an die Datenbank geschrieben). .

Was Sie tun müssen, ist sich wie folgt in wp_insert_post_data , anstelle von transition_post_status einzuhängen:

add_filter ('wp_insert_post_data', 'mycpt_keep_pending_date_on_publishing', 10, 2) ;

function
mycpt_keep_pending_date_on_publishing ($data, $postarr)
{
    if ($data['post_type'] != 'mycpt') {
        return ($data) ;
        }

    // this check amounts to the same thing as transition_post_status(private, pending)
    if ('private' != $data['post_status'] || 'pending' != $postarr['original_post_status']) {
        return ($data) ;
        }

    $pending_datetime = get_post_field ('post_date', $data['ID'], 'raw') ;

    $data['post_date'] = $pending_datetime ;
    $data['post_date_gmt'] = get_gmt_from_date ($pending_datetime) ;

    return ($data) ;
}

Hinweis: Ich habe denselben Funktionsnamen wie Sie verwendet, aber der Inhalt dieser Funktion ist unterschiedlich.

Zusätzlich zu den anderen Antworten gibt es hier ein kleines Plugin, das sicherstellt, dass der Code nur einmal ausgeführt wird. Falls die Daten durch ein später ausgeführtes Plugin zurückgesetzt werden, versuchen Sie, PHP_INT_MAX -1 als Priorität zu verwenden (nicht für öffentlich verteilte Plugins). In diesem Fall müssen Sie denselben Wert für remove_filter() festlegen, da sonst der Rückruf nicht entfernt wird.

<?php
/**
 * Plugin Name: (WPSE) Static post date
 * Description: Keep the post date as the original date for posts published as private
 */
namespace WPSE;

add_filter( 'wp_insert_post_data', '\WPSE\save', 10, 2 );
function save( $post, $raw ) {
    if ( ! in_array( $post['post_status'], [ 'private', 'pending', ] ) ) {
        return $post;
    }
    if ( 'your_post_type' !== $post['post_type'] ) {
        return $post;
    }

    $date = get_post_field( 'post_date', $post['ID'], 'raw' );
    $post['post_date'] = $date;
    $post['post_date_gmt'] = get_gmt_from_date( $date );

    return $post;
}

add_action( 'transition_post_status', function() {
    # Make sure above callback is only triggered once
    remove_filter( 'wp_insert_post_data', '\WPSE\save' );
} );

IIRC Ihr Hauptproblem mit dem obigen Code ist, dass der private_to_published-Filter veraltet ist. Es gibt also nichts Bestimmtes außer einem Post-Typ-Statusfilter . Probieren Sie das folgende Plugin aus und prüfen Sie, ob es funktioniert (ob Ihr Beitragstyp wirklich mycpt heißt):

<?php
/* Plugin Name: (WPSE) Test post type status actions */
add_action( 'private_mycpt', function( $ID, \WP_Post $post ) {
    var_dump( current_filter() );
    exit;
}, 10, 2 );
1
kaiser