web-dev-qa-db-ja.com

類似の投稿タイトルを表示する(Stack Exchangeに類似)

私はStack Exchangeサイトがどのように投稿を処理するかがとても好きです。タイトルを入力し終えた後、それは同様のタイトルをリストアップするでしょう。私のWordPressインストールにどうやって似たようなものを実装できますか?

その理由は、うまくいけば、一番上に重複したタイトルが表示されるので、私が誤って古い投稿と同じタイトルの投稿を公開しないようにするためです。

5
Dan

これでほとんどの道が開かれますが、実際の検索は完璧ではありません。 $ wpdbについてもっと知っている人がより良い結果を得るのを手助けできれば素晴らしいでしょう。

これが私の元の投稿のタイトルである場合:SOPAは死んでいます、woot!

それから、 "SOPA"のタイトルだけでそれを見つけるでしょう、 "is dead"のタイトルではなく "Ding dong、witch is dead" 「または「SOPAは悪い考えです」。

ただし、基本的な前提は「タイトルの確認」にボタンが追加され、タイトルがjQueryで投稿され、現在の投稿を除いて一致するタイトルを返すためにAJAXで処理されることです。あなたがこれを持っていってより良い試合を返すようにそれを修正することができるならば、共有してください!

これが基本的なプラグインコードで、その後にduptitles.jsというファイルのプラグインフォルダに含まれるjQueryが続きます。

/*
Plugin Name: Duplicate Titles Check
Description: Prevent user's using similar post titles.
Version: 1.0
Author: 5t3ph
Author URI: http://stephscharf.me
*/

//jQuery to send AJAX request - only available on the post editing page
function dup_titles_enqueue_scripts( $hook ) {

    if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
        return;

    wp_enqueue_script( 
        'duptitles',
        plugins_url( '/duptitles.js', __FILE__ ),
        array( 'jquery' )
    );
}
add_action( 'admin_enqueue_scripts', 'dup_titles_enqueue_scripts', 2000 );


// Invoke baked-in WP ajax goodness
// Codex: http://codex.wordpress.org/AJAX_in_Plugins
add_action('wp_ajax_title_check', 'title_check_callback');

function title_check_callback() {

    function title_check() {

        $title = $_POST['post_title'];
        $post_id = $_POST['post_id'];

        global $wpdb;

        $sim_titles = "SELECT post_title 
                    FROM $wpdb->posts 
                    WHERE post_status = 'publish' AND post_type = 'post' 
                    AND post_title LIKE '%{$title}%' 
                    AND ID != {$post_id}";

        $sim_results = $wpdb->get_results($sim_titles);

        if($sim_results) {
            $titles = '<ul>';
            foreach ( $sim_results as $the_title ) 
            {
                $titles .= '<li>'.$the_title->post_title.'</li>';
            }
            $titles .= '</ul>';

            return $titles;
        } else {
            return '<p>This title is unique</p>';
        }
    }

    echo title_check();

    die();
}

duptitles.jsのjQueryを開始する

jQuery(document).ready(function($){
    // Post function
    function checkTitle(title, id) {
        var data = {
            action: 'title_check',
            post_title: title,
            post_id: id
        };

        //var ajaxurl = 'wp-admin/admin-ajax.php';
        $.post(ajaxurl, data, function(response) {
            $('#message').remove();
            $('#poststuff').prepend('<div id=\"message\" class=\"updated fade\"><p>'+response+'</p></div>');
        }); 
    };

    // Add button to "Check Titles" below title field in post editor
    $('#edit-slug-box').append('<span id="check-title-btn"><a class="button" href="#">Check Title</a></span>');

    // Click function to initiate post function
    $('#check-title-btn a').click(function() {
        var title = $('#title').val();
        var id = $('#post_ID').val();
        checkTitle(title, id);
    });

});
5
5t3ph