You can paginate your custom loop on a page created inside WordPress, the issue with your code is that your are using “page” parameter instead of “paged” parameter; the former is used to paginate a single post parts, while the later is used to paginate post archives or multiple posts.
So a paginated query on your page template should be something like that:
$args = array(
"category_name" => "Publishing",
"orderby" => "post_date",
"order" => "DESC",
"post_type" => "post",
"post_status" => "publish",
'paged' => get_query_var('paged'), // This is the correct parameter for pagination
);
$custom_query = new WP_Query($args);
if ( $custom_query->have_posts() ) :
while ( $custom_query->have_posts() ) : $custom_query->the_post();
echo '<h1>' . get_the_title() . '</h1>';
// The remaining of your code here
endwhile;
wp_pagenavi(array( 'query' => $custom_query ) );
wp_reset_postdata();
endif;
Also, I see in your code that you are using “$post” variable without being defined. If you are trying to access the current post in your custom loop, it is better to use the template tags — helper methods– e.g. get_the_ID(), get_the_title(),…etc those methods can access the global $post object by default without passing it as a parameter because you have already set it using $custom_query->the_post();