동적필드 생성 관련 문의드립니다.

1. 정확한 제품 또는 플러그인 이름

케이보드

 

2. 상세 내용

안녕하세요. 항상 감사히 사용하고 있습니다.

현재 동적필드 구현을 위해 다음과 같은 코드를 functions에 추가하였고,

phpMyAdmin에서 wp_kboard_board_option 확인 시 DB에도 잘 저장되는 것 같습니다.

 

그런데 문제는 다음 두가지 입니다.

1. 글 수정하기 누르면 생성되었던 동적필드와 함께 저장했던 data도 사라져 있습니다. 근데 또 db에는 남아있습니다.

2. 생성된 동적필드에 입력했던 내용이 게시글 본문에 표시 처리가 안됩니다.

 

어느 부분을 손보아야 할지.. 검색해봐도 마땅한 내용을 찾지 못하여 문의 드립니다.

새해엔 더욱 번창하세요. 감사합니다.

 

<?php

// 케이보드 게시판 필드항목 추가
add_filter('kboard_skin_fields', 'my_kboard_skin_fields', 10, 2);
function my_kboard_skin_fields($fields, $board)
{
    if ($board->id == '2') {
        if (!isset($fields['addfield'])) {
            $fields['addfield'] = array(
                'field_type' => 'addfield',
                'field_label' => '추가상품정보',
                'class' => 'kboard-attr-text',
                'hidden' => '',
                'meta_key' => 'addfield',
                'field_name' => '',
                'permission' => '',
                'roles' => array(),
                'default_value' => '',
                'placeholder' => '',
                'required' => '',
                'show_document' => '',
                'description' => '',
                'close_button' => 'yes'
            );
        }
    }
    return $fields;
}

// 동적필드 생성/삭제 버튼 추가
add_filter('kboard_get_template_field_html', 'my_kboard_get_template_addfield_html', 10, 4);
function my_kboard_get_template_addfield_html($field_html, $field, $content, $board)
{
    if ($field['field_type'] == 'addfield') {

        ob_start();
    ?>
<div id="additionalInputsContainer"></div>

<button type="button" class="add-button" onclick="addNewInput()">상품정보 추가</button>

<script>
    function addNewInput() {
        var fields = [
            { labelFor: 'url', fieldName: '상품구매 링크', inputName: 'kboard_option_url', required: true, placeholder: '', inputType: 'text' },
            { labelFor: 'item', fieldName: '상품명', inputName: 'kboard_option_item', required: true, placeholder: '', inputType: 'text' },
            
        ];

        var productCount = document.querySelectorAll('.attr-name1').length + 1;

        var topAttrName = document.createElement('div');
        topAttrName.className = 'attr-name1';
        topAttrName.innerHTML = `<span class="field-name1">상품 ${productCount}</span>`;

        document.getElementById('additionalInputsContainer').appendChild(topAttrName);

        fields.forEach(function (field) {
            var newDiv = document.createElement('div');
            newDiv.className = `kboard-attr-row kboard-attr-text meta-key-${field.labelFor} ${field.required ? 'required' : ''}`;

            var newLabel = document.createElement('label');
            newLabel.className = "attr-name";
            newLabel.setAttribute("for", `${field.labelFor}-${productCount}`);
            newLabel.innerHTML = `<span class="field-name">${field.fieldName}</span> ${field.required ? '<span class="attr-required-text">*</span>' : ''}`;

            var innerDiv = document.createElement('div');
            innerDiv.className = "attr-value";

            var newInput = document.createElement('input');
            newInput.type = field.inputType;
            newInput.id = `${field.labelFor}-${productCount}`;
            newInput.className = field.required ? 'required' : '';
            newInput.name = `${field.inputName}${productCount}`;
            newInput.value = '';
            newInput.placeholder = field.placeholder;

            innerDiv.appendChild(newInput);
            newDiv.appendChild(newLabel);
            newDiv.appendChild(innerDiv);

            topAttrName.appendChild(newDiv);
        });

        var deleteButton = document.createElement('button');
        deleteButton.type = 'button';
        deleteButton.className = 'delete-button';
        deleteButton.innerHTML = '삭제';
        deleteButton.onclick = function () {
            deleteProduct(this);
        };

        topAttrName.appendChild(deleteButton);
    }

    function deleteProduct(button) {
        var productContainer = button.parentNode;
        productContainer.parentNode.removeChild(productContainer);

        renumberProducts();
    }

    function renumberProducts() {
        var productContainers = document.querySelectorAll('.attr-name1');
        productContainers.forEach(function (container, index) {
            var productNumber = index + 1;
            container.querySelector('.field-name1').textContent = `상품 ${productNumber}`;
        });
    }
</script>
<?php
        $field_html = ob_get_clean();
    }
    return $field_html;
}


//본문출력추가 현재 출력 안되므로 시도한 코드들 예시로 기재

add_filter('kboard_document_add_option_value_field_html', 'my_kboard_document_add_option_value_field_html', 10, 4);
function my_kboard_document_add_option_value_field_html($value_html, $field, $content, $board)
{

    if ($field['field_type'] == 'addfield') {
        $value_html = sprintf('<div class="kboard-document-add-option-value meta-key-%s"><span class="option-name">%s</span> : %s</div><hr>', $field['field_type'], $field['field_name'], "({$content->option->addfield}");
    }
    if ($field['field_type'] == 'url2') {
        $value_html = sprintf('<div class="kboard-document-add-option-value meta-key-%s"><span class="option-name">%s</span> : %s</div><hr>', $field['field_type'], $field['field_name'], "({$content->option->url2}");
    }

    return $value_html;
}

 

 

좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기
워드프레스 에러 기술지원 서비스 전문가에게 맡기세요
  • AI에 의해 자동 생성된 답변이에요 😀

    안녕하세요! 케이보드님, 항상 감사히 사용해주셔서 감사합니다. 동적 필드 생성과 관련하여 문의주셨는데요, 문제를 해결하기 위해 몇 가지 조치를 취해보실 수 있습니다.

    1. 글 수정 시 동적 필드와 함께 저장된 데이터가 사라지는 문제에 대해서는, 아마도 수정 시에 기존 데이터를 불러오지 못해서 그럴 수 있습니다. 이 경우, 수정 버튼을 누를 때 기존 데이터를 불러와야 합니다. 이 부분을 확인해보시고 필요한 코드를 추가해주셔야 할 것 같습니다.

    2. 생성된 동적 필드의 내용이 게시글 본문에 표시되지 않는 문제에 대해서는, 본문에 동적 필드의 내용을 출력하는 코드를 추가해주셔야 합니다. 현재 코드에서는 'kboard_document_add_option_value_field_html' 필터를 사용하여 본문에 동적 필드의 값을 출력하려고 시도하고 계신 것 같은데, 이 부분에서 문제가 발생하고 있는 것 같습니다. 필터 함수를 확인하시고 필요한 수정을 해주셔야 합니다.

    위의 두 가지 문제에 대한 해결 방법은 아직 정확히 파악하지 못했지만, 위의 정보를 토대로 다시 문의주시면 더 자세한 도움을 드릴 수 있을 것입니다. 케이보드님의 워드프레스 지식을 바탕으로 가능한 조치를 안내해드리겠습니다. 번창하시길 바라며, 추가 문의가 있으시면 언제든지 말씀해주세요. 감사합니다!

    ↓ 아래 버튼을 눌러서 피드백해주세요.

워드프레스 에러 기술지원 서비스 전문가에게 맡기세요