source

구텐베르크의 "문서" 아래에 새 패널을 추가하는 방법

nicesource 2023. 4. 4. 21:26
반응형

구텐베르크의 "문서" 아래에 새 패널을 추가하는 방법

문서 탭에 카테고리, 특집 이미지 등의 새로운 컴포넌트 패널을 추가하려고 합니다.

여기에 이미지 설명 입력

PluginDocumentSettingPanel SlotFill이 추가되었습니다.

const { registerPlugin } = wp.plugins
const { PluginDocumentSettingPanel } = wp.editPost
 
const PluginDocumentSettingPanelDemo = () => (
    <PluginDocumentSettingPanel
        name="custom-panel"
        title="Custom Panel"
        className="custom-panel"
    >
        Custom Panel Contents
    </PluginDocumentSettingPanel>
)
registerPlugin('plugin-document-setting-panel-demo', {
    render: PluginDocumentSettingPanelDemo
})

add_meta_box유효하게 됩니다만,context-값으로 계산함'side':

add_meta_box(
    'box-id-here',
    'Box Title Here',
    'createBoxHtml',
    'post',
    'side' ); // <-- this is important

아, 이틀은 헛수고야!


구답

튜토리얼에 따르면 커스텀 사이드바를 추가하고 커스텀 폼 입력으로 채울 수 있습니다.

다음은 React JSX 버전의 작업 예입니다.메타 필드를 추가합니다.country:

const { registerPlugin } = wp.plugins;
const { PluginSidebar } = wp.editPost;
const { TextControl } = wp.components;
const { withSelect, withDispatch } = wp.data;

// Customized TextControl
const CustomMetaField = withDispatch( ( dispatch, props ) => {
    return {
        updateMetaValue: ( v ) => {
            dispatch( 'core/editor' ).editPost( {
                meta: {
                    [ props.metaFieldName ]: v
                }
            });
        }
    };
})( withSelect( ( select, props ) => {
    return {
        [ props.metaFieldName ]: select( 'core/editor' ).getEditedPostAttribute( 'meta' )[ props.metaFieldName ]
    };
} )( ( props ) => (
    <TextControl
        value={props[ props.metaFieldName ] }
        label="Country"
        onChange={( v ) => {
            props.updateMetaValue( v );
        }}
    /> )
) );


// Our custom sidebar
registerPlugin( 'custom-sidebar', {
    render() {
        return (
            <PluginSidebar
                name="project-meta-sidebar"
                title="Project Meta">
                <div className="plugin-sidebar-content">
                    <CustomMetaField metaFieldName="country" />
                </div>
            </PluginSidebar>
        );
    },
} );

그리고 PHP에서 메타 필드를 등록합니다.init- 훅:

register_meta( 'post', 'country', [
    'show_in_rest' => TRUE,
    'single' => TRUE,
    'type' => 'string'
] );

알고 있습니다.

이는 여전히 필요한 솔루션은 아니지만 거의 동일합니다.

이제 최신 버전을 사용할 수 있습니다.useSelect그리고.useDispatch커스텀 훅그들은 와 비슷하다.withSelect그리고.withDispatch단, 조금 더 간결한 개발 경험을 위해 React 16.8의 커스텀 훅을 사용합니다.

(또한 사용방법@wordpress/scripts따라서 Import는 npm 패키지가 아닌wp직접 이의를 제기하지만 둘 중 하나가 작동합니다.)

import { __ } from '@wordpress/i18n';
import { useSelect, useDispatch } from '@wordpress/data';
import { PluginDocumentSettingPanel } from '@wordpress/edit-post';
import { TextControl } from '@wordpress/components';

const TextController = (props) => {
  const meta = useSelect(
    (select) =>
      select('core/editor').getEditedPostAttribute('meta')['_myprefix_text_metafield']
  );
  const { editPost } = useDispatch('core/editor');
  return (
    <TextControl
      label={__("Text Meta", "textdomain")}
      value={meta}
      onChange={(value) => editPost({ meta: { _myprefix_text_metafield: value } })}
    />
  );
};

