web-dev-qa-db-ja.com

カスタムポスト行アクション

この質問を書いているときに私は出会った この質問 。私はその質問に拡張する1つの質問があります。

私はあなたが私のアクションのための新しいURLを作成するためにget_delete_post_linkフィルタを使うことを考え出しました(あるいは同様の関数 - いずれにせよ、私はそれを最後にブール値を付けて使っています)。ただ1つだけです、今のイベントのキャプチャ方法がわかりません。投稿行アクションの例がGoogleに見つからないことを考えると、助けになれば幸いです。 : - /

public function _wp_filter_get_delete_post_link( $post_id, $deprecated, $force_delete = false )
{
    if ( ! empty( $deprecated ) )
    {
        _deprecated_argument( __FUNCTION__, '3.0.0' );
    }

    $post = &get_post( $post_id );      
    if ( ! $post ) return;

    if ( strcmp($post->post_type, "visitor") ) return;

    $post_type_object = get_post_type_object( $post->post_type );
    if ( !$post_type_object ) return;
    if ( !current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) return;
    // http://localhost/wordpress/wp-admin/post.php?post=163&action=trash&_wpnonce=a56abdcbb3

    $action = ( $force_delete ? 'logout' : 'login' );

    $delete_link = add_query_arg( 'action', $action, admin_url( sprintf( $post_type_object->_edit_link, $post->ID ) ) );

    return wp_nonce_url( $delete_link, "$action-{$post->post_type}_{$post->ID}" );
}

そして、あなたが私がそれをどのように使っているかに関するいくつかのより多くの情報を必要とするならば、ここにいくつかのより多くのコードがあります:

public function _wp_post_row_actions( $actions, $post )
{
    if ( $post->post_type == 'visitor' )
    {
        //unset( $actions['edit'] );
        unset( $actions['inline hide-if-no-js'] );
        unset( $actions['trash'] );
        unset( $actions['view'] );

        $state = get_post_meta( $post->ID, 'v_state', true ) === 'in';

        if ( $state )
        {
            $actions['trash'] = get_delete_post_link( $post->ID, '', true );    // Logout
            // get_delete_post_link
        }
        else
        {
            $actions['trash'] = get_delete_post_link( $post->ID );  // Login
        }
    }

    return $actions;
}

EDIT:さて、上記は完全ではありません。私は、それが実際には奇妙なリンクを生成しないことに気付きました。 だから、私が求めているのは、$actions['trash']リンクの代わりに "Logout/Login"リンクを追加することによって、私のカスタム投稿タイプに合わせて投稿行アクションをカスタマイズする方法があると思います。

2
Zack

主な問題は、$ actionsがリンクのアンカータグ全体を受け入れ、get_delete_post_link関数がURLだけを出力することです。

そのため、ラベル「Trash」を置き換えるだけの場合は、単純な関数でpost_row_actionsフィルタフックを使用できます。

このようなもの

    add_filter('post_row_actions','my_action_row')

    function my_action_row(){
       if ($post->post_type =="visitor"){
          //remove what you don't need
           unset( $actions['inline hide-if-no-js'] );
           unset( $actions['trash'] );
           unset( $actions['view'] );
           //check capabilites
           $post_type_object = get_post_type_object( $post->post_type );
           if ( !$post_type_object ) return;
           if ( !current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) return;

          //the get the meta and check
           $state = get_post_meta( $post->ID, 'v_state', true );
           if ($state == 'in'){
             $actions['trash'] = "<a class='submitdelete' title='" . esc_attr(__('Delete this item permanently')) . "' href='" . get_delete_post_link($post->ID, '', true) . "'>" . __('Logout') . "</a>";
           }else{
             $actions['trash'] = "<a class='submitdelete' title='" . esc_attr(__('Delete this item permanently')) . "' href='" . get_delete_post_link($post->ID, '', true) . "'>" . __('Login') . "</a>";


           }
       }
       return $actions;
    }

メタが "IN"の場合はログアウトし、それ以外の場合はログインしますが、両方のリンクで投稿が削除されます。投稿がすでにゴミ箱に入っているかどうかを確認するチェックを追加します。しかし、それは始まりであり、私はそれが役立つことを願っています。

6
Bainternet

あなたは以下のようにあなた自身の機能にリンクすることができます。私はpost idと共にurlパラメータを渡しています、そしてそのパラメータが設定されているかどうかを見て、それに基づいて関数を呼び出しています。カスタムのURLではなくログアウトのURLが必要な場合は、アンカーをこれで置き換えてみてください... <a href="<?php echo wp_logout_url( home_url() ); ?>" title="Logout">Logout</a>。明らかにあなたはその「ログアウト」リンクを見るためにログインしなければならないでしょう、それで私は向こうにログインリンクを置くことに意味を見ません!

add_action('post_row_actions', 'testing');
function testing( $actions, $post )
{
if ( $post->post_type == 'visitor' )
{
    //unset( $actions['edit'] );
    unset( $actions['inline hide-if-no-js'] );
    unset( $actions['trash'] );
    unset( $actions['view'] );

    //Adding a custom link and passing the post id with it
    $actions['customedit'] = '<a href=\''.admin_url('?action=test&post='.$post->ID).'\' target=\'blank\'>Test</a>';
}
return $actions;
}

//Now to get the 'test' argument, and triggering a function based on it...

if($_GET['action'] == 'test')
{
$post_to_print = $_GET['post'];
print_post($post_to_print);
}

function print_post($id)
{
$my_post = get_post($id);

echo "<pre>";
print_r($my_post);
echo "</pre>";
}

それがうまくいったかどうか私に知らせて!

ありがとう、Rutwick

0