web-dev-qa-db-fra.com

Afficher les titres de publications similaires (similaires à Stack Exchange)

J'aime beaucoup la façon dont les sites Stack Exchange gèrent les publications. Après avoir saisi le titre, les titres similaires sont répertoriés. Comment puis-je implémenter quelque chose de similaire sur mon installation WordPress?

La raison en est que j'espère que les titres en double seront affichés en haut, de sorte que je ne publie pas par inadvertance une publication portant le même titre qu'une publication plus ancienne.

5
Dan

Cela vous mènera la plupart du temps, mais la recherche réelle n'est pas parfaite. Ce serait formidable si quelqu'un qui en sait plus sur $ wpdb peut aider à obtenir un meilleur résultat.

S'il s'agit du titre de mon message d'origine: SOPA est mort, woot!

Alors juste un titre de "SOPA" le trouvera, tout comme un titre de "est mort" mais pas "Ding dong, la sorcière est morte "ou" SOPA est une mauvaise idée ".

Cependant, le principe de base est qu'un bouton est ajouté à "Vérifier le titre" et que lorsque vous appuyez dessus, le titre est publié avec jQuery et géré via AJAX pour renvoyer les titres correspondants, à l'exclusion du message actuel. Si vous êtes capable de prendre cela et de le modifier pour obtenir de meilleurs résultats, partagez-le!

Voici le code de base du plugin, suivi du jQuery qui devrait être inclus dans votre dossier de plugins dans un fichier appelé duptitles.js

/*
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();
}

Commencez jQuery pour duptitles.js

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