save_post пользовательский тип записи ? $_POST не работает?

Вопрос или проблема

У меня есть этот код.

<?php
add_action('add_meta_boxes', 'ct_meta_add');
add_action('save_post','ct_meta_save');
add_action('save_post','ct_parent');
// добавляем мета функции
function ct_meta_add() {
    add_meta_box(
        'ct_chap', //id
        'Thông tin chương', //title
        'ct_meta_show', //callback function
        'chap', //post type     
        'normal' //priority
    );
}
function get_blogspot_url($string) {
    preg_match_all('/<a href="https://wordpress.stackexchange.com/questions/65220/(.*?)"https://wordpress.stackexchange.com/", $string, $matches);
    $string = '';
    foreach($matches[1] as $val) {
        $string .= $val."\n";
    }
    $string = str_replace('s1600', 's0', $string);
    return $string;
}
// функции сохранения мета
function ct_meta_save() {
    global $post;   
    /* Сохраняем мета */
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if ( !wp_verify_nonce( $_POST['ct_nonce'], plugin_basename( __FILE__ ) ) ) return;
    if( !current_user_can( 'edit_post' ) ) return;  
    $meta = array('ct_download_link', 'ct_list_url', 'ct_list_url2');
    foreach($meta as $dt) {     
        if($dt == 'ct_list_url2') {         
            $_POST[$dt] = get_blogspot_url($_POST[$dt]);
        }
        if(isset($_POST[$dt]) && $_POST[$dt] !== '') {
            update_post_meta($post->ID, $dt, $_POST[$dt]);
        } else {
            delete_post_meta($post->ID, $dt);   
        }       
    }   
}
?>
<?php
function ct_parent() { 
    global $post;
    if($_POST['ct_truyen'] && $_POST['ct_truyen'] != "") {
        //сохраняем или изменяем историю главы
        $ct_post = array();
        $ct_post['ID'] = $post->ID;
        $ct_post['post_parent'] = $_POST['ct_truyen'];  
        //изменяем время обновления истории
        $tr_post = array();
        $tr_post['ID'] = $_POST['ct_truyen'];   
        $tr_post['post_modified_gmt'] = current_time('mysql');
        $tr_post['post_modified'] = current_time('mysql',7);        
        remove_action('save_post','ct_parent');     
        remove_action('save_post','tr_parent'); 
        wp_update_post($ct_post);   
        wp_update_post($tr_post);   
        add_action('save_post','ct_parent');
    }
}   
?>
<?php //функция сохранения мета
function ct_meta_show() { ?>
    <?php
        global $post;
        $ct_download_link = get_post_meta($post->ID, 'ct_download_link', true) ? get_post_meta($post->ID, 'ct_download_link', true) : '';
        $ct_list_url = get_post_meta($post->ID, 'ct_list_url', true) ? get_post_meta($post->ID, 'ct_list_url', true) : '';
        $ct_list_url2 = get_post_meta($post->ID, 'ct_list_url2', true) ? get_post_meta($post->ID, 'ct_list_url2', true) : '';
    ?>
    <?php wp_nonce_field(plugin_basename(__FILE__), 'ct_nonce');  ?>    
    <table class="form-table">
    <tbody>    
        <tr>
            <th><label for="ct_download_link">Truyện</label><a class="add-chap-truyen" href="<?php echo admin_url('post-new.php?post_type=truyen'); ?>">thêm truyện</a></th>
            <td>
                <?php
                global $post;
                global $wpdb;
                $query = "SELECT ID, post_title FROM $wpdb->posts WHERE post_type="truyen" AND post_status="publish" ORDER BY post_title";
                $results = $wpdb->get_results($query, OBJECT);
                echo '<select name="ct_truyen" id="ct_truyen">';
                if(!$_GET['truyen_id'] || !get_the_title($_GET['truyen_id'])) {
                    echo '<option value = "">None</option>';
                    foreach ($results as $r) {
                        echo '<option value="', $r->ID, '"', $r->ID == $post->post_parent ? ' selected="selected"' : '', '>', $r->post_title, '</option>';
                    }
                } else {
                    foreach ($results as $r) {
                        echo '<option value="', $r->ID, '"', $r->ID == $_GET['truyen_id'] ? ' selected="selected"' : '', '>', $r->post_title, '</option>';
                    }
                }
                echo '</select>';
                ?>
            </td>
        </tr>

        <tr>
            <th><label for="ct_download_link">Địa chỉ tải chương</label></th>
            <td><input type="text" name="ct_download_link" class="regular-text" value="<?php echo $ct_download_link; ?>"/></td>
        </tr>

        <tr>
            <th><label for="ct_list_url">Địa chỉ ảnh đọc online</label></th>
            <td>
                <label for="ct_list_url">Địa chỉ ảnh 1</label>
                <p><textarea name="ct_list_url" rows="20" class="large-text code"><?php echo $ct_list_url; ?></textarea></p>
                <label for="ct_list_url2">Địa chỉ ảnh 2</label>
                <p><textarea name="ct_list_url2" rows="20" class="large-text code"><?php echo $ct_list_url2; ?></textarea></p>
            </td>
        </tr>        
    </tbody>
    </table>    
<?php } ?>
<?php
//авто заголовок главы
add_filter( 'default_title', 'ct_auto_title');
function ct_auto_title($title) {
    if($_GET['truyen_id'] && get_the_title($_GET['truyen_id'])) {
        $chap_number = get_number_chap($_GET['truyen_id']);
        $title = get_the_title($_GET['truyen_id']) . ' chương ' . ($chap_number+1);
        return $title;
    } else {
        return $title;
    }
}
function ct_remove_excess_columns( $columns ) {

    unset($columns['author']);
    unset($columns['comments']);
    unset($columns['wpseo-score']);
    unset($columns['wpseo-title']);
    unset($columns['wpseo-focuskw']);
    unset($columns['wpseo-metadesc']);  
    return $columns;    
}
add_filter( 'manage_edit-chap_columns' , 'ct_remove_excess_columns' );
?>

все в порядке, но когда я сохранял, функция get_blogspot_url($_POST[$dt])
не сработала из-за $_POST[$dt].

Когда я заменяю get_blogspot_url($_POST[$dt]) на,

get_blogspot_url('<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-sfO5YNlgW0Y/UFCaPberRcI/AAAAAAAAANM/1ccm6QRHxLM/s1600/0000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-sfO5YNlgW0Y/UFCaPberRcI/AAAAAAAAANM/1ccm6QRHxLM/s320/0000.png" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-a1bQNURFQU0/UFCaRm88fwI/AAAAAAAAANU/uDnHUsvNvS8/s1600/img000005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-a1bQNURFQU0/UFCaRm88fwI/AAAAAAAAANU/uDnHUsvNvS8/s320/img000005.png" width="199" /></a></div>
<br />')

это работает, так что я думаю, что у $_POST[$dt] есть проблема, можете помочь мне?

Вы можете скачать php файл: https://dl.dropbox.com/u/52812919/chap-meta.rar 🙁
Извините за мой плохой английский

Судя по всему, значение для ct_list_url2 не установлено, когда выполняется этот блок кода,

$meta = array('ct_download_link', 'ct_list_url', 'ct_list_url2');
foreach($meta as $dt) {     
    if($dt == 'ct_list_url2') {         
        $_POST[$dt] = get_blogspot_url($_POST[$dt]);
    }
    if(isset($_POST[$dt]) && $_POST[$dt] !== '') {
        update_post_meta($post->ID, $dt, $_POST[$dt]);
    } else {
        delete_post_meta($post->ID, $dt);   
    }
...

…на самом деле это касается любых значений внутри вашего массива $meta. Ваши переданные значения нигде не найдены, поэтому вам нужно передать их в вашу функцию.

Лучше попробуйте что-то вроде,

foreach($_POST as $key => $val) { 

    $url = get_blogspot_url($val);

    if(isset($key) && $val !== '') {

       update_post_meta($post->ID, $key, $url);

    } else {

       delete_post_meta($post->ID, $key); 

}

Вам нужно быть осторожным, потому что если какие-либо ваши отправленные переменные POST имеют $key, который возвращает пустое $val, то ваше условие else выполнится и удалит любые мета значения, хранящиеся для данного $key. Так что если в этом поле ранее было сохранено значение, оно будет удалено. Не уверен, является ли это вашей конечной целью?

Если вы хотите только обработать вашу переменную POST ct_list_url2 через вашу функцию get_blogspot_url, исключая другие $keys, тогда вы можете сделать что-то вроде,

foreach($_POST as $key => $val) { 

    if(isset($key) && $val !== '') {

        if($key == 'ct_list_url2') {

        $url = get_blogspot_url($val);
        update_post_meta($post->ID, $key, $url);

        } else {

        //использует $val вместо $url, чтобы не проходить через функцию get_blogspot_url()
        update_post_meta($post->ID, $key, $val); 

        } 

    } else {

       delete_post_meta($post->ID, $key); 

    }

}

Надеюсь, это поможет!

Просто измените эту строку:

if(isset($_POST[$dt]) && $_POST[$dt] !== '') {

на

if(!empty( $_POST[$dt])) {

Ответ или решение

Проблема с сохранением кастомного поста в WordPress: Не работает $_POST

Если у вас возникают проблемы с сохранением данных метаполей в кастомном посте, и вы обнаруживаете, что данные в $_POST не работают, это может быть вызвано несколькими причинами. Давайте разберёмся с вашими функциями и конкретной проблемой.

Общее описание кода

Вы используете хуки add_meta_boxes и save_post для добавления метаполей к кастомному типу поста и последующего их сохранения. В процессе сохранения вы проверяете значения, передаваемые через массив $_POST, и, если данные валидные, вы обновляете метаданные с помощью функции update_post_meta.

Основные проблемы и их решения

  1. Отсутствие данных в $_POST:
    Убедитесь, что значения, которые вы ожидаете в $_POST, действительно отправляются с формой. Вы можете сделать это, добавив временную отладку, например, вывести содержимое $_POST в лог:

    error_log(print_r($_POST, true));

    Это позволит увидеть, какие данные были отправлены при сохранении.

  2. Проблема с валидацией данных:
    Замените строку проверки значения:

    if(isset($_POST[$dt]) && $_POST[$dt] !== '')

    на

    if(!empty($_POST[$dt]))

    Это улучшит проверку: empty() вернёт true если переменная равна 0 или пустой строке, что поможет избежать ситуации, когда значения пропускаются только из-за пустой строки.

  3. Проблемы с использованием wp_verify_nonce:
    Убедитесь, что nonce передаётся и проверяется правильно. Например, если вы забыли добавить поле nonce в вашу форму метабокса, данные не пройдут проверку:

    wp_nonce_field(plugin_basename(__FILE__), 'ct_nonce');

    Убедитесь, что это поле включено и корректно передается вместе с остальными данными формы.

  4. Использование функции get_blogspot_url:
    Убедитесь, что функция получает ожидаемое значение из $_POST. Чтобы ваша функция get_blogspot_url($_POST[$dt]) работала корректно, проверьте, что значение действительно присутствует в $_POST на момент вызова:

    if ($dt === 'ct_list_url2' && !empty($_POST[$dt])) {
       $_POST[$dt] = get_blogspot_url($_POST[$dt]);
    }
  5. Исключение проблем с другими полями:
    Чтобы избежать удаления существующих значений в метаданных, обязательно добавьте условие, проверяющее существование данных перед их удалением:

    if (!empty($_POST[$dt])) {
       update_post_meta($post->ID, $dt, $_POST[$dt]);
    } else {
       if (get_post_meta($post->ID, $dt, true)) {
           delete_post_meta($post->ID, $dt);
       }
    }

Заключение

Следущие шаги помогут вам исправить проблему с $_POST и успешным сохранением метаполей в вашем кастомном посте в WordPress. Убедитесь в наличии значений в массиве $_POST, правильно используйте валидацию, и обратите внимание на контроль доступа с помощью wp_verify_nonce. Если вы выполните эти шаги, ваша функциональность должна заработать.

Если же проблема не исчезнет, воспользуйтесь отладкой и логированием, чтобы выявить другие потенциальные проблемы.

Оцените материал
Добавить комментарий

Капча загружается...