Como posso usar a funcionalidade incorporada no "link de navegação" do Wordpress?

9

Estou codificando um widget e gostaria que o usuário pudesse escolher um link como você pode ao editar postagens ou páginas regulares (quando você clica no pequeno ícone do link e obtém a funcionalidade de pesquisa AJAX no pop-up ) Alguém sabe como eu faço isso funcionar? Eu tenho um botão HTML ao qual gostaria de anexar e clicar, e um campo para o valor digitado.

No class-wp-editor.php, encontrei algumas coisas interessantes e me perguntei se poderia precisar desses arquivos ..?

wp_enqueue_script('wp-fullscreen');
wp_enqueue_script('wplink');

Na chamada fullscreen.link();, como o arquivo mencionado acima, recebo este erro:

Uncaught ReferenceError: wpActiveEditor is not defined

..e estou perplexo por enquanto, porque o JS que faz referência a essa variável parece louco para mim.

Importa-se de me apontar na direção certa? Eu adoraria fazer isso funcionar, ele criará uma interface de usuário matadora para meus widgets!

insira a descrição da imagem aqui

------editar-------

Até agora, não há muito código, além das inclusões de script que afirmei anteriormente;

<label for="<?php echo $this->get_field_name('link'); ?>">Link URL (including http://) : </label>
<input type="text" id="<?php echo $this->get_field_id('link'); ?>" name="<?php echo $this->get_field_name('link'); ?>" value="<?php if(isset($link)) echo esc_attr($link); ?>" class="widefat" />
<button class="secondary" id="choose_link">Link Browser</button>

..a parte do JS que deve acionar o script de link para abrir;

linkBrowserButton.on("click", function(e){
    e.preventDefault();
    fullscreen.link();
});
Dan
fonte
3
Faça uma captura de tela ou um GIF animado (o LiceCap é uma ferramenta agradável e gratuita) do que você deseja fazer. Difícil de imaginar até agora. E faça uma edição e não um comentário. Obrigado.
perfil completo
@kaiser - Ok, pronto. Você verá a funcionalidade que eu estou procurando agora. PS - adoro o LICEcap, obrigado pela dica!
21413 Dan
Bem, então, mostre-nos o seu código do widget (a parte que cria o conteúdo). Você usou wp_editor()?
perfil completo de kaiser
@ kaiser - algum código extra adicionado. Não muito até agora, mas eu não esperava fazer nada além de anexar um evento e incluir o script (talvez modificar onde o resultado é atualizado), mas até agora não consigo abrir o pop-up.
21413 Dan
11
Infelizmente, o seletor de links foi escrito especificamente para o editor TinyMCE. Estou trabalhando em uma versão que fica sozinha e tem cerca de 80% lá. É basicamente uma reescrita do seletor de links sem as dependências do TinyMCE.
hereswhatidid

Respostas:

2

Invoco o diálogo de link dentro da classe metabox que uso para o desenvolvimento. É um pouco hacky, mas pode ser feito, até que algo mais robusto seja desenvolvido.

Você pode chamar a caixa de link primeiro enfileirando os js necessários e, em seguida, interagindo com os métodos de arquivos wp-link js.

Certifique-se de ter enfileirado o wp-link

1 / wp_enqueue_script( 'wp-link' );

2 / Configure sua interface do usuário. Normalmente, uso um botão para chamar o diálogo de link e um campo de texto para manipular o URL dos links.

3 / Chamar diálogo de link

var _link_sideload = false; //used to track whether or not the link dialogue actually existed on this page, ie was wp_editor invoked.

var link_btn = (function($){
'use strict';
var _link_sideload = false; //used to track whether or not the link dialogue actually existed on this page, ie was wp_editor invoked.

/* PRIVATE METHODS
-------------------------------------------------------------- */
//add event listeners

function _init() {
    $('body').on('click', '.lm-link-button', function(event) {
        _addLinkListeners();
        _link_sideload = false;

        var link_val_container = $('#your_input_field');

        if ( typeof wpActiveEditor != 'undefined') {
            wpLink.open();
            wpLink.textarea = $(link_val_container);
        } else {
            window.wpActiveEditor = true;
            _link_sideload = true;
            wpLink.open();
            wpLink.textarea = $(link_val_container);
        }
        return false;
    });

}

/* LINK EDITOR EVENT HACKS
-------------------------------------------------------------- */
function _addLinkListeners() {
    $('body').on('click', '#wp-link-submit', function(event) {
        var linkAtts = wpLink.getAttrs();
        var link_val_container = $('#your_input_field');
        link_val_container.val(linkAtts.href);
        _removeLinkListeners();
        return false;
    });

    $('body').on('click', '#wp-link-cancel', function(event) {
        _removeLinkListeners();
        return false;
    });
}

function _removeLinkListeners() {
    if(_link_sideload){
        if ( typeof wpActiveEditor != 'undefined') {
            wpActiveEditor = undefined;
        }
    }

    wpLink.close();
    wpLink.textarea = $('html');//focus on document

    $('body').off('click', '#wp-link-submit');
    $('body').off('click', '#wp-link-cancel');
}

/* PUBLIC ACCESSOR METHODS
-------------------------------------------------------------- */
return {
    init:       _init,
};

})(jQuery);


// Initialise
jQuery(document).ready(function($){
 'use strict';
 link_btn.init();
});

4 // enfileirar scripts. Adicione o seguinte ao seu arquivo functions.php e ajuste os nomes / caminhos dos arquivos para adequá-los.

function linkbtn_enqueue() {
    //register script
    wp_register_script('link_btn',get_template_directory_uri() . '/js/link_btn.js', array('jquery'), '1.0', true);
    //now load it
    wp_enqueue_script( 'link_btn');
}

 add_action( 'admin_enqueue_scripts', 'linkbtn_enqueue' );

Deveria fazê-lo. Eu uso a mesma abordagem na minha classe metabox e parece funcionar bem.

Dale Sattler
fonte
Obrigado pelo post Dale - isso parece muito interessante. Eu cheguei ao ponto de apertar o botão antes e chamar o script wp-link, mas não sabia como fazê-lo depois disso. Vou tentar aprender um pouco mais de JS / AJAX durante a próxima semana entre projetos e dar uma chance a isso. Muito Obrigado.
Dan
Você só precisa enfileirar um arquivo .js no lado administrativo do seu tema. Vou editar o acima para refletir isso.
Dale Sattler
0

RE: "Como você faria isso (aproximadamente?)"

Primeiro, eu construí-lo de forma semelhante à funcionalidade do link no WordPress: um campo de texto de entrada, resultados, selecione a funcionalidade e o botão enviar (adicionar link).

Ajax - isso é acionado quando o texto é inserido na entrada, retornando um conjunto de resultados com base no termo da pesquisa. Veja o que fizemos com o nosso plugin de pesquisa rápida , WP Jarvis. Você só precisa configurar a chamada ajax para atingir o ajaxurl (admin-ajax.php) e definir um gancho de ação no seu php para executar a consulta e repetir os resultados no formato json. Você deseja que os resultados incluam título, pós-tipo e link permanente para cada resultado. Leia mais sobre o ajax em plugins .

Por fim, a seleção do resultado no qual você deseja obter o link permanente do objeto json e inserir no campo do widget.

Sei que essa não é uma resposta completa, mas espero que ajude.

MikeNGarrett
fonte