投稿タイトルのリストからのオートコンプリートまたは自動提案


13

(検索)フォームでオートコンプリートまたはオートサジェスト機能を使用したい:

ユーザーが入力を開始すると、一致するテキストを持つ投稿タイトルが提案されます。

また、各カスタム投稿に関連して保存したメタデータ(数値)を表示したいです。例:

「A」と入力すると、「Apples(13)、Aardvarks(51)、Astronauts(21)」などが提案されます。


メタフィールドの名前は何ですか?メタフィールドを追加した方法を正確に示すコードを追加してください。ありがとう。
カイザー

私は、メタフィールドが(メタボックス添加による)、特に追加のポストメタフィールドであるという仮定、またはget_post_metaでアクセスできるカスタムポストVAR、(IIRC)作った
バリーカーライオン

実際にはまだメタフィールドを追加していません。
マークテン

回答:


17

はい、これは可能です。

WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_scriptに含まれているjQuery Auto Suggestを使用できます。

これにより、Ajax URLハンドラーに対してAjaxルックアップを行うフォームを作成できます。add_actionに追加できます。http://codex.wordpress.org/AJAX_in_Plugins

したがって、ajaxルックアップを実行し、アクション側でget_postsを実行してタイトルに一致させるか、生のSQLクエリを実行できます。そして、必要なものを返します。

時間の余裕があれば、完全なコードソリューションを作成できます。しかし、その大部分はルックアップを強化するためのプラグイン全体です。

編集:ここに行きます、このようなことはそれを行うべきです、私の頭の上からそれを書いただけではテストしていません。更新:入力されたテキストをエスケープし、カスタム投稿タイプおよび公開された投稿のみに絞り込みます

2012-11-21編集:コードサンプルのタイプミスを更新。

add_action('wp_enqueue_scripts', 'se_wp_enqueue_scripts');
function se_wp_enqueue_scripts() {
    wp_enqueue_script('suggest');
}

add_action('wp_head', 'se_wp_head');
function se_wp_head() {
?>
<script type="text/javascript">
    var se_ajax_url = '<?php echo admin_url('admin-ajax.php'); ?>';

    jQuery(document).ready(function() {
        jQuery('#se_search_element_id').suggest(se_ajax_url + '?action=se_lookup');
    });
</script>
<?php
}

add_action('wp_ajax_se_lookup', 'se_lookup');
add_action('wp_ajax_nopriv_se_lookup', 'se_lookup');

function se_lookup() {
    global $wpdb;

    $search = like_escape($_REQUEST['q']);

    $query = 'SELECT ID,post_title FROM ' . $wpdb->posts . '
        WHERE post_title LIKE \'' . $search . '%\'
        AND post_type = \'post_type_name\'
        AND post_status = \'publish\'
        ORDER BY post_title ASC';
    foreach ($wpdb->get_results($query) as $row) {
        $post_title = $row->post_title;
        $id = $row->ID;

        $meta = get_post_meta($id, 'YOUR_METANAME', TRUE);

        echo $post_title . ' (' . $meta . ')' . "\n";
    }
    die();
}

バリー、ありがとう!私はそれに旋回を与えます、これはfunctions.phpに入りますか?必要な部分を変更し、それが与えるものを確認します
-marctain

2
理論的にはyes、functions.phpに。邪魔にならないように、プラグインに入れます。functions.phpに直接進む場合、いくつかの最適化を行うことができます。したがって、このコードの一部は、functionsphpに既に存在する関数に適用できます(もちろんテーマに依存します)
Barry Carlyon

動作します..ほとんど!カスタムポストタイプのものにすることを指定する必要がありました。質問を編集します
-marctain

like_escapeを含めるように更新されました。彼は、最初の文字で投稿タイトルが始まる場所を検索したいので、最初は%を使用していません。グローバルマッチではありません。私の作業コードは、jQueryサジェストにオプションが適用されていない$ _REQUEST ['q']を使用しています。Qは、検索エンジンが使用するものをエミュレートします。
バリーカーリヨン

@BarryCarlyonすべての小さなものを編集しないでください。10回編集すると、自動的に「コミュニティwiki」に変換され、すべての担当ポイントが失われます。そして、より多くのユーザーが必要です。適切な回答を追加し、最小値を取得しました。ああなど、ウィキを追加、編集、などの作業を行うに評判のexit;いつもより速いですdie();:)
カイザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.