WordPress

posty — Jak uzyskać mój element Gutenberga, aby zapobiec aktualizacji ostatniej modyfikacji?

  • 21 listopada, 2023
  • 3 min read
posty — Jak uzyskać mój element Gutenberga, aby zapobiec aktualizacji ostatniej modyfikacji?


Dodałem pole wyboru do mojego postu Gutenberga, którego zaznaczenie ma uniemożliwić Gutenbergowi aktualizację postu post_modified I post_modified_gmt kolumny. Pole wyboru zarządza własnym stanem, ale status pola wyboru nie jest przesyłany, gdy aktualizuję post.

Mój blok

Oto kod umożliwiający dodanie pola wyboru (wiem, że powinienem zamiast tego używać JSX, ale nie podoba mi się to).

'use strict';
if (window.wp) {

    (function (wp) {

        // Only applies to published posts. NOT WORKING.
        //if(wp.data.select('core/editor').getEditedPostAttribute('status') !== 'publish') return;

        var registerPlugin = wp.plugins.registerPlugin,
            PluginPostStatusInfo = wp.editPost.PluginPostStatusInfo,
            CheckboxControl = wp.components.CheckboxControl,
            withSelect = wp.data.withSelect,
            __ = wp.i18n.__;

        var LastUpdatedTime = withSelect(function (select) {
            return {
                'lastUpdated': select('core/editor').getEditedPostAttribute('modified'),
            };
        })(function (props) {
            return [ 
                wp.element.createElement(
                    'span',
                    null,
                    __('Last Modified','rabbit')
                ),
                wp.element.createElement(
                    'div',
                    null,
                    wp.element.createElement(
                        'strong',
                        null,
                        props.lastUpdated
                    )
                )
            ];
        });

        var PluginPostStatusInfoUpdateLastModified = function () {
            var [preventUpdateTime, setPreventUpdateTime] = wp.element.useState(false),
                handleCheckboxChange = function() {
                    setPreventUpdateTime(!preventUpdateTime);
                };
            
            return wp.element.createElement(
                PluginPostStatusInfo,
                { 'className': 'edit-post-update-last-modified' },
                wp.element.createElement(CheckboxControl, {
                    'label': __('Do not update last modified time','rabbit'),
                    'checked': preventUpdateTime,
                    'onChange': handleCheckboxChange,
                    'name': 'no_update_last_modified'
                })
            );
        };
        
        var PluginPostStatusInfoLastModified = function () {
            return wp.element.createElement(
                PluginPostStatusInfo,
                { 'className': 'edit-post-last-modified' },
                wp.element.createElement(LastUpdatedTime)
            );
        };

        registerPlugin('post-status-info-last-modified', { 'render': PluginPostStatusInfoLastModified });
        registerPlugin('post-status-info-update-last-modified', { 'render': PluginPostStatusInfoUpdateLastModified });
        
    })(window.wp);

}

Ponieważ stan pola wyboru nie jest wysyłany do PHP, nie mogę wykryć, czy jest ono zaznaczone w pliku wp_insert_post_data filtr:

// shit don't work
if($_POST['no_update_last_modified']) { ... }

Ale poza tym, nawet jeśli zrobię jedno i drugie wp_insert_post_data I rest_prepare_post usuń ustawienie ostatnio zmodyfikowanych i ostatnio zmodyfikowanych atrybutów GMT, oba po prostu kończą się niepowodzeniem, więc podejrzewam, że Gutenberg używa innej metody, aby zaktualizować datę ostatniej modyfikacji mojego postu:

static function wp_insert_post_data($data, $postarr, $unsanitized_postarr, $update) {
        
        if(!$update) return $data;
        
        // Check if it's the right post type to apply this modification
        if(in_array($data['post_type'], self::$post_types)) { // && !empty($_POST['no_update_last_modified'])) {
            unset($data['post_modified'], $data['post_modified_gmt']);
        }
        
        return $data;
    }
    
    static function rest_prepare_post( $data, $post, $request ) {
        
        if(!is_a($data,'WP_REST_Response')) return $data;
        
        // Check if it's a REST API request
        $arr = $data->get_data();

        unset( $arr['modified'], $arr['modified_gmt'] );
        
        $data->set_data( $arr );
        set_transient('REST',$data);
        return $data;
    }

Ktoś może pomóc? Gutenberg ma fatalną dokumentację. Bardzo trudno jest znaleźć dosłownie jakąkolwiek dobrą dokumentację dotyczącą tego, jak cokolwiek z tym zrobić.

Warto przeczytać!  Jak wyświetlić Twittera i Facebooka autora na stronie profilu

PS Tak, wiem, że mogę do tego użyć metaboksa, ale znacznie eleganckoj jest zintegrować to z Gutenbergiem.


Źródło