const PluginDocumentSettingPanelDemo = () => {
  return (
    <PluginDocumentSettingPanel
      name="custom-panel"
      title="Custom Panel"
      className="custom-panel"
    >
      <TextController />
    </PluginDocumentSettingPanel>
  );
};

export default PluginDocumentSettingPanelDemo;

메타 필드를 정상적으로 등록하는 것과 함께 다음과 같이 하십시오.

function myprefix_register_meta()
{
    register_post_meta('post', '_myprefix_text_metafield', array(
        'show_in_rest' => true,
        'type' => 'string',
        'single' => true,
        'sanitize_callback' => 'sanitize_text_field',
        'auth_callback' => function () {
            return current_user_can('edit_posts');
        }
    ));
}
add_action('init', 'myprefix_register_meta');

커스텀 투고 타입에 사용하는 경우는, 다음의 것을 확인해 주세요.custom-fields일렬로supports:

'supports' => array('title', 'editor', 'thumbnail', 'revisions', 'custom-fields'),

그게 도움이 됐으면 좋겠어요.

이 코드를 function.php에 추가할 수 있습니다.이 코드는 새 탭을 만들고 텍스트 필드를 이 탭에 추가합니다.post_meta 테이블의 커스텀필드처럼 텍스트필드를 데이터베이스에 저장하여 기본 WP 포스트 메타처럼 출력할 수 있습니다.
1. [작성] 탭Настройки UTM.
2. 커스텀 텍스트 필드 작성utm_post_class
3. 웹사이트에서 출력하기 위해$utm = get_post_meta( $post->ID, 'utm_post_class', true );

//Article UTM Link
add_action( 'load-post.php', 'utm_post_meta_boxes_setup' );
add_action( 'load-post-new.php', 'utm_post_meta_boxes_setup' );

function utm_post_meta_boxes_setup() {
    add_action( 'add_meta_boxes', 'utm_add_post_meta_boxes' );
    add_action( 'save_post', 'utm_save_post_class_meta', 10, 2 );
}

function utm_add_post_meta_boxes() {
    add_meta_box(
        'utm-post-class',
        'Настройки UTM',
        'utm_post_class_meta_box',
        'post',
        'side',
        'default'
    );
}

function utm_post_class_meta_box( $post ) {
    wp_nonce_field( basename( __FILE__ ), 'utm_post_class_nonce' );?>

    <div class="components-base-control editor-post-excerpt__textarea">
        <div class="components-base-control__field">
            <label class="components-base-control__label" for="utm-post-class">UTM ссылка (необязательно)</label>
            <input type="text" name="utm-post-class" id="utm-post-class" class="edit-post-post-schedule" value="<?php echo esc_attr( get_post_meta( $post->ID, 'utm_post_class', true ) ); ?>">
        </div>
    </div>
<?php }

function utm_save_post_class_meta( $post_id, $post ) {

    if ( !isset( $_POST['utm_post_class_nonce'] ) || !wp_verify_nonce( $_POST['utm_post_class_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    $post_type = get_post_type_object( $post->post_type );
    if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
        return $post_id;

    $new_meta_value = ( isset( $_POST['utm-post-class'] ) ? $_POST['utm-post-class'] : '' );
    $meta_key = 'utm_post_class';
    $meta_value = get_post_meta( $post_id, $meta_key, true );

    if ( $new_meta_value && '' == $meta_value )
        add_post_meta( $post_id, $meta_key, $new_meta_value, true );
    elseif ( $new_meta_value && $new_meta_value != $meta_value )
        update_post_meta( $post_id, $meta_key, $new_meta_value );
    elseif ( '' == $new_meta_value && $meta_value )
        delete_post_meta( $post_id, $meta_key, $meta_value );
}

add_box는 구텐베르크 에디터용 새 패널을 추가합니다.

언급URL : https://stackoverflow.com/questions/51845266/how-to-add-new-panel-under-document-in-gutenberg

반응형