如何在 wp_query

时间:2021-04-09 16:52:31

标签: javascript php wordpress

编辑-------- 问题解决了,代码见我下面的回复!

抱歉英语不好。 我正在对主题进行更改,以便能够从仪表板前端进行批量更改。 我已经设法通过简单的按钮、一个函数和一点点 JS 为单个帖子提供相同的功能。

现在我想批量做同样的事情,但如果在读取每个帖子的 ID 之前它是按钮,现在它必须是一个复选框,它必须作为一个 ID 数组返回给函数。

我做了一些测试,代码可以正常工作,但并不完全。

因为现在我可以执行操作,但只能针对单个帖子,即使我检查了所有帖子,它也只会对选中的第一个帖子执行操作。

我猜是php中的函数写错误,应该把propID值作为数组传给它,或者每个帖子都做一个foreach(笑)。但是我不太明白该怎么做,您有什么建议吗?

这是我的代码:

按钮:

 <button type="button" class="multi-on-hold btn btn-primary btn-sm">Premi</button>

复选框:

<input type="checkbox" class="multicheck_prop" name="multicheck_prop[]" value="<?php echo ($post->ID); ?>">

功能:

add_action( 'wp_ajax_multicheck_houzez_on_hold', 'multicheck_houzez_on_hold' );

if ( !function_exists( 'multicheck_houzez_on_hold' ) ) {
    function multicheck_houzez_on_hold() {

        if ( isset( $_POST['propID'] ) ) {

            global $wpdb;
            if (! isset( $_POST['propID'] ) ) {
                wp_die('No post to put on hold has been supplied!');
            }
            $post_id = absint( $_POST['propID'] );
            
            $post_status = get_post_status( $post_id );

            if($post_status == 'publish') { 
                $post = array(
                    'ID'            => $post_id,
                    'post_status'   => 'on_hold'
                );
            } elseif ($post_status == 'on_hold') {
                $post = array(
                    'ID'            => $post_id,
                    'post_status'   => 'publish'
                );
            }
            $post_id =  wp_update_post($post);
        }
            return true;
    }
}


js: 

    

            $('.multi-on-hold').on( 'click', function( e ) {
            e.preventDefault();
            var $this = $( this );
            var propid = $this.data( 'property' );
            var checkboxVals = $('.multicheck_prop');
    
            var vals = $('.multicheck_prop:checked').map(function(){return this.value;}).get().join(',')
    
            if(vals == "") {
                return;
            }
            
            $.ajax({
                
                url: ajax_url,
                data: {
                    'action': 'multicheck_houzez_on_hold',
                    'propID': vals,
                },
                method: 'POST',
                dataType: "JSON",
                
                beforeSend: function( ) {
                    //window.alert(vals)
                    houzez_processing_modal(processing_text);
                },
                success: function( response ) {
                    window.location.reload();
                },
                complete: function(){
                }
            });               
        });

3 个答案:

答案 0 :(得分:1)

由于您想向 PHP 发送许多 ID,您可以按照您指出的那样循环遍历它们。 这将支持一个或多个 ID:

vec_c

答案 1 :(得分:0)

问题在于您定义为数组的复选框名称 multicheck_prop[],因此您必须以数组的形式访问。检查下面的代码。

add_action( 'wp_ajax_multicheck_houzez_on_hold', 'multicheck_houzez_on_hold' );

if ( !function_exists( 'multicheck_houzez_on_hold' ) ) { 
    function multicheck_houzez_on_hold() {

        global $wpdb;

        if (! isset( $_POST['propID'] ) ) {
            wp_die('No post to put on hold has been supplied!');
        }

        if( !empty( $_POST['propID'] ) ){

            foreach ( (array) $_POST['propID'] as $key => $propID ) {
                
                $post_id = absint( $propID );
                
                $post_status = get_post_status( $post_id );

                if($post_status == 'publish') { 
                    $post = array(
                        'ID'            => $post_id,
                        'post_status'   => 'on_hold'
                    );
                } elseif ($post_status == 'on_hold') {
                    $post = array(
                        'ID'            => $post_id,
                        'post_status'   => 'publish'
                    );
                }
                $post_id =  wp_update_post($post);
            }
            wp_send_json_success();
        }

        wp_send_json_error();
    }
}

答案 2 :(得分:0)

问题已解决!我改了一段代码来识别数组中的'ID'并实现@Suver1的解决方案。

感谢您的建议!

这是我的工作代码:

$('.multi-on-hold').on( 'click', function( e ) {
            e.preventDefault();
            var $this = $( this );
            var propid = $this.data( 'property' );
            //var Nonce = $this.data('nonce');
    
            var checkboxVals = $('.multicheck_prop');
            //var vals = $('.multicheck_prop:checked').map(function(){return this.value;}).get().join(',')
            var vals = $('.multicheck_prop:checked').map(function(){return this.value;}).toArray();
    
            if(vals == "") {
                return;
            }
            
            $.ajax({
                
                url: ajax_url,
                data: {
                    'action': 'multicheck_houzez_on_hold',
                    'propID': vals,
                },
                method: 'POST',
                dataType: "JSON",
                
                beforeSend: function( ) {
                    //window.alert(vals), // See the value of any ID
                    houzez_processing_modal(processing_text);
                },
                 success: function( response ) {
                    window.location.reload();
                },
                complete: function(){
                }
            });
               
        });
if ( !function_exists( 'multicheck_houzez_on_hold' ) ) {
    function multicheck_houzez_on_hold() {
        if ( isset( $_POST['propID'] ) ) {
        global $wpdb;
        if (! isset( $_POST['propID'] ) ) {
            wp_die('No post to put on hold has been supplied!');
        }
            // convert propID to array if it isnt -- Thanks to Suver1
            $post_ids = !is_array($_POST['propID']) ? [$_POST['propID']] : $_POST['propID'];
            foreach ($post_ids as $post_id)  {
                $post_status = get_post_status( $post_id );
                if($post_status == 'publish') { 
                    $post = array(
                        'ID'            => $post_id,
                        'post_status'   => 'on_hold'
                    );
                } elseif ($post_status == 'on_hold') {
                    $post = array(
                        'ID'            => $post_id,
                        'post_status'   => 'publish'
                    );
                }
                $post_id =  wp_update_post($post);
            } // End foreach
        } // End IF
        return true;
    } // End this function
} // End function exists

相关问题