如何在发布之前检查是否使用了相同的POST插件?

时间:2011-10-16 作者:Pierre

对于独立摇滚议程,我创建了活动帖子。在javascript的帮助下,在发布或更新帖子时,自定义字段值(在选择框中选择的标注栏、地点和日期信息)将被复制为帖子标题。还有一个自定义函数,它可以在每次标题更改时更新slug。问题:如果其他用户创建了一篇新的帖子,并选择了完全相同的自定义字段值,则会创建一篇具有完全相同slug的其他帖子。如果创建了两个具有相同slug的帖子,这两个帖子都会导致404错误页面,直到其中一个被手动删除。我的问题是:有没有一种方法可以“验证”post slug,并将其与数据库中较旧的帖子进行比较?谢谢你的帮助!

4 个回复
SO网友:Volpeo

The Ajax way (有点脏,但你可以很容易地增强它)

在您的功能中。php(或插件中,或其他任何地方):

function my_ajax_update(){
    if (isset($_POST[\'title\'])){
        global $wpdb;
        $title = esc_sql($_POST[\'title\']);
        if(!$title) return;
        $page = $wpdb->get_results("
            SELECT *
            FROM $wpdb->posts
            WHERE post_title LIKE \'$title\'
            AND post_type = \'event\'
            AND post_status = \'publish\'
            LIMIT 1
        ");
        if ($page) echo "This title already exists !";
    }
}
add_action("wp_ajax_check_double_post", "my_ajax_update");
以及元数据库模板中的某个位置(或通过操作加载):

jQuery(document).ready(function($){
    var the_title = $(\'#title\').val();
    $(\'#publish\').click(function(e){
        e.preventDefault();
        $.post(
            ajaxurl,
            {
                action:"check_double_post",
                title: the_title
            },
            function(data){
                if ((data) != 0) {
                    message = $(\'<div id="message" class="error below-h2" />\').html(\'<p>Warning, this title already exists!</p>\')
                    $(\'h2\').after(message);
                    $(\'#ajax-loading\').hide();
                    $(\'#publish\').removeClass(\'button-primary-disabled\');
                }
                else {
                    $(this).submit();
                }
            }
        );
    });
});

SO网友:soulseekah

你会惊讶于这一点有多么棘手。我最接近的是save_post 行动似乎没有可以挂接的操作可以阻止帖子保存,所有操作update_post()write_post() 不允许任何直接干扰;因此,我想出的一个简单而快速的选择就是在钩子里死。即便如此,这篇文章还是用了重复的名字保存了下来,不管我们是如何死去的。

function check_post_title( $pid ) {
    $post = get_post( $pid );
    $events = get_posts( \'s=\'.$post->post_title.\'&post_type=event\' );

    foreach( (array)$events as $event ) {
        if ( $event->ID == $post->ID ) continue;
        if ( $event->post_title == $post->post_title ) die(\'Oh noes! A post with this title already exits, go back and change it, please.\');
    }
}

add_action( \'save_post\', \'check_post_title\' );
Thesave_post 操作为挂钩提供保存的帖子的帖子ID。然后使用\'s\'参数搜索事件,就像在页面上使用常规WordPress搜索一样。然后遍历事件,如果发现ID不是checked-on-post的post的标题与该checked-on-post匹配,则该post将终止。

在发布帖子时,一些更有用、更精简的内容会涉及到一条自定义消息。

function check_post_title( $pid ) {
    $post = get_post( $pid );
    $events = get_posts( \'s=\'.$post->post_title.\'&post_type=event\' );

    foreach( (array)$events as $event ) {
        if ( $event->ID == $post->ID ) continue;
        if ( $event->post_title == $post->post_title ) {
            add_filter( \'redirect_post_location\', \'event_exists\' );
        }
    }
}

/* Alter the message */
function event_exists( $redirect_url ) {
    $messages = array( \'message=1\', \'message=2\' );
    return str_replace( $messages, \'message=100\', $redirect_url );
}

/* Add a custom event message */
function custom_event_message( $messages ) {
    $messages[\'post\'][\'100\'] = \'Oh noes! An event with this name already exists, so go ahead and pick another.\';
    return $messages;
}

add_filter( \'post_updated_messages\', \'custom_event_message\' );

add_action( \'save_post\', \'check_post_title\' );
这是一个快速的解决方案,更复杂的事情可能会要求刚刚违反无重复标题规则的保存帖子必须修改标题并由函数重新保存,将其转换为类似“重复![此处的标题]”并将帖子状态更改回“待定”。

黄色的信息似乎很微妙,出版商可能没有注意到,死亡似乎更吸引人。

希望这有帮助,不要让你太困惑。这个问题可能有更好的解决方案,希望有人能来帮助我们改进解决方案。此时,任何想法都将受到赞赏。

SO网友:Rahe

为什么不使用函数post\\u exists(),而不是自己进行查询?它采用post\\u标题、内容和日期(可选)。此函数不测试post\\u类型,但内容上很少有相同的post\\u标题。

你好Rahe。

SO网友:T.Todua

find if POST Slug already exists:

$title = \'mytitlee\';

global $wpdb;
$id_ofpost_name = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = \'$title\'");
$id_ofpost_title = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = \'$title\'");
if ($id_ofpost_name || $id_ofpost_title) {echo \'Existssss!\';} 
结束

相关推荐

Add title="" to A PHP Code

我正在使用代码调用WP缩略图,并希望添加一个title=”标记。我希望标题调用\\u标题。。。我该怎么做?我想为图片指定标题,而不是链接。我的代码:<?php if ( has_post_thumbnail() ) { the_post_thumbnail( \'thmb-archive\' ); } ?>