Вопрос или проблема
У меня есть этот код.
<?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
.
Основные проблемы и их решения
-
Отсутствие данных в
$_POST
:
Убедитесь, что значения, которые вы ожидаете в$_POST
, действительно отправляются с формой. Вы можете сделать это, добавив временную отладку, например, вывести содержимое$_POST
в лог:error_log(print_r($_POST, true));
Это позволит увидеть, какие данные были отправлены при сохранении.
-
Проблема с валидацией данных:
Замените строку проверки значения:if(isset($_POST[$dt]) && $_POST[$dt] !== '')
на
if(!empty($_POST[$dt]))
Это улучшит проверку:
empty()
вернётtrue
если переменная равна0
или пустой строке, что поможет избежать ситуации, когда значения пропускаются только из-за пустой строки. -
Проблемы с использованием
wp_verify_nonce
:
Убедитесь, что nonce передаётся и проверяется правильно. Например, если вы забыли добавить поле nonce в вашу форму метабокса, данные не пройдут проверку:wp_nonce_field(plugin_basename(__FILE__), 'ct_nonce');
Убедитесь, что это поле включено и корректно передается вместе с остальными данными формы.
-
Использование функции
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]); }
-
Исключение проблем с другими полями:
Чтобы избежать удаления существующих значений в метаданных, обязательно добавьте условие, проверяющее существование данных перед их удалением: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
. Если вы выполните эти шаги, ваша функциональность должна заработать.
Если же проблема не исчезнет, воспользуйтесь отладкой и логированием, чтобы выявить другие потенциальные проблемы.