web-dev-qa-db-ja.com

投稿やページからテキストの選択を隠すためのショートコードを作るにはどうすればいいですか?

次の例のように、新しいクイックタグを追加するショートコードまたはプラグインがあります。

[hidemytext]いくつかの隠しテキスト[/ hidemytext]

そしてそれらのタグの内側のテキストは投稿やページから隠されています。

ありがとうございます

3
user25236

簡単な答え:

add_shortcode( 'hidemytext', '__return_false' );

しかし、ショートコードをそのように使用してはいけません。そのショートコードのプラグインやテーマがオフになったときに何が起こるか想像してみてください:誰もが今コンテンツを見ることができます。これはあまりユーザーフレンドリーではありません。

そのため、ロジックを切り替えます。デフォルトでは何も表示しない、または短いショートコードタグを表示し、ショートコードハンドラがアクティブな場合にのみコンテンツを表示します。隠しコンテンツを単純なメタボックスに格納します。

enter image description here

そのためには、エディタを使ってメタボックスを追加し、ショートコードごとにその内容を表示します。

add_shortcode( 'extra',  't5_extra_content' );
add_action( 'add_meta_boxes_post', 't5_register_extra_metabox' );
add_action( 'save_post', 't5_save_shortcode_box', 10, 2);

function t5_extra_content( $attributes, $content = '' )
{
    $args = shortcode_atts( array ( 'cap' => 'edit_posts' ), $attributes );

    if ( current_user_can( $args['cap'] ) )
        return wpautop(
            get_post_meta( get_the_ID(), '_t5_extra_box', TRUE )
            . $content
        );
}

function t5_register_extra_metabox()
{
    add_meta_box(
        't5_extra',
        'Extra',
        't5_extra_metabox_callback',
        NULL, // screen
        'normal',
        'default'
    );
}
function t5_extra_metabox_callback( $post )
{
    $nonce = wp_create_nonce( __FILE__ );
    echo "<input type='hidden' name='t5_extra_box_nonce' value='$nonce' />";
    $content = get_post_meta($post->ID, '_t5_extra_box', TRUE );
    wp_editor(
        $content,
        '_t5_extra_box',
        array (
            'textarea_rows' => 10,
            'media_buttons' => FALSE,
            'teeny'         => TRUE,
            'tinymce'       => TRUE
        )
    );
}
function t5_save_shortcode_box( $post_id )
{
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE
        or ! isset ( $_POST['post_type'] )
        or 'post' !== $_POST['post_type']
        or ! current_user_can( 'edit_post', $post_id )
        or ! wp_verify_nonce( $_POST[ 't5_extra_box_nonce' ], __FILE__ )
    )
    {
        return;
    }

    if ( isset ( $_POST['_t5_extra_box'] ) )
        update_post_meta( $post_id, '_t5_extra_box', $_POST['_t5_extra_box'] );
    else
        delete_post_meta( $post_id, '_t5_extra_box' );
}
6
fuxia

これは Codex の例から解決できるはずです。

function hide_text( $atts,$content) {
  return ''; // returns nothing
  // or
  return '<!-- '.$content.' -->'; // returns an html commented version of your text
}
add_shortcode( 'hidemytext', 'hide_text' );
1
s_ha_dum

あなたはフィルタフックを設定し、すべての投稿内容をフィルタすることができます。フックされた関数は、デフォルトの "許可され​​ていない"タイプのコンテンツを返すか、訪問者が許可を持っている場合は、実際の投稿コンテンツを返します。

私はTwitchPressにこのアプローチを使うかもしれないがそれをさらに一歩進めて何かを実装しようとしています。私は特定のブロックを検出し(基本的にブロックのタグ/ htmlを検出し)、そのブロックの後のすべてのコンテンツを隠します。これにより、投稿をオーサリングするときにある程度の柔軟性が得られます。

ブロックを使ったアプローチは、あなた自身の考えと大差ありません。このブロックでは、[hide]などを入力する代わりに、すべてドラッグアンドドロップするだけです。どちらのアプローチでも、投稿コンテンツはフィルタリングを必要とします。投稿全体を制限し、許可されていないユーザーをWordPressの初期化時に行われる標準の "許可され​​ていない"ページにリダイレクトするのではなく、余分な処理が心配です。

だから多くのアプローチがあります。パフォーマンスと柔軟性はそれぞれ異なります。私はそれらすべてをTwitchPressで実装するつもりです。

0
Ryan Bayne