Вопрос или проблема
Я хочу задать вопрос: у меня есть исходный код, он работает только для нового поста, но не для редактирования поста. Так как же отключить кнопку “Опубликовать” при редактировании поста, если заголовок поста существует?
add_action('wp_ajax_check-posts-by-title', function(){
$title = isset( $_REQUEST['title'] ) ? esc_attr( $_REQUEST['title'] ) : null;
// проверьте заголовок
if ( !$title ) {
return wp_send_json(array(
'enable_btn' => false,
'message' => 'Заголовок не указан!'
));
}
$post = get_page_by_title($title, OBJECT, 'post');
// проверьте пост
if ( isset($post->ID) && 'publish' === $post->post_status ) {
return wp_send_json(array(
'enable_btn' => false
));
}
// ничего не поймано
return wp_send_json(array(
'enable_btn' => true
));
// убить ответ
wp_die();
});
add_action('admin_footer', function() {
global $pagenow;
if ( !$pagenow || !in_array($pagenow, array( 'post-new.php' )) )
return; // добавляйте только при написании/редактировании постов
?>
<script>
jQuery(document).ready(function($){
$(document).on("change", "#titlediv #title", function(e){
var i = $(this)
, f = i.closest('form')
, t = i.val()
, b = $('input[name="publish"]', f).first();
if ( self.xhr ) {
self.xhr.abort();
} else {
var xhr;
}
if ( !b.length ) return;
b.attr('disabled','disabled');
if ( $.trim( t ) ) {
self.xhr = $.ajax({type: 'post', url: 'admin-ajax.php', data: {
action: 'check-posts-by-title',
title: t
}, success: function(res){
if ( res && res.enable_btn ) {
b.removeAttr('disabled');
} else {
if ( res.message ) {
alert(res.message);
}
}
}, error: function(){
i.trigger('change'); // возврат
}});
}
});
$('#titlediv #title').trigger('change');
});
</script>
<?php
});
Спасибо! <3
Вы можете добиться этого, добавив post.php в вашу условную проверку перед добавлением вашего скрипта.
ПРИМЕЧАНИЕ: Это может эффективно отключить возможность обновления постов.
add_action('admin_footer', function() {
global $pagenow;
if ( !$pagenow || !in_array($pagenow, array( 'post-new.php', 'post.php' )) )
return; // добавляйте только при написании/редактировании постов
?>
<script>
jQuery(document).ready(function($){
$(document).on("change", "#titlediv #title", function(e){
var i = $(this)
, f = i.closest('form')
, t = i.val()
, b = $('input[name="publish"]', f).first();
if ( self.xhr ) {
self.xhr.abort();
} else {
var xhr;
}
if ( !b.length ) return;
b.attr('disabled','disabled');
if ( $.trim( t ) ) {
self.xhr = $.ajax({type: 'post', url: 'admin-ajax.php', data: {
action: 'check-posts-by-title',
title: t
}, success: function(res){
if ( res && res.enable_btn ) {
b.removeAttr('disabled');
} else {
if ( res.message ) {
alert(res.message);
}
}
}, error: function(){
i.trigger('change'); // возврат
}});
}
});
$('#titlediv #title').trigger('change');
});
</script>
<?php
});
Если я правильно понял, вы хотите скрыть кнопку “Опубликовать”, когда заголовок не пустой:
add_action('admin_head', 'hide_publish_button');
function hide_publish_button() {
global $post;
if(empty($post->post_title) {
return;
}
?>
<script type="text/javascript">
window.onload = function() {
document.getElementById('publish').disabled = true;
}
</script>
<?php
}
Ответ или решение
Чтобы отключить кнопку "Опубликовать" в редакторе постов WordPress, если заголовок поста уже существует, можно использовать комбинацию PHP и JavaScript. Рассмотрим подробное и структурированное решение этой задачи.
Шаг 1: Подключение AJAX для проверки существующего заголовка
Сначала создадим функцию, которая будет обрабатывать AJAX-запросы для проверки, существует ли уже пост с данным заголовком. Добавьте следующий код в файл вашей темы functions.php
:
add_action('wp_ajax_check-posts-by-title', function() {
$title = isset($_REQUEST['title']) ? esc_attr($_REQUEST['title']) : null;
// Проверяем наличие заголовка
if (!$title) {
return wp_send_json(array(
'enable_btn' => false,
'message' => 'Заголовок не указан!'
));
}
// Ищем пост по заголовку
$post = get_page_by_title($title, OBJECT, 'post');
// Проверяем наличие поста
if (isset($post->ID) && 'publish' === $post->post_status) {
return wp_send_json(array(
'enable_btn' => false
));
}
// Если поста нет, разрешаем публикацию
return wp_send_json(array(
'enable_btn' => true
));
// Завершаем выполнение
wp_die();
});
Шаг 2: Добавление JavaScript для управления кнопкой "Опубликовать"
Теперь добавим JavaScript, который будет слушать изменения в поле заголовка поста и отключать кнопку "Опубликовать", если заголовок уже существует. Добавьте следующий код в файл functions.php
, под предыдущим:
add_action('admin_footer', function() {
global $pagenow;
// Проверяем, находимся ли мы на странице редактирования поста
if (!$pagenow || !in_array($pagenow, array('post.php', 'post-new.php'))) {
return;
}
?>
<script>
jQuery(document).ready(function($) {
$(document).on("change", "#titlediv #title", function() {
var titleInput = $(this),
form = titleInput.closest('form'),
title = titleInput.val(),
publishButton = $('input[name="publish"]', form).first();
// Отключаем кнопку "Опубликовать" по умолчанию
publishButton.attr('disabled', 'disabled');
if ($.trim(title)) {
$.ajax({
type: 'post',
url: 'admin-ajax.php',
data: {
action: 'check-posts-by-title',
title: title
},
success: function(res) {
if (res && res.enable_btn) {
publishButton.removeAttr('disabled');
} else {
publishButton.attr('disabled', 'disabled');
if (res.message) {
alert(res.message);
}
}
},
error: function() {
titleInput.trigger('change');
}
});
}
});
// Запускаем первоначальную проверку
$('#titlediv #title').trigger('change');
});
</script>
<?php
});
Шаг 3: Тестирование и отладка
После добавления данного кода в ваш файл functions.php
, протестируйте функциональность на страницах редактирования постов. Убедитесь, что при вводе заголовка, который уже существует, кнопка "Опубликовать" отключается.
Заключение
Это решение позволит вам эффективно отключить кнопку "Опубликовать" на страницах редактирования постов, если заголовок уже существует. Убедитесь, что вы сделали резервную копию вашего кода перед изменениями, чтобы избежать возможных проблем. Таким образом, пользователи вашего сайта будут защищены от возможности публикации постов с повторяющимися заголовками, что поможет сохранить уникальность контента